This is an automated email from the ASF dual-hosted git repository. johnnyv pushed a commit to branch 2.2.X in repository https://gitbox.apache.org/repos/asf/mina.git
The following commit(s) were added to refs/heads/2.2.X by this push: new 3726e4a Fix DIRMINA-1035 3726e4a is described below commit 3726e4a3720eb4c0e60295b13af4ad2b0765bc75 Author: Jonathan Valliere <john...@apache.org> AuthorDate: Thu Aug 5 13:30:21 2021 -0400 Fix DIRMINA-1035 --- .../org/apache/mina/http/HttpServerDecoder.java | 13 ++++++++---- .../apache/mina/http/HttpServerDecoderTest.java | 23 ++++++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/mina-http/src/main/java/org/apache/mina/http/HttpServerDecoder.java b/mina-http/src/main/java/org/apache/mina/http/HttpServerDecoder.java index 30c1f81..850d9f1 100644 --- a/mina-http/src/main/java/org/apache/mina/http/HttpServerDecoder.java +++ b/mina-http/src/main/java/org/apache/mina/http/HttpServerDecoder.java @@ -208,10 +208,15 @@ public class HttpServerDecoder implements ProtocolDecoder { String requestLine = headerFields[0]; Map<String, String> generalHeaders = new HashMap<>(); - for (int i = 1; i < headerFields.length; i++) { - String[] header = HEADER_VALUE_PATTERN.split(headerFields[i]); - generalHeaders.put(header[0].toLowerCase(), header[1].trim()); - } + for (String header : headerFields) { + int firstColon = header.indexOf(':'); + if (firstColon > 0) { + generalHeaders.put(header.substring(0, firstColon).toLowerCase(), + header.substring(firstColon + 1).trim()); + } else { + generalHeaders.put(header.trim(), ""); + } + } String[] elements = REQUEST_LINE_PATTERN.split(requestLine); HttpMethod method = HttpMethod.valueOf(elements[0]); diff --git a/mina-http/src/test/java/org/apache/mina/http/HttpServerDecoderTest.java b/mina-http/src/test/java/org/apache/mina/http/HttpServerDecoderTest.java index f8497b8..c752c61 100644 --- a/mina-http/src/test/java/org/apache/mina/http/HttpServerDecoderTest.java +++ b/mina-http/src/test/java/org/apache/mina/http/HttpServerDecoderTest.java @@ -28,6 +28,7 @@ import java.nio.charset.CharsetEncoder; import java.util.Queue; import org.apache.mina.core.buffer.IoBuffer; +import org.apache.mina.core.filterchain.IoFilter.NextFilter; import org.apache.mina.core.session.DummySession; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.AbstractProtocolDecoderOutput; @@ -240,6 +241,28 @@ public class HttpServerDecoderTest { } @Test + public void testDIRMINA1035HeadersWithColons() throws Exception { + ProtocolDecoderQueue out = new ProtocolDecoderQueue(); + IoBuffer buffer = IoBuffer.allocate(0).setAutoExpand(true); + buffer.putString("GET / HTTP/1.0\r\nHost: localhost\r\n", encoder); + buffer.putString("SomeHeaderA: Value-A\r\n", encoder); + buffer.putString("SomeHeaderB: Value-B:Has:Some:Colons\r\n", encoder); + buffer.putString("SomeHeaderC: Value-C\r\n", encoder); + buffer.putString("SomeHeaderD:\r\n\r\n", encoder); + buffer.rewind(); + while (buffer.hasRemaining()) { + decoder.decode(session, buffer, out); + } + assertEquals(2, out.getQueue().size()); + HttpRequest request = (HttpRequest) out.getQueue().poll(); + assertEquals("Value-A", request.getHeader("SomeHeaderA".toLowerCase())); + assertEquals("Value-B:Has:Some:Colons", request.getHeader("SomeHeaderB".toLowerCase())); + assertEquals("Value-C", request.getHeader("SomeHeaderC".toLowerCase())); + assertEquals("", request.getHeader("SomeHeaderD".toLowerCase())); + assertTrue(out.getQueue().poll() instanceof HttpEndOfContent); + } + + @Test public void verifyThatHeaderWithoutLeadingSpaceIsSupported() throws Exception { ProtocolDecoderQueue out = new ProtocolDecoderQueue(); IoBuffer buffer = IoBuffer.allocate(0).setAutoExpand(true);