From 59600f1812969abe2bb84d64439c58286011ea2c Mon Sep 17 00:00:00 2001 From: Scott Mitchell Date: Thu, 10 Sep 2015 09:18:09 -0700 Subject: [PATCH] HTTP/2 to HTTP/1.x headers conversion more accessible Motivation: Currently there is a HttpConversionUtil.addHttp2ToHttpHeaders which requires a FullHttpMessage, but this may not always be available. There is no interface that can be used with just Http2Headers and HttpHeaders. Modifications: - add an overload for HttpConversionUtil.addHttp2ToHttpHeaders which does not take FullHttpMessage Result: An overload for HttpConversionUtil.addHttp2ToHttpHeaders exists which does not require FullHttpMessage. --- .../io/netty/handler/codec/http/HttpUtil.java | 27 ++++++++++- .../codec/http2/HttpConversionUtil.java | 47 +++++++++++++------ 2 files changed, 58 insertions(+), 16 deletions(-) diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/HttpUtil.java b/codec-http/src/main/java/io/netty/handler/codec/http/HttpUtil.java index 7ecb9df694..1bdf7e11bb 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/HttpUtil.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/HttpUtil.java @@ -95,10 +95,33 @@ public final class HttpUtil { *
  • remove otherwise.
  • * * + * @see #setKeepAlive(HttpHeaders, HttpVersion, boolean) */ public static void setKeepAlive(HttpMessage message, boolean keepAlive) { - HttpHeaders h = message.headers(); - if (message.protocolVersion().isKeepAliveDefault()) { + setKeepAlive(message.headers(), message.protocolVersion(), keepAlive); + } + + /** + * Sets the value of the {@code "Connection"} header depending on the + * protocol version of the specified message. This getMethod sets or removes + * the {@code "Connection"} header depending on what the default keep alive + * mode of the message's protocol version is, as specified by + * {@link HttpVersion#isKeepAliveDefault()}. + * + */ + public static void setKeepAlive(HttpHeaders h, HttpVersion httpVersion, boolean keepAlive) { + if (httpVersion.isKeepAliveDefault()) { if (keepAlive) { h.remove(HttpHeaderNames.CONNECTION); } else { diff --git a/codec-http2/src/main/java/io/netty/handler/codec/http2/HttpConversionUtil.java b/codec-http2/src/main/java/io/netty/handler/codec/http2/HttpConversionUtil.java index b23ef7dd07..9773a08ce7 100644 --- a/codec-http2/src/main/java/io/netty/handler/codec/http2/HttpConversionUtil.java +++ b/codec-http2/src/main/java/io/netty/handler/codec/http2/HttpConversionUtil.java @@ -239,21 +239,40 @@ public final class HttpConversionUtil { } /** - * Translate and add HTTP/2 headers to HTTP/1.x headers + * Translate and add HTTP/2 headers to HTTP/1.x headers. * - * @param streamId The stream associated with {@code sourceHeaders} - * @param sourceHeaders The HTTP/2 headers to convert - * @param destinationMessage The object which will contain the resulting HTTP/1.x headers + * @param streamId The stream associated with {@code sourceHeaders}. + * @param sourceHeaders The HTTP/2 headers to convert. + * @param destinationMessage The object which will contain the resulting HTTP/1.x headers. * @param addToTrailer {@code true} to add to trailing headers. {@code false} to add to initial headers. - * @throws Http2Exception If not all HTTP/2 headers can be translated to HTTP/1.x + * @throws Http2Exception If not all HTTP/2 headers can be translated to HTTP/1.x. + * @see #addHttp2ToHttpHeaders(int, Http2Headers, HttpHeaders, HttpVersion, boolean, boolean) */ public static void addHttp2ToHttpHeaders(int streamId, Http2Headers sourceHeaders, FullHttpMessage destinationMessage, boolean addToTrailer) throws Http2Exception { - HttpHeaders headers = addToTrailer ? destinationMessage.trailingHeaders() : destinationMessage.headers(); - boolean request = destinationMessage instanceof HttpRequest; - Http2ToHttpHeaderTranslator translator = new Http2ToHttpHeaderTranslator(streamId, headers, request); + addHttp2ToHttpHeaders(streamId, sourceHeaders, + addToTrailer ? destinationMessage.trailingHeaders() : destinationMessage.headers(), + destinationMessage.protocolVersion(), addToTrailer, destinationMessage instanceof HttpRequest); + } + + /** + * Translate and add HTTP/2 headers to HTTP/1.x headers. + * + * @param streamId The stream associated with {@code sourceHeaders}. + * @param inputHeaders The HTTP/2 headers to convert. + * @param outputHeaders The object which will contain the resulting HTTP/1.x headers.. + * @param httpVersion What HTTP/1.x version {@code outputHeaders} should be treated as when doing the conversion. + * @param isTrailer {@code true} if {@code outputHeaders} should be treated as trailing headers. + * {@code false} otherwise. + * @param isReqeust {@code true} if the {@code outputHeaders} will be used in a request message. + * {@code false} for response message. + * @throws Http2Exception If not all HTTP/2 headers can be translated to HTTP/1.x. + */ + public static void addHttp2ToHttpHeaders(int streamId, Http2Headers inputHeaders, HttpHeaders outputHeaders, + HttpVersion httpVersion, boolean isTrailer, boolean isRequest) throws Http2Exception { + Http2ToHttpHeaderTranslator translator = new Http2ToHttpHeaderTranslator(streamId, outputHeaders, isRequest); try { - for (Entry entry : sourceHeaders) { + for (Entry entry : inputHeaders) { translator.translate(entry); } } catch (Http2Exception ex) { @@ -262,11 +281,11 @@ public final class HttpConversionUtil { throw streamError(streamId, PROTOCOL_ERROR, t, "HTTP/2 to HTTP/1.x headers conversion error"); } - headers.remove(HttpHeaderNames.TRANSFER_ENCODING); - headers.remove(HttpHeaderNames.TRAILER); - if (!addToTrailer) { - headers.setInt(ExtensionHeaderNames.STREAM_ID.text(), streamId); - HttpUtil.setKeepAlive(destinationMessage, true); + outputHeaders.remove(HttpHeaderNames.TRANSFER_ENCODING); + outputHeaders.remove(HttpHeaderNames.TRAILER); + if (!isTrailer) { + outputHeaders.setInt(ExtensionHeaderNames.STREAM_ID.text(), streamId); + HttpUtil.setKeepAlive(outputHeaders, httpVersion, true); } }