Skip to content

Commit 45eca6e

Browse files
committed
Adds new HeadersValue
This is based on a TreeMap with a case insensitive order because HTTP headers should be case insensitive. Fixes issue jooby-project#2357
1 parent d5e1659 commit 45eca6e

6 files changed

Lines changed: 44 additions & 10 deletions

File tree

jooby/src/main/java/io/jooby/internal/HashValue.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@
2626
import java.util.function.BiConsumer;
2727

2828
public class HashValue implements ValueNode, Formdata {
29-
private static final Map<String, ValueNode> EMPTY = Collections.emptyMap();
29+
protected static final Map<String, ValueNode> EMPTY = Collections.emptyMap();
3030

3131
private Context ctx;
3232

33-
private Map<String, ValueNode> hash = EMPTY;
33+
protected Map<String, ValueNode> hash = EMPTY;
3434

3535
private final String name;
3636

@@ -151,7 +151,7 @@ private boolean isNumber(String value) {
151151
return true;
152152
}
153153

154-
private Map<String, ValueNode> hash() {
154+
protected Map<String, ValueNode> hash() {
155155
if (hash == EMPTY) {
156156
hash = new LinkedHashMap<>();
157157
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.jooby.internal;
2+
3+
import io.jooby.Context;
4+
import io.jooby.ValueNode;
5+
import java.util.Map;
6+
import java.util.TreeMap;
7+
8+
public class HeadersValue extends HashValue {
9+
10+
public HeadersValue(final Context ctx) {
11+
super(ctx);
12+
}
13+
14+
@Override
15+
protected Map<String, ValueNode> hash() {
16+
if (hash == EMPTY) {
17+
hash = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
18+
}
19+
return hash;
20+
}
21+
}

modules/jooby-jetty/src/main/java/io/jooby/internal/jetty/JettyContext.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,10 @@
2626
import io.jooby.SessionStore;
2727
import io.jooby.SneakyThrows;
2828
import io.jooby.StatusCode;
29-
import io.jooby.Value;
3029
import io.jooby.ValueNode;
3130
import io.jooby.WebSocket;
31+
import io.jooby.internal.HashValue;
32+
import io.jooby.internal.HeadersValue;
3233
import org.eclipse.jetty.http.HttpFields;
3334
import org.eclipse.jetty.http.HttpHeader;
3435
import org.eclipse.jetty.http.HttpHeaderValue;
@@ -54,7 +55,6 @@
5455
import java.io.InputStream;
5556
import java.io.OutputStream;
5657
import java.io.PrintWriter;
57-
import java.net.InetSocketAddress;
5858
import java.nio.ByteBuffer;
5959
import java.nio.channels.Channels;
6060
import java.nio.channels.FileChannel;
@@ -240,7 +240,9 @@ public JettyContext(Request request, Router router, int bufferSize, long maxRequ
240240
String name = names.nextElement();
241241
headerMap.put(name, Collections.list(request.getHeaders(name)));
242242
}
243-
headers = Value.hash(this, headerMap);
243+
HashValue node = new HeadersValue(this);
244+
node.put(headerMap);
245+
headers = node;
244246
}
245247
return headers;
246248
}

modules/jooby-netty/src/main/java/io/jooby/internal/netty/NettyContext.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import static java.util.concurrent.TimeUnit.MILLISECONDS;
2121
import static java.util.concurrent.TimeUnit.MINUTES;
2222

23+
import io.jooby.internal.HashValue;
24+
import io.jooby.internal.HeadersValue;
2325
import java.io.FileInputStream;
2426
import java.io.IOException;
2527
import java.io.InputStream;
@@ -39,7 +41,6 @@
3941
import java.util.Map;
4042
import java.util.Set;
4143
import java.util.concurrent.Executor;
42-
import java.util.concurrent.TimeUnit;
4344
import java.util.stream.Stream;
4445

4546
import javax.annotation.Nonnull;
@@ -314,7 +315,9 @@ boolean isHttpGet() {
314315
for (String name : names) {
315316
headerMap.put(name, headers.getAll(name));
316317
}
317-
this.headers = Value.hash(this, headerMap);
318+
HashValue node = new HeadersValue(this);
319+
node.put(headerMap);
320+
this.headers = node;
318321
}
319322
return headers;
320323
}

modules/jooby-test/src/main/java/io/jooby/MockContext.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
import io.jooby.exception.TypeMismatchException;
99

10+
import io.jooby.internal.HashValue;
11+
import io.jooby.internal.HeadersValue;
1012
import javax.annotation.Nonnull;
1113
import javax.annotation.Nullable;
1214
import java.io.ByteArrayInputStream;
@@ -248,7 +250,9 @@ public MockContext setFlashMap(@Nonnull FlashMap flashMap) {
248250
}
249251

250252
@Nonnull @Override public ValueNode header() {
251-
return Value.hash(this, headers);
253+
HashValue node = new HeadersValue(this);
254+
node.put(headers);
255+
return node;
252256
}
253257

254258
/**

modules/jooby-utow/src/main/java/io/jooby/internal/utow/UtowContext.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import static io.undertow.util.Headers.RANGE;
1212
import static io.undertow.util.Headers.SET_COOKIE;
1313

14+
import io.jooby.internal.HashValue;
15+
import io.jooby.internal.HeadersValue;
1416
import java.io.FileInputStream;
1517
import java.io.IOException;
1618
import java.io.InputStream;
@@ -238,7 +240,9 @@ boolean isHttpGet() {
238240
HeaderValues values = map.get(name);
239241
headerMap.put(name.toString(), values);
240242
}
241-
headers = Value.hash(this, headerMap);
243+
HashValue node = new HeadersValue(this);
244+
node.put(headerMap);
245+
headers = node;
242246
}
243247
return headers;
244248
}

0 commit comments

Comments
 (0)