From 27e9c9f42469aa0a895299321a57326919da0d1c Mon Sep 17 00:00:00 2001 From: Olivier Lamy Date: Wed, 30 Mar 2022 21:41:19 +1000 Subject: [PATCH 1/2] add configuration of InferredEncodings Signed-off-by: Olivier Lamy --- .../AbstractJettyEmbeddedConfiguration.java | 23 +++++++++++++++++++ .../embedded_11/JettyEmbeddedContainer.java | 4 ++++ 2 files changed, 27 insertions(+) diff --git a/jetty-common/src/main/java/org/jboss/arquillian/container/jetty/AbstractJettyEmbeddedConfiguration.java b/jetty-common/src/main/java/org/jboss/arquillian/container/jetty/AbstractJettyEmbeddedConfiguration.java index 3ff504b..6e09edf 100644 --- a/jetty-common/src/main/java/org/jboss/arquillian/container/jetty/AbstractJettyEmbeddedConfiguration.java +++ b/jetty-common/src/main/java/org/jboss/arquillian/container/jetty/AbstractJettyEmbeddedConfiguration.java @@ -38,6 +38,8 @@ public abstract class AbstractJettyEmbeddedConfiguration implements ContainerCon private Map mimeTypes; + private Map inferredEncodings; + private int headerBufferSize = 0; private File realmProperties; @@ -167,4 +169,25 @@ public boolean isUseArchiveNameAsContext() { public void setUseArchiveNameAsContext(boolean useArchiveNameAsContext) { this.useArchiveNameAsContext = useArchiveNameAsContext; } + + public void setInferredEncodings(String inferredEncodings) { + this.inferredEncodings = new HashMap<>(); + String[] splittedLines = inferredEncodings.split(" "); + for (int i = 0; i < splittedLines.length; i += 2) { + if (i + 1 >= splittedLines.length) { + throw new ConfigurationException(String.format( + "Mime Type definition should follow the format [ ]*, for example js application/javascript but %s definition has been found.", + inferredEncodings)); + } + this.inferredEncodings.put(splittedLines[i], splittedLines[i + 1]); + } + } + + public boolean areInferredEncodings() { + return this.inferredEncodings != null; + } + + public Map getInferredEncodings() { + return inferredEncodings; + } } diff --git a/jetty-embedded-11/src/main/java/org/jboss/arquillian/container/jetty/embedded_11/JettyEmbeddedContainer.java b/jetty-embedded-11/src/main/java/org/jboss/arquillian/container/jetty/embedded_11/JettyEmbeddedContainer.java index 39e0f84..037479b 100644 --- a/jetty-embedded-11/src/main/java/org/jboss/arquillian/container/jetty/embedded_11/JettyEmbeddedContainer.java +++ b/jetty-embedded-11/src/main/java/org/jboss/arquillian/container/jetty/embedded_11/JettyEmbeddedContainer.java @@ -183,6 +183,10 @@ public void start() throws LifecycleException { server.addBean(hashUserRealm); } + if (containerConfig.areInferredEncodings()) { + containerConfig.getInferredEncodings().forEach((s, s2) -> MimeTypes.getInferredEncodings().put(s, s2)); + } + server.setDumpAfterStart(containerConfig.isDumpServerAfterStart()); log.info("Starting Jetty Embedded Server " + Server.getVersion() + " [id:" + server.hashCode() + "]"); server.start(); From 12d10aad2248f84cd8426e79adad5bc40d2e4b14 Mon Sep 17 00:00:00 2001 From: Olivier Lamy Date: Thu, 31 Mar 2022 07:00:42 +1000 Subject: [PATCH 2/2] add test Signed-off-by: Olivier Lamy --- .../JettyEmbeddedClientTestCase.java | 2 +- .../JettyEmbeddedInContainerTestCase.java | 37 ++++++++++++++++ .../jetty/embedded_11/MyEncodingServlet.java | 43 +++++++++++++++++++ .../src/test/resources/arquillian.xml | 3 ++ 4 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 jetty-embedded-11/src/test/java/org/jboss/arquillian/container/jetty/embedded_11/MyEncodingServlet.java diff --git a/jetty-embedded-11/src/test/java/org/jboss/arquillian/container/jetty/embedded_11/JettyEmbeddedClientTestCase.java b/jetty-embedded-11/src/test/java/org/jboss/arquillian/container/jetty/embedded_11/JettyEmbeddedClientTestCase.java index e05aeb1..7634b09 100644 --- a/jetty-embedded-11/src/test/java/org/jboss/arquillian/container/jetty/embedded_11/JettyEmbeddedClientTestCase.java +++ b/jetty-embedded-11/src/test/java/org/jboss/arquillian/container/jetty/embedded_11/JettyEmbeddedClientTestCase.java @@ -83,7 +83,7 @@ public void shouldEnrichTestWithServletContext() { assertThat(servletContext, notNullValue()); } - private String readAllAndClose(InputStream is) throws Exception { + public static String readAllAndClose(InputStream is) throws Exception { try (is;ByteArrayOutputStream out = new ByteArrayOutputStream()) { int read; while ((read = is.read()) != -1) { diff --git a/jetty-embedded-11/src/test/java/org/jboss/arquillian/container/jetty/embedded_11/JettyEmbeddedInContainerTestCase.java b/jetty-embedded-11/src/test/java/org/jboss/arquillian/container/jetty/embedded_11/JettyEmbeddedInContainerTestCase.java index e6811c5..bf3f26d 100644 --- a/jetty-embedded-11/src/test/java/org/jboss/arquillian/container/jetty/embedded_11/JettyEmbeddedInContainerTestCase.java +++ b/jetty-embedded-11/src/test/java/org/jboss/arquillian/container/jetty/embedded_11/JettyEmbeddedInContainerTestCase.java @@ -16,25 +16,34 @@ */ package org.jboss.arquillian.container.jetty.embedded_11; +import java.net.URL; import java.sql.Connection; import jakarta.annotation.Resource; import jakarta.inject.Inject; import javax.sql.DataSource; +import org.hamcrest.core.StringContains; import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.container.test.api.OperateOnDeployment; import org.jboss.arquillian.junit5.ArquillianExtension; +import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.shrinkwrap.api.GenericArchive; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.EmptyAsset; +import org.jboss.shrinkwrap.api.asset.StringAsset; import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.jboss.shrinkwrap.descriptor.api.Descriptors; +import org.jboss.shrinkwrap.descriptor.api.webapp30.WebAppDescriptor; import org.jboss.shrinkwrap.resolver.api.maven.Maven; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; +import static org.jboss.arquillian.container.jetty.embedded_11.JettyEmbeddedClientTestCase.readAllAndClose; /** * In-container test case for the Jetty Embedded 9 container @@ -65,6 +74,24 @@ public static WebArchive getTestArchive() { .setWebXML("in-container-web.xml"); } + @Deployment(name="encoding") + public static WebArchive getEncodingTestArchive() { + return ShrinkWrap.create(WebArchive.class) + .addClass(MyEncodingServlet.class) + .setWebXML(new StringAsset(Descriptors.create(WebAppDescriptor.class) + .version("4.0") + .createServlet() + .servletClass(MyEncodingServlet.class.getName()) + .servletName("encoding").up() + .createServletMapping() + .servletName("encoding") + .urlPattern(MyEncodingServlet.URL_PATTERN).up() + .exportAsString())); + } + + @ArquillianResource @OperateOnDeployment("encoding") + private URL encodingUrl; + // defined in jetty-env.xml, scoped to global @Resource(mappedName = "version") Integer version; @@ -95,4 +122,14 @@ public void shouldBeAbleToInjectMembersIntoTestClass() throws Exception { //Assert.assertNotNull(testBean); //Assert.assertEquals("Jetty", testBean.getName()); } + + @Test + public void shouldBeEncodingDefined() throws Exception { + String body = readAllAndClose(new URL(encodingUrl, MyEncodingServlet.URL_PATTERN).openStream()); + + assertThat( + "Should contains iso-8859-1", + body, + StringContains.containsString("iso-8859-1")); + } } diff --git a/jetty-embedded-11/src/test/java/org/jboss/arquillian/container/jetty/embedded_11/MyEncodingServlet.java b/jetty-embedded-11/src/test/java/org/jboss/arquillian/container/jetty/embedded_11/MyEncodingServlet.java new file mode 100644 index 0000000..779d29f --- /dev/null +++ b/jetty-embedded-11/src/test/java/org/jboss/arquillian/container/jetty/embedded_11/MyEncodingServlet.java @@ -0,0 +1,43 @@ +/* + * JBoss, Home of Professional Open Source + * Copyright 2010, Red Hat Middleware LLC, and individual contributors + * by the @authors tag. See the copyright.txt in the distribution for a + * full listing of individual contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jboss.arquillian.container.jetty.embedded_11; + +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; + +/** + * MyEncodingServlet + * + */ +public class MyEncodingServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + public static final String URL_PATTERN = "encoding"; + + + @Override + protected void service(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + response.setContentType("text/html"); + String encoding = response.getCharacterEncoding(); + response.getWriter().append(encoding); + } +} diff --git a/jetty-embedded-11/src/test/resources/arquillian.xml b/jetty-embedded-11/src/test/resources/arquillian.xml index 2deb52e..7e31d63 100644 --- a/jetty-embedded-11/src/test/resources/arquillian.xml +++ b/jetty-embedded-11/src/test/resources/arquillian.xml @@ -15,6 +15,9 @@ js application/js txt text/plain + + text/html iso-8859-1 +