diff --git a/http/webapp/src/main/java/cloud/piranha/http/webapp/HttpWebApplicationRequest.java b/http/webapp/src/main/java/cloud/piranha/http/webapp/HttpWebApplicationRequest.java index 9bf5b964e..c4db807ed 100644 --- a/http/webapp/src/main/java/cloud/piranha/http/webapp/HttpWebApplicationRequest.java +++ b/http/webapp/src/main/java/cloud/piranha/http/webapp/HttpWebApplicationRequest.java @@ -89,6 +89,15 @@ private void populateRequest(HttpServerRequest serverRequest) { while (headerNames.hasNext()) { String name = headerNames.next(); String value = serverRequest.getHeader(name); + + /* + * If the request is passing in an Accept header we should honor it + * and remove the default Accept header. + */ + if (name.equalsIgnoreCase("Accept")) { + headerManager.removeHeader("Accept"); + } + serverRequest.getHeaders(name).forEachRemaining(x -> addHeader(name, x)); if (name.equalsIgnoreCase("Content-Type")) { setContentType(value); diff --git a/test/coreprofile/integration/src/main/java/cloud/piranha/test/coreprofile/distribution/ProducesBean.java b/test/coreprofile/integration/src/main/java/cloud/piranha/test/coreprofile/distribution/ProducesBean.java new file mode 100644 index 000000000..8b31a9e65 --- /dev/null +++ b/test/coreprofile/integration/src/main/java/cloud/piranha/test/coreprofile/distribution/ProducesBean.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2002-2024 Manorrock.com. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +package cloud.piranha.test.coreprofile.distribution; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import static jakarta.ws.rs.core.MediaType.TEXT_PLAIN; + +/** + * The bean to test the Produces annotation. + * + * @author Manfred Riem (mriem@manorrock.com) + */ +@Path("produces") +public class ProducesBean { + + /** + * Test to validate NOT_ACCEPTABLE (406) is returned. + * + * @return "This should not show up!" + */ + @GET + @Path("notAcceptable") + @Produces(TEXT_PLAIN) + public String notAcceptable() { + return "This should not show up!"; + } +} diff --git a/test/coreprofile/integration/src/test/java/cloud/piranha/test/coreprofile/distribution/ProducesIT.java b/test/coreprofile/integration/src/test/java/cloud/piranha/test/coreprofile/distribution/ProducesIT.java new file mode 100644 index 000000000..fdffe2eb3 --- /dev/null +++ b/test/coreprofile/integration/src/test/java/cloud/piranha/test/coreprofile/distribution/ProducesIT.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2002-2024 Manorrock.com. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +package cloud.piranha.test.coreprofile.distribution; + +import org.junit.jupiter.api.Test; + +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +public class ProducesIT { + + @Test + public void notAcceptable() throws Exception { + HttpClient client = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create("http://localhost:" + + System.getProperty("httpPort") + + "/piranha-test-coreprofile-integration/produces/notAcceptable")) + .header("Accept", "text/xml") + .GET() + .build(); + + HttpResponse response = client.send(request, + HttpResponse.BodyHandlers.ofString()); + + assertEquals(406, response.statusCode()); + assertNotEquals("This should not show up!", response.body()); + } +}