You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by jo...@apache.org on 2021/08/05 17:32:17 UTC

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

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 <jo...@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);