From fca7566fb9a2b27ec1a792bcce1089e4cb518374 Mon Sep 17 00:00:00 2001 From: Pierre Viret Date: Thu, 30 Jan 2025 10:48:04 +0100 Subject: [PATCH 1/2] Fix a bug if multiple headers have the same name --- .../java/robaho/net/httpserver/OptimizedHeaders.java | 5 +++-- .../robaho/net/httpserver/RequestHeadersTest.java | 11 +++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/robaho/net/httpserver/OptimizedHeaders.java b/src/main/java/robaho/net/httpserver/OptimizedHeaders.java index 8248531..65ec37b 100644 --- a/src/main/java/robaho/net/httpserver/OptimizedHeaders.java +++ b/src/main/java/robaho/net/httpserver/OptimizedHeaders.java @@ -1,6 +1,7 @@ package robaho.net.httpserver; import java.util.AbstractMap; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; @@ -91,8 +92,8 @@ public void add(String key, String value) { Object o = map.get(normalized); if (o == null) { map.put(normalized, value); - } else if(o instanceof String) { - map.put(normalized, Arrays.asList((String)o,value)); + } else if(o instanceof String s) { + map.put(normalized, new ArrayList<>(Arrays.asList(s,value))); } else { ((List)o).add(value); } diff --git a/src/test/java/robaho/net/httpserver/RequestHeadersTest.java b/src/test/java/robaho/net/httpserver/RequestHeadersTest.java index 8efad4b..aa01d89 100644 --- a/src/test/java/robaho/net/httpserver/RequestHeadersTest.java +++ b/src/test/java/robaho/net/httpserver/RequestHeadersTest.java @@ -3,6 +3,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.util.List; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; @@ -63,4 +64,14 @@ public void TestWhitespace() throws IOException { assertEquals(r.headers().getFirst("KEY2"),"VAL2"); } + @Test + public void TestDuplicateHeaders() throws IOException { + String request = "GET blah\r\nKEY : VAL\r\nKEY:VAL2\r\nKEY:VAL3 \r\n\r\nSome Body Data"; + var is = new ByteArrayInputStream(request.getBytes()); + var os = new ByteArrayOutputStream(); + + Request r = new Request(is,os); + assertTrue("GET blah".contentEquals(r.requestLine())); + assertEquals(r.headers().get("KEY"), List.of("VAL", "VAL2", "VAL3")); + } } \ No newline at end of file From f54133852673cd53c80947e76de9131a7d53cfde Mon Sep 17 00:00:00 2001 From: robert engels Date: Thu, 30 Jan 2025 10:42:40 -0600 Subject: [PATCH 2/2] make slightly more efficient to avoid array allocation (most likely). change instanceof cases to use pattern matching for consistency --- .../java/robaho/net/httpserver/OptimizedHeaders.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/robaho/net/httpserver/OptimizedHeaders.java b/src/main/java/robaho/net/httpserver/OptimizedHeaders.java index 65ec37b..7624d3b 100644 --- a/src/main/java/robaho/net/httpserver/OptimizedHeaders.java +++ b/src/main/java/robaho/net/httpserver/OptimizedHeaders.java @@ -36,25 +36,25 @@ public boolean isEmpty() { @Override public List get(Object key) { Object o = map.get(normalize((String)key)); - return o == null ? null : (o instanceof String) ? Arrays.asList((String)o) : (List)o; + return o == null ? null : (o instanceof String s) ? List.of(s) : (List)o; } @Override public List put(String key, List value) { Object o = map.put(normalize(key), value); - return o == null ? null : (o instanceof String) ? Arrays.asList((String)o) : (List)o; + return o == null ? null : (o instanceof String s) ? List.of(s) : (List)o; } @Override public List remove(Object key) { Object o = map.put(normalize((String)key),null); - return o == null ? null : (o instanceof String) ? Arrays.asList((String)o) : (List)o; + return o == null ? null : (o instanceof String s) ? List.of(s) : (List)o; } @Override public String getFirst(String key) { Object o = map.get(normalize(key)); - return o == null ? null : (o instanceof String) ? (String)o : ((List)o).getFirst(); + return o == null ? null : (o instanceof String s) ? s : ((List)o).getFirst(); } /** @@ -93,7 +93,7 @@ public void add(String key, String value) { if (o == null) { map.put(normalized, value); } else if(o instanceof String s) { - map.put(normalized, new ArrayList<>(Arrays.asList(s,value))); + map.put(normalized, new ArrayList(List.of(s,value))); } else { ((List)o).add(value); } @@ -147,6 +147,6 @@ public int hashCode() { @Override public void forEach(BiConsumer> action) { - map.forEach((k,v) -> action.accept(k, (v instanceof String) ? List.of((String)v) : (List)v)); + map.forEach((k,v) -> action.accept(k, (v instanceof String s) ? List.of(s) : (List)v)); } } \ No newline at end of file