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:
simonma 2014-10-22 18:12:07 -07:00 committed by Eric Anderson
parent 8b4ecad497
commit 988f219b04
2 changed files with 58 additions and 15 deletions

View File

@ -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();
}
}

View File

@ -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
}
}