This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch 9.0.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/9.0.x by this push: new ad9b73a992 Fix a TCK failure for JSP include then forward ad9b73a992 is described below commit ad9b73a9922f10cf325438dc0449e75dd7fe5f1a Author: Mark Thomas <ma...@apache.org> AuthorDate: Tue Mar 12 12:26:56 2024 +0000 Fix a TCK failure for JSP include then forward Handle the case where the JSP engine forwards a request/response to a Servlet that uses an OutputStream rather than a Writer. This was triggering an IllegalStateException on code paths where there was a subsequent attempt to obtain a Writer. This had been returning the correct body but with a 500 response. The older TCKs didn't notice the 500 response. The refactored TCK used in Jakarta EE 11 did. --- java/org/apache/jasper/runtime/JspWriterImpl.java | 12 +++++++++++- .../apache/jasper/runtime/TestPageContextImpl.java | 17 +++++++++++++++++ test/webapp/jsp/forward.jsp | 17 +++++++++++++++++ test/webapp/jsp/includeThenForward.jsp | 19 +++++++++++++++++++ test/webapp/jsp/ok.html | 5 +++++ webapps/docs/changelog.xml | 11 +++++++++++ 6 files changed, 80 insertions(+), 1 deletion(-) diff --git a/java/org/apache/jasper/runtime/JspWriterImpl.java b/java/org/apache/jasper/runtime/JspWriterImpl.java index 2b3d34c5c7..263df987dc 100644 --- a/java/org/apache/jasper/runtime/JspWriterImpl.java +++ b/java/org/apache/jasper/runtime/JspWriterImpl.java @@ -17,6 +17,7 @@ package org.apache.jasper.runtime; import java.io.IOException; +import java.io.PrintWriter; import java.io.Writer; import javax.servlet.ServletResponse; @@ -115,7 +116,16 @@ public class JspWriterImpl extends JspWriter { private void initOut() throws IOException { if (out == null) { - out = response.getWriter(); + try { + out = response.getWriter(); + } catch (IllegalStateException e) { + /* + * At some point in the processing something (most likely the default servlet as the target of a + * <jsp:forward ... /> action) wrote directly to the OutputStream rather than the Writer. Wrap the + * OutputStream in a Writer so the JSp engine can use the Writer it is expecting to use. + */ + out = new PrintWriter(response.getOutputStream()); + } } } diff --git a/test/org/apache/jasper/runtime/TestPageContextImpl.java b/test/org/apache/jasper/runtime/TestPageContextImpl.java index d385d5263a..7f67009630 100644 --- a/test/org/apache/jasper/runtime/TestPageContextImpl.java +++ b/test/org/apache/jasper/runtime/TestPageContextImpl.java @@ -120,4 +120,21 @@ public class TestPageContextImpl extends TomcatBaseTest { } } + + + @Test + public void testIncludeThenForward() throws Exception { + getTomcatInstanceTestWebapp(false, true); + + ByteChunk res = new ByteChunk(); + + int rc = getUrl("http://localhost:" + getPort() + + "/test/jsp/includeThenForward.jsp", res, null); + + Assert.assertEquals(HttpServletResponse.SC_OK, rc); + + String body = res.toString(); + Assert.assertTrue(body.contains("OK")); + Assert.assertFalse(body.contains("FAIL")); + } } diff --git a/test/webapp/jsp/forward.jsp b/test/webapp/jsp/forward.jsp new file mode 100644 index 0000000000..eb87acd5fe --- /dev/null +++ b/test/webapp/jsp/forward.jsp @@ -0,0 +1,17 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. +--%> +<jsp:forward page="ok.html" /> diff --git a/test/webapp/jsp/includeThenForward.jsp b/test/webapp/jsp/includeThenForward.jsp new file mode 100644 index 0000000000..9c17bcce37 --- /dev/null +++ b/test/webapp/jsp/includeThenForward.jsp @@ -0,0 +1,19 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. +--%> +<p>FAIL</p> +<jsp:include page="forward.jsp" /> +<p>FAIL</p> \ No newline at end of file diff --git a/test/webapp/jsp/ok.html b/test/webapp/jsp/ok.html new file mode 100644 index 0000000000..35b67d7844 --- /dev/null +++ b/test/webapp/jsp/ok.html @@ -0,0 +1,5 @@ +<html> + <body> + <p>OK</p> + </body> +</html> \ No newline at end of file diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index c071e75c73..f5b2c90c67 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -120,6 +120,17 @@ </add> </changelog> </subsection> + <subsection name="Jasper"> + <changelog> + <fix> + Handle the case where the JSP engine forwards a request/response to a + Servlet that uses an <code>OutputStream</code> rather than a + <code>Writer</code>. This was triggering an + <code>IllegalStateException</code> on code paths where there was a + subsequent attempt to obtain a <code>Writer</code>. (markt) + </fix> + </changelog> + </subsection> </section> <section name="Tomcat 9.0.87 (remm)" rtext="release in progress"> <subsection name="Catalina"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org