diff --git a/codec-http2/src/main/java/io/netty/handler/codec/http2/DefaultHttp2Headers.java b/codec-http2/src/main/java/io/netty/handler/codec/http2/DefaultHttp2Headers.java index d891d30369..86993b085b 100644 --- a/codec-http2/src/main/java/io/netty/handler/codec/http2/DefaultHttp2Headers.java +++ b/codec-http2/src/main/java/io/netty/handler/codec/http2/DefaultHttp2Headers.java @@ -19,6 +19,31 @@ import io.netty.handler.codec.BinaryHeaders; import io.netty.handler.codec.DefaultBinaryHeaders; public class DefaultHttp2Headers extends DefaultBinaryHeaders implements Http2Headers { + + /** + * Creates an instance that will convert all header names to lowercase. + */ + public DefaultHttp2Headers() { + this(true); + } + + /** + * Creates an instance that can be configured to either do header field name conversion to + * lowercase, or not do any conversion at all. + *

+ * + * Note that setting {@code forceKeyToLower} to {@code false} can violate the + * HTTP/2 specification + * which specifies that a request or response containing an uppercase header field MUST be treated + * as malformed. Only set {@code forceKeyToLower} to {@code false} if you are explicitly using lowercase + * header field names and want to avoid the conversion to lowercase. + * + * @param forceKeyToLower if @{code false} no header name conversion will be performed + */ + public DefaultHttp2Headers(boolean forceKeyToLower) { + super(forceKeyToLower); + } + @Override public Http2Headers add(AsciiString name, AsciiString value) { super.add(name, value); diff --git a/codec-http2/src/test/java/io/netty/handler/codec/http2/DefaultHttp2HeadersTest.java b/codec-http2/src/test/java/io/netty/handler/codec/http2/DefaultHttp2HeadersTest.java new file mode 100644 index 0000000000..6e00b84297 --- /dev/null +++ b/codec-http2/src/test/java/io/netty/handler/codec/http2/DefaultHttp2HeadersTest.java @@ -0,0 +1,44 @@ +/* + * Copyright 2014 The Netty Project + * + * The Netty Project licenses this file to you under the Apache License, version + * 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package io.netty.handler.codec.http2; + +import io.netty.handler.codec.AsciiString; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class DefaultHttp2HeadersTest { + + private static final AsciiString NAME = new AsciiString("Test"); + private static final AsciiString VALUE = new AsciiString("some value"); + + @Test + public void defaultLowercase() { + Http2Headers headers = new DefaultHttp2Headers().set(NAME, VALUE); + assertEquals(first(headers), NAME.toLowerCase()); + } + + @Test + public void caseInsensitive() { + Http2Headers headers = new DefaultHttp2Headers(false).set(NAME, VALUE); + assertEquals(first(headers), NAME); + } + + private static AsciiString first(Http2Headers headers) { + return headers.names().iterator().next(); + } + +}