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.
|
* <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;
|
OkHttpClientStream stream;
|
||||||
stream = streams.remove(streamId);
|
stream = streams.remove(streamId);
|
||||||
if (stream != null) {
|
if (stream != null) {
|
||||||
// This is mainly for failed streams, for successfully finished streams, it's a no-op.
|
if (status != null) {
|
||||||
stream.setStatus(status, new Metadata.Trailers());
|
stream.setStatus(status, new Metadata.Trailers());
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -340,16 +341,13 @@ public class OkHttpClientTransport extends AbstractClientTransport {
|
||||||
int associatedStreamId,
|
int associatedStreamId,
|
||||||
List<Header> headerBlock,
|
List<Header> headerBlock,
|
||||||
HeadersMode headersMode) {
|
HeadersMode headersMode) {
|
||||||
// TODO(user): handle received headers.
|
OkHttpClientStream stream;
|
||||||
if (inFinished) {
|
stream = streams.get(streamId);
|
||||||
final OkHttpClientStream stream;
|
if (stream == null) {
|
||||||
stream = streams.get(streamId);
|
frameWriter.rstStream(streamId, ErrorCode.INVALID_STREAM);
|
||||||
if (stream == null) {
|
return;
|
||||||
frameWriter.rstStream(streamId, ErrorCode.INVALID_STREAM);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
stream.deliverHeaders(inFinished);
|
|
||||||
}
|
}
|
||||||
|
stream.deliverHeaders(headerBlock, inFinished);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -484,8 +482,19 @@ public class OkHttpClientTransport extends AbstractClientTransport {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
synchronized void deliverHeaders(boolean endOfStream) {
|
synchronized void deliverHeaders(List<Header> headers, boolean endOfStream) {
|
||||||
deframer.deframe(Buffers.empty(), 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
|
@Override
|
||||||
|
|
@ -539,7 +548,7 @@ public class OkHttpClientTransport extends AbstractClientTransport {
|
||||||
@Override
|
@Override
|
||||||
public void remoteEndClosed() {
|
public void remoteEndClosed() {
|
||||||
super.remoteEndClosed();
|
super.remoteEndClosed();
|
||||||
if (finishStream(streamId, Status.OK)) {
|
if (finishStream(streamId, null)) {
|
||||||
stopIfNecessary();
|
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