Added additional testing including regular expression and made small change to clarify javadoc from code review.
diff --git a/jaxrs-api/src/main/java/jakarta/ws/rs/client/ClientRequestContext.java b/jaxrs-api/src/main/java/jakarta/ws/rs/client/ClientRequestContext.java index 6bf01a0..5c2ee4a 100644 --- a/jaxrs-api/src/main/java/jakarta/ws/rs/client/ClientRequestContext.java +++ b/jaxrs-api/src/main/java/jakarta/ws/rs/client/ClientRequestContext.java
@@ -207,7 +207,8 @@ * (missing comma), or the value {@code no - store} (whitespace within value). * * @param name the message header. - * @param valueSeparatorRegex Separates the header value into single values. {@code null} does not split. + * @param valueSeparatorRegex String or regular expression that separates the header value into single values. + * {@code null} does not split. * @param valuePredicate value must fulfil this predicate. * @return {@code true} if and only if a header with the given name exists, having either a whitespace-trimmed value * matching the predicate, or having at least one whitespace-trimmed single value in a token-separated list of single values.
diff --git a/jaxrs-api/src/main/java/jakarta/ws/rs/client/ClientResponseContext.java b/jaxrs-api/src/main/java/jakarta/ws/rs/client/ClientResponseContext.java index 756e428..c6b6d14 100644 --- a/jaxrs-api/src/main/java/jakarta/ws/rs/client/ClientResponseContext.java +++ b/jaxrs-api/src/main/java/jakarta/ws/rs/client/ClientResponseContext.java
@@ -99,7 +99,8 @@ * (missing comma), or the value {@code no - store} (whitespace within value). * * @param name the message header. - * @param valueSeparatorRegex Separates the header value into single values. {@code null} does not split. + * @param valueSeparatorRegex String or regular expression that separates the header value into single values. + * {@code null} does not split. * @param valuePredicate value must fulfil this predicate. * @return {@code true} if and only if a header with the given name exists, having either a whitespace-trimmed value * matching the predicate, or having at least one whitespace-trimmed single value in a token-separated list of single values.
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/api/client/clientrequestcontext/JAXRSClientIT.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/api/client/clientrequestcontext/JAXRSClientIT.java index 65087cd..90dc2f7 100644 --- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/api/client/clientrequestcontext/JAXRSClientIT.java +++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/api/client/clientrequestcontext/JAXRSClientIT.java
@@ -17,6 +17,7 @@ package ee.jakarta.tck.ws.rs.api.client.clientrequestcontext; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; import java.io.ByteArrayInputStream; import java.lang.annotation.Annotation; @@ -874,22 +875,31 @@ ContextProvider provider = new ContextProvider() { @Override protected void checkFilterContext(ClientRequestContext context) throws Fault { - assertTrue(context.containsHeaderString("cache-control", "no-store"::equalsIgnoreCase)); - assertTrue(context.containsHeaderString("CACHE-CONTROL", ",", "no-transform"::equalsIgnoreCase)); - assertTrue(!(context.containsHeaderString("CACHE-CONTROL", ",", "Max-Age"::equalsIgnoreCase))); - assertTrue(!(context.containsHeaderString("cache-control", ",", "no-transform"::equals))); - assertTrue(context.containsHeaderString("cache-control2", ";", "no-transform"::equalsIgnoreCase)); - assertTrue(!(context.containsHeaderString("cache-control2", ",", - "no-transform"::equalsIgnoreCase))); + assertTrue(context.containsHeaderString("header1", "value"::equalsIgnoreCase)); + assertTrue(context.containsHeaderString("HEADER1", ",", "value2"::equals)); + //Incorrect separator character + assertFalse(context.containsHeaderString("header1", ";", "value2"::equalsIgnoreCase)); + //Shouldn't find first value when separator character is incorrect + assertFalse(context.containsHeaderString("header1", ";", "value1"::equalsIgnoreCase)); + //Test regular expression + assertFalse(context.containsHeaderString("header1", "; | ,", "value2"::equalsIgnoreCase)); + //White space in value not trimmed + assertFalse(context.containsHeaderString("header1", "whitespace"::equalsIgnoreCase)); + //Multiple character separator + assertTrue(context.containsHeaderString("header2", "::", "Value5"::equalsIgnoreCase)); + //Test default separator is comma + assertFalse(context.containsHeaderString("header3","value6"::equalsIgnoreCase)); String entity = "Success"; Response r = Response.ok(entity).build(); context.abortWith(r); } }; Invocation invocation = buildBuilder(provider) - .header("cache-control", "no-store") - .header("cache-control", "{Max - Age, no-transform}") - .header("cache-control2", "{no-store;no-transform}") + .header("header1", "value") + .header("header1", "value1 , value2") + .header("header1", "Value3,white space ") + .header("header2", "Value4::Value5") + .header("header3", "value6;value7") .buildGet(); Response response = invoke(invocation);
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/api/client/clientresponsecontext/JAXRSClientIT.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/api/client/clientresponsecontext/JAXRSClientIT.java index 50bea0f..a0123ee 100644 --- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/api/client/clientresponsecontext/JAXRSClientIT.java +++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/api/client/clientresponsecontext/JAXRSClientIT.java
@@ -16,6 +16,7 @@ package ee.jakarta.tck.ws.rs.api.client.clientresponsecontext; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.BufferedReader; @@ -437,7 +438,7 @@ */ @Test public void containsHeaderStringTest() throws Fault { - final String header1 = "cache-control"; + final String header1 = "Header1"; final String value1 = "no-store"; final String value2 = "{Max - Age, no-transform}"; final String header2 = "header2"; @@ -447,18 +448,28 @@ @Override protected void checkFilterContext(ClientRequestContext requestContext, ClientResponseContext responseContext) throws Fault { - assertTrue(responseContext.containsHeaderString("cache-control", "no-store"::equalsIgnoreCase)); - assertTrue(responseContext.containsHeaderString("CACHE-CONTROL", ",", "no-transform"::equalsIgnoreCase)); - assertTrue(!(responseContext.containsHeaderString("CACHE-CONTROL", ",", "Max-Age"::equalsIgnoreCase))); - assertTrue(!(responseContext.containsHeaderString("cache-control", ",", "no-transform"::equals))); - assertTrue(responseContext.containsHeaderString("header2", ";", "no-transform"::equalsIgnoreCase)); - assertTrue(!(responseContext.containsHeaderString("Header2", ",", "no-transform"::equalsIgnoreCase))); + assertTrue(responseContext.containsHeaderString("header1", "value"::equalsIgnoreCase)); + assertTrue(responseContext.containsHeaderString("HEADER1", ",", "value2"::equals)); + //Incorrect separator character + assertFalse(responseContext.containsHeaderString("header1", ";", "value2"::equalsIgnoreCase)); + //Shouldn't find first value when separator character is incorrect + assertFalse(responseContext.containsHeaderString("header1", ";", "value1"::equalsIgnoreCase)); + //Test regular expression + assertFalse(responseContext.containsHeaderString("header1", "; | ,", "value2"::equalsIgnoreCase)); + //White space in value not trimmed + assertFalse(responseContext.containsHeaderString("header1", "whitespace"::equalsIgnoreCase)); + //Multiple character separator + assertTrue(responseContext.containsHeaderString("header2", "::", "Value5"::equalsIgnoreCase)); + //Test default separator is comma + assertFalse(responseContext.containsHeaderString("header3","value6"::equalsIgnoreCase)); } }; Response response = Response.ok() - .header(header1, value1) - .header(header1, value2) - .header(header2, value3) + .header("header1", "value") + .header("header1", "value1 , value2") + .header("header1", "Value3,white space ") + .header("header2", "Value4::Value5") + .header("header3", "value6;value7") .build(); invokeWithResponseAndAssertStatus(response, Status.OK, in); }