mirror of https://github.com/grpc/grpc-java.git
Handle Headers and Trailers in OkHttp client transport.
------------- Created by MOE: http://code.google.com/p/moe-java MOE_MIGRATED_REVID=78313233
This commit is contained in:
parent
8b4ecad497
commit
988f219b04
|
|
@ -233,12 +233,13 @@ public class OkHttpClientTransport extends AbstractClientTransport {
|
|||
*
|
||||
* <p> Return false if the stream has already finished.
|
||||
*/
|
||||
private boolean finishStream(int streamId, Status status) {
|
||||
private boolean finishStream(int streamId, @Nullable Status status) {
|
||||
OkHttpClientStream stream;
|
||||
stream = streams.remove(streamId);
|
||||
if (stream != null) {
|
||||
// This is mainly for failed streams, for successfully finished streams, it's a no-op.
|
||||
stream.setStatus(status, new Metadata.Trailers());
|
||||
if (status != null) {
|
||||
stream.setStatus(status, new Metadata.Trailers());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
|
@ -340,16 +341,13 @@ public class OkHttpClientTransport extends AbstractClientTransport {
|
|||
int associatedStreamId,
|
||||
List<Header> headerBlock,
|
||||
HeadersMode headersMode) {
|
||||
// TODO(user): handle received headers.
|
||||
if (inFinished) {
|
||||
final OkHttpClientStream stream;
|
||||
stream = streams.get(streamId);
|
||||
if (stream == null) {
|
||||
frameWriter.rstStream(streamId, ErrorCode.INVALID_STREAM);
|
||||
return;
|
||||
}
|
||||
stream.deliverHeaders(inFinished);
|
||||
OkHttpClientStream stream;
|
||||
stream = streams.get(streamId);
|
||||
if (stream == null) {
|
||||
frameWriter.rstStream(streamId, ErrorCode.INVALID_STREAM);
|
||||
return;
|
||||
}
|
||||
stream.deliverHeaders(headerBlock, inFinished);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -484,8 +482,19 @@ public class OkHttpClientTransport extends AbstractClientTransport {
|
|||
}
|
||||
}
|
||||
|
||||
synchronized void deliverHeaders(boolean endOfStream) {
|
||||
deframer.deframe(Buffers.empty(), endOfStream);
|
||||
synchronized void deliverHeaders(List<Header> headers, boolean endOfStream) {
|
||||
if (inboundPhase == Phase.HEADERS) {
|
||||
inboundPhase(Phase.MESSAGE);
|
||||
// If endOfStream, we have trailers and no "headers" were sent.
|
||||
if (!endOfStream) {
|
||||
deframer.delayProcessing(receiveHeaders(Utils.convertHeaders(headers)));
|
||||
}
|
||||
}
|
||||
if (endOfStream) {
|
||||
stashTrailers(Utils.convertTrailers(headers));
|
||||
inboundPhase(Phase.STATUS);
|
||||
deframer.deframe(Buffers.empty(), endOfStream);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -539,7 +548,7 @@ public class OkHttpClientTransport extends AbstractClientTransport {
|
|||
@Override
|
||||
public void remoteEndClosed() {
|
||||
super.remoteEndClosed();
|
||||
if (finishStream(streamId, Status.OK)) {
|
||||
if (finishStream(streamId, null)) {
|
||||
stopIfNecessary();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,34 @@
|
|||
package com.google.net.stubby.newtransport.okhttp;
|
||||
|
||||
import com.google.net.stubby.Metadata;
|
||||
|
||||
import com.squareup.okhttp.internal.spdy.Header;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Common utility methods for OkHttp transport.
|
||||
*/
|
||||
public class Utils {
|
||||
public static Metadata.Headers convertHeaders(List<Header> http2Headers) {
|
||||
return new Metadata.Headers(convertHeadersToArray(http2Headers));
|
||||
}
|
||||
|
||||
public static Metadata.Trailers convertTrailers(List<Header> http2Headers) {
|
||||
return new Metadata.Trailers(convertHeadersToArray(http2Headers));
|
||||
}
|
||||
|
||||
private static byte[][] convertHeadersToArray(List<Header> http2Headers) {
|
||||
byte[][] headerValues = new byte[http2Headers.size() * 2][];
|
||||
int i = 0;
|
||||
for (Header header : http2Headers) {
|
||||
headerValues[i++] = header.name.toByteArray();
|
||||
headerValues[i++] = header.value.toByteArray();
|
||||
}
|
||||
return headerValues;
|
||||
}
|
||||
|
||||
private Utils() {
|
||||
// Prevents instantiation
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue