From 161aa6d2d22792362fc739d5226207997cfd2b6d Mon Sep 17 00:00:00 2001 From: Wfontesd <53375064+Wfontesd@users.noreply.github.com> Date: Tue, 8 Sep 2026 09:57:22 +0200 Subject: [PATCH] fix: allow empty HTTP header values --- .../src/java/net/http/HttpHeaders.scala | 2 -- .../java/net/http/EmptyHeaderValuesTest.scala | 28 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 modules/java-http-client/test/src/java/net/http/EmptyHeaderValuesTest.scala diff --git a/modules/java-http-client/src/java/net/http/HttpHeaders.scala b/modules/java-http-client/src/java/net/http/HttpHeaders.scala index ce5cfe8..70f45fe 100644 --- a/modules/java-http-client/src/java/net/http/HttpHeaders.scala +++ b/modules/java-http-client/src/java/net/http/HttpHeaders.scala @@ -65,7 +65,6 @@ object HttpHeaders: requireNonNull(key) requireNonNull(values, s"values for key '${key}' can not be null") - require(!values.isEmpty, s"empty values for key '${key}'") val headerKey = key.trim() require(!headerKey.isEmpty, "empty key") @@ -92,7 +91,6 @@ object HttpHeaders: values.forEach { s => requireNonNull(s, s"header value can not be null") val trimedValue = requireNonNull(s).trim() - require(!trimedValue.isEmpty, s"empty value for key '${headerKey}'") if (filter.test(headerKey, trimedValue)) headerValues.add(trimedValue): Unit diff --git a/modules/java-http-client/test/src/java/net/http/EmptyHeaderValuesTest.scala b/modules/java-http-client/test/src/java/net/http/EmptyHeaderValuesTest.scala new file mode 100644 index 0000000..7dfe36a --- /dev/null +++ b/modules/java-http-client/test/src/java/net/http/EmptyHeaderValuesTest.scala @@ -0,0 +1,28 @@ +package snhttp.test.java.net.http + +import java.net.http.HttpHeaders +import java.util.{List as JList, Map as JMap} +import utest.{TestSuite, Tests, test, assert} + +class EmptyHeaderValuesTest extends TestSuite: + val tests = Tests: + test("empty header value is retained") { + val headers = HttpHeaders.of(JMap.of("X-Empty", JList.of("")), (_, _) => true) + assert(headers.firstValue("X-Empty").isPresent()) + assert(headers.firstValue("X-Empty").get() == "") + } + test("whitespace header value becomes an empty value") { + val headers = HttpHeaders.of(JMap.of("X-Empty", JList.of(" \t ")), (_, _) => true) + assert(headers.allValues("X-Empty") == JList.of("")) + } + test("empty header value list is omitted") { + val headers = HttpHeaders.of(JMap.of("X-Empty", JList.of[String]()), (_, _) => true) + assert(headers.map().isEmpty()) + } + test("filter can reject empty values while retaining other values") { + val headers = HttpHeaders.of( + JMap.of("X-Values", JList.of("", " value ", " ")), + (_, value) => !value.isEmpty(), + ) + assert(headers.allValues("X-Values") == JList.of("value")) + }