This is an automated email from the ASF dual-hosted git repository. elecharny pushed a commit to branch 2.0.X in repository https://gitbox.apache.org/repos/asf/mina.git
The following commit(s) were added to refs/heads/2.0.X by this push: new e345aa3 Fix for DIRMINA-1035 e345aa3 is described below commit e345aa3aa6749836ad36a9cf7d22f01761d547ca Author: emmanuel lecharny <elecha...@apache.org> AuthorDate: Tue Feb 8 17:50:28 2022 +0100 Fix for DIRMINA-1035 --- .../org/apache/mina/http/HttpServerDecoder.java | 12 +++++++--- .../apache/mina/http/HttpServerDecoderTest.java | 26 ++++++++++++++++++++++ 2 files changed, 35 insertions(+), 3 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 d861216..a686d2e 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,9 +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); 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 87b886d..45405a0 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 @@ -243,6 +243,32 @@ public class HttpServerDecoderTest { } @Test + public void testDIRMINA1035HeadersWithColons() throws Exception { + AbstractProtocolDecoderOutput out = new AbstractProtocolDecoderOutput() { + public void flush(NextFilter nextFilter, IoSession session) { + } + }; + + 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.getMessageQueue().size()); + HttpRequest request = (HttpRequest) out.getMessageQueue().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.getMessageQueue().poll() instanceof HttpEndOfContent); + } + + @Test public void verifyThatHeaderWithoutLeadingSpaceIsSupported() throws Exception { AbstractProtocolDecoderOutput out = new AbstractProtocolDecoderOutput() { public void flush(NextFilter nextFilter, IoSession session) {