From 1c14e5bd4c7b265e2c7be5f57ce62f71a43ca352 Mon Sep 17 00:00:00 2001 From: Scott Mitchell Date: Mon, 21 Sep 2015 16:20:28 -0700 Subject: [PATCH] STOMP Headers Name Comparator Motivation: The HashingStrategy for DefaultStompHeaders was using the java .equals() method which would fail to compare String, AsciiString, and other CharSequence objects as equal. Modification: - Use AsciiString.CASE_SENSITIVE_HASHER for DefaultStompHeaders Result: DefaultStompHeaders work with all CharSequence objects. Fixes https://github.com/netty/netty/issues/4247 --- .../codec/stomp/DefaultStompHeaders.java | 2 +- .../handler/codec/stomp/StompHeadersTest.java | 35 +++++++++++++++++++ .../netty/handler/codec/DefaultHeaders.java | 7 +++- 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 codec-stomp/src/test/java/io/netty/handler/codec/stomp/StompHeadersTest.java diff --git a/codec-stomp/src/main/java/io/netty/handler/codec/stomp/DefaultStompHeaders.java b/codec-stomp/src/main/java/io/netty/handler/codec/stomp/DefaultStompHeaders.java index c940be648f..119c3a0ac6 100644 --- a/codec-stomp/src/main/java/io/netty/handler/codec/stomp/DefaultStompHeaders.java +++ b/codec-stomp/src/main/java/io/netty/handler/codec/stomp/DefaultStompHeaders.java @@ -30,7 +30,7 @@ import static io.netty.util.AsciiString.CASE_SENSITIVE_HASHER; public class DefaultStompHeaders extends DefaultHeaders implements StompHeaders { public DefaultStompHeaders() { - super(CharSequenceValueConverter.INSTANCE); + super(CASE_SENSITIVE_HASHER, CharSequenceValueConverter.INSTANCE); } @Override diff --git a/codec-stomp/src/test/java/io/netty/handler/codec/stomp/StompHeadersTest.java b/codec-stomp/src/test/java/io/netty/handler/codec/stomp/StompHeadersTest.java new file mode 100644 index 0000000000..e1247945b6 --- /dev/null +++ b/codec-stomp/src/test/java/io/netty/handler/codec/stomp/StompHeadersTest.java @@ -0,0 +1,35 @@ +/* + * Copyright 2015 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.stomp; + +import io.netty.util.AsciiString; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +public class StompHeadersTest { + @Test + public void testHeadersCaseSensative() { + DefaultStompHeaders headers = new DefaultStompHeaders(); + AsciiString foo = new AsciiString("foo"); + AsciiString value = new AsciiString("value"); + headers.add(foo, value); + assertNull(headers.get("Foo")); + assertEquals(value, headers.get(foo)); + assertEquals(value, headers.get(foo.toString())); + } +} diff --git a/codec/src/main/java/io/netty/handler/codec/DefaultHeaders.java b/codec/src/main/java/io/netty/handler/codec/DefaultHeaders.java index 1021d8d69f..468315baec 100644 --- a/codec/src/main/java/io/netty/handler/codec/DefaultHeaders.java +++ b/codec/src/main/java/io/netty/handler/codec/DefaultHeaders.java @@ -84,7 +84,7 @@ public class DefaultHeaders implements Headers { @SuppressWarnings("unchecked") public DefaultHeaders(ValueConverter valueConverter) { - this(valueConverter, NameValidator.NOT_NULL); + this(JAVA_HASHER, valueConverter); } @SuppressWarnings("unchecked") @@ -92,6 +92,11 @@ public class DefaultHeaders implements Headers { this(JAVA_HASHER, valueConverter, nameValidator); } + @SuppressWarnings("unchecked") + public DefaultHeaders(HashingStrategy nameHashingStrategy, ValueConverter valueConverter) { + this(nameHashingStrategy, valueConverter, NameValidator.NOT_NULL); + } + public DefaultHeaders(HashingStrategy nameHashingStrategy, ValueConverter valueConverter, NameValidator nameValidator) { this.valueConverter = checkNotNull(valueConverter, "valueConverter");