From 75a431383c51c774a72082ec323a9d5afe144997 Mon Sep 17 00:00:00 2001 From: Filipe Roque Date: Thu, 5 Sep 2024 17:33:03 +0100 Subject: [PATCH] Fixes case insensitive headerMap Makes map returned by headerMap consistent with header() method. --- jooby/src/main/java/io/jooby/Context.java | 2 +- jooby/src/main/java/io/jooby/DefaultContext.java | 6 +++++- tests/src/test/java/io/jooby/test/Issue2357.java | 3 +++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/jooby/src/main/java/io/jooby/Context.java b/jooby/src/main/java/io/jooby/Context.java index fdf101a549..c1fe07a626 100644 --- a/jooby/src/main/java/io/jooby/Context.java +++ b/jooby/src/main/java/io/jooby/Context.java @@ -397,7 +397,7 @@ public interface Context extends Registry { /** * Header as single-value map. * - * @return Header as single-value map. + * @return Header as single-value map, with case insensitive keys. */ @NonNull Map headerMap(); diff --git a/jooby/src/main/java/io/jooby/DefaultContext.java b/jooby/src/main/java/io/jooby/DefaultContext.java index 21302366ff..ec948b4631 100644 --- a/jooby/src/main/java/io/jooby/DefaultContext.java +++ b/jooby/src/main/java/io/jooby/DefaultContext.java @@ -25,6 +25,7 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.TreeMap; import java.util.stream.Collectors; import org.slf4j.Logger; @@ -221,7 +222,10 @@ default boolean matches(String pattern) { @Override @NonNull default Map headerMap() { - return header().toMap(); + final var header = header(); + Map map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + header.toMultimap().forEach((k, v) -> map.put(k, v.get(0))); + return map; } @Override diff --git a/tests/src/test/java/io/jooby/test/Issue2357.java b/tests/src/test/java/io/jooby/test/Issue2357.java index 5210efc1e3..03bda1c5fc 100644 --- a/tests/src/test/java/io/jooby/test/Issue2357.java +++ b/tests/src/test/java/io/jooby/test/Issue2357.java @@ -26,6 +26,9 @@ public void headersShouldBeCaseInsensitive(ServerTestRunner runner) { Assertions.assertEquals("value1", ctx.header("x-header1").value()); Assertions.assertEquals("value1", ctx.header("X-HEADER1").value()); Assertions.assertEquals("value1", ctx.header("X-hEaDeR1").value()); + Assertions.assertEquals("value1", ctx.headerMap().get("x-header1")); + Assertions.assertEquals("value1", ctx.headerMap().get("X-HEADER1")); + Assertions.assertEquals("value1", ctx.headerMap().get("X-hEaDeR1")); return "OK"; })) .ready(