in src/main/java/com/twitter/http2/HttpStreamDecoder.java [188:232]
private StreamedHttpRequest createHttpRequest(HttpHeadersFrame httpHeadersFrame)
throws Exception {
// Create the first line of the request from the name/value pairs
HttpMethod method = HttpMethod.valueOf(httpHeadersFrame.headers().get(":method"));
String url = httpHeadersFrame.headers().get(":path");
httpHeadersFrame.headers().remove(":method");
httpHeadersFrame.headers().remove(":path");
StreamedHttpRequest request = new StreamedHttpRequest(HttpVersion.HTTP_1_1, method, url);
// Remove the scheme header
httpHeadersFrame.headers().remove(":scheme");
// Replace the SPDY host header with the HTTP host header
String host = httpHeadersFrame.headers().get(":authority");
httpHeadersFrame.headers().remove(":authority");
httpHeadersFrame.headers().set("host", host);
for (Map.Entry<String, String> e : httpHeadersFrame.headers()) {
String name = e.getKey();
String value = e.getValue();
if (name.charAt(0) != ':') {
request.headers().add(name, value);
}
}
// Set the Stream-ID as a header
request.headers().set("X-SPDY-Stream-ID", httpHeadersFrame.getStreamId());
// The Connection and Keep-Alive headers are no longer valid
HttpHeaders.setKeepAlive(request, true);
// Transfer-Encoding header is not valid
request.headers().remove(HttpHeaders.Names.TRANSFER_ENCODING);
if (httpHeadersFrame.isLast()) {
request.getContent().close();
request.setDecoderResult(DecoderResult.SUCCESS);
} else {
request.setDecoderResult(DecoderResult.UNFINISHED);
}
return request;
}