You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by el...@apache.org on 2022/02/08 16:50:40 UTC

[mina] branch 2.0.X updated: Fix for DIRMINA-1035

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 <el...@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) {