Author: markt Date: Mon Jul 31 19:47:49 2017 New Revision: 1803563 URL: http://svn.apache.org/viewvc?rev=1803563&view=rev Log: Re-write the unit tests for the automatic encoding conversion in the Default Servlet. The new unit tests use a parameterized approach that significantly increases the number of tests. These tests also highlighted some addition bugs that are fixed by this patch: - Reporting the context default character encoding is now correctly treated as if no encoding has been explicitly defined - Included resources are not converted unless an explicit encoding has been specified
Added: tomcat/trunk/test/org/apache/catalina/servlets/TestDefaultServletEncoding.java (with props) tomcat/trunk/test/webapp/bug49nnn/bug49464-cp1252.txt (with props) tomcat/trunk/test/webapp/bug49nnn/bug49464-iso-8859-1.txt (with props) tomcat/trunk/test/webapp/bug49nnn/bug49464-utf-8-bom.txt (props changed) - copied unchanged from r1803562, tomcat/trunk/test/webapp/bug49nnn/bug49464-utf8-bom.txt tomcat/trunk/test/webapp/bug49nnn/bug49464-utf-8.txt (with props) Removed: tomcat/trunk/test/webapp/bug49nnn/bug49464-utf8-bom.txt Modified: tomcat/trunk/java/org/apache/catalina/core/StandardContext.java tomcat/trunk/java/org/apache/catalina/servlets/DefaultServlet.java tomcat/trunk/test/org/apache/catalina/servlets/TestDefaultServlet.java tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/catalina/core/StandardContext.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardContext.java?rev=1803563&r1=1803562&r2=1803563&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/core/StandardContext.java (original) +++ tomcat/trunk/java/org/apache/catalina/core/StandardContext.java Mon Jul 31 19:47:49 2017 @@ -834,7 +834,13 @@ public class StandardContext extends Con @Override public void setResponseCharacterEncoding(String responseEncoding) { - this.responseEncoding = responseEncoding; + /* + * This ensures that the context response encoding is represented by a + * unique String object. This enables the Default Servlet to + * differentiate between a Response using this default encoding and one + * that has been explicitly configured. + */ + this.responseEncoding = new String(responseEncoding); } Modified: tomcat/trunk/java/org/apache/catalina/servlets/DefaultServlet.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/servlets/DefaultServlet.java?rev=1803563&r1=1803562&r2=1803563&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/servlets/DefaultServlet.java (original) +++ tomcat/trunk/java/org/apache/catalina/servlets/DefaultServlet.java Mon Jul 31 19:47:49 2017 @@ -984,8 +984,10 @@ public class DefaultServlet extends Http * may have been wrapped. The != test is a (slightly hacky) quick way of * doing this. */ - if (!usingPrecompressedVersion && isText(contentType) && + boolean outputEncodingSpecified = outputEncoding != org.apache.coyote.Constants.DEFAULT_BODY_CHARSET.name() && + outputEncoding != resources.getContext().getResponseCharacterEncoding(); + if (!usingPrecompressedVersion && isText(contentType) && outputEncodingSpecified && !charset.equals(fileEncodingCharset)) { conversionRequired = true; // Conversion often results fewer/more/different bytes. @@ -1065,10 +1067,18 @@ public class DefaultServlet extends Http if (bomCharset != null && useBomIfPresent) { inputEncoding = bomCharset.name(); } - OutputStreamWriter osw = new OutputStreamWriter(ostream, charset); - PrintWriter pw = new PrintWriter(osw); - copy(source, pw, inputEncoding); - pw.flush(); + // Following test also ensures included resources + // are converted if an explicit output encoding was + // specified + if (outputEncodingSpecified) { + OutputStreamWriter osw = new OutputStreamWriter(ostream, charset); + PrintWriter pw = new PrintWriter(osw); + copy(source, pw, inputEncoding); + pw.flush(); + } else { + // Just included but no conversion + renderResult = source; + } } else { if (!checkSendfile(request, response, resource, contentLength, null)) { // sendfile not possible so check if resource Modified: tomcat/trunk/test/org/apache/catalina/servlets/TestDefaultServlet.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/servlets/TestDefaultServlet.java?rev=1803563&r1=1803562&r2=1803563&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/catalina/servlets/TestDefaultServlet.java (original) +++ tomcat/trunk/test/org/apache/catalina/servlets/TestDefaultServlet.java Mon Jul 31 19:47:49 2017 @@ -20,9 +20,7 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; -import java.io.StringReader; import java.io.Writer; -import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; @@ -31,10 +29,6 @@ import java.util.Locale; import java.util.Map; import java.util.TimeZone; -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import static org.junit.Assert.assertEquals; @@ -52,10 +46,8 @@ import org.apache.catalina.Wrapper; import org.apache.catalina.startup.SimpleHttpClient; import org.apache.catalina.startup.Tomcat; import org.apache.catalina.startup.TomcatBaseTest; -import org.apache.tomcat.util.buf.B2CConverter; import org.apache.tomcat.util.buf.ByteChunk; import org.apache.tomcat.util.descriptor.web.ErrorPage; -import org.apache.tomcat.util.http.parser.MediaType; import org.apache.tomcat.websocket.server.WsContextListener; public class TestDefaultServlet extends TomcatBaseTest { @@ -622,205 +614,4 @@ public class TestDefaultServlet extends return true; } } - - @Test - public void testEncodingIncludeIbm850StreamOutIso88591() throws Exception { - doTestEncodingFileIbm850(false, "ISO-8859-1"); - } - - @Test - public void testEncodingIncludeIbm850WriterOutIso88591() throws Exception { - doTestEncodingFileIbm850(true, "ISO-8859-1"); - } - - @Test - public void testEncodingIncludeIbm850StreamOutUtf8() throws Exception { - doTestEncodingFileIbm850(false, "UTF-8"); - } - - @Test - public void testEncodingIncludeIbm850WriterOutUtf8() throws Exception { - doTestEncodingFileIbm850(true, "UTF-8"); - } - - @Test - public void testEncodingIncludeIbm850StreamOutIbm850() throws Exception { - doTestEncodingFileIbm850(false, "IBM850"); - } - - @Test - public void testEncodingIncludeIbm850WriterOutIbm850() throws Exception { - doTestEncodingFileIbm850(false, "IBM850"); - } - - @Test - public void testEncodingIncludeUtf8BomStreamOutIso88591() throws Exception { - doTestEncodingFileUtf8Bom(false, "ISO-8859-1"); - } - - @Test - public void testEncodingIncludeUtf8BomWriterOutIso88591() throws Exception { - doTestEncodingFileUtf8Bom(true, "ISO-8859-1"); - } - - @Test - public void testEncodingIncludeUtf8BomStreamOutUtf8() throws Exception { - doTestEncodingFileUtf8Bom(false, "UTF-8"); - } - - @Test - public void testEncodingIncludeUtf8BomWriterOutUtf8() throws Exception { - doTestEncodingFileUtf8Bom(true, "UTF-8"); - } - - @Test - public void testEncodingIncludeUtf8BomStreamOutIbm850() throws Exception { - doTestEncodingFileUtf8Bom(false, "IBM850"); - } - - @Test - public void testEncodingIncludeUtf8BomWriterOutIbm850() throws Exception { - doTestEncodingFileUtf8Bom(false, "IBM850"); - } - - @Test - public void testEncodingIncludeUtf8BomOverrideStreamOutIso88591() throws Exception { - doTestEncodingFileUtf8BomOverride(false, "ISO-8859-1"); - } - - @Test - public void testEncodingIncludeUtf8BomOverrideWriterOutIso88591() throws Exception { - doTestEncodingFileUtf8BomOverride(true, "ISO-8859-1"); - } - - @Test - public void testEncodingIncludeUtf8BomOverrideStreamOutUtf8() throws Exception { - doTestEncodingFileUtf8BomOverride(false, "UTF-8"); - } - - @Test - public void testEncodingIncludeUtf8BomOverrideWriterOutUtf8() throws Exception { - doTestEncodingFileUtf8BomOverride(true, "UTF-8"); - } - - @Test - public void testEncodingIncludeUtf8BomOverrideStreamOutIbm850() throws Exception { - doTestEncodingFileUtf8BomOverride(false, "IBM850"); - } - - @Test - public void testEncodingIncludeUtf8BomOverrideWriterOutIbm850() throws Exception { - doTestEncodingFileUtf8BomOverride(false, "IBM850"); - } - - private void doTestEncodingFileIbm850(boolean useWriter, String outputEncoding) - throws Exception { - doTestEncoding("/bug49nnn/bug49464-ibm850.txt", "IBM850", useWriter, outputEncoding); - } - - private void doTestEncodingFileUtf8Bom(boolean useWriter, String outputEncoding) - throws Exception { - doTestEncoding("/bug49nnn/bug49464-utf8-bom.txt", "UTF-8", useWriter, outputEncoding); - } - - private void doTestEncodingFileUtf8BomOverride(boolean useWriter, String outputEncoding) - throws Exception { - doTestEncoding("/bug49nnn/bug49464-utf8-bom.txt", "IBM850", useWriter, outputEncoding); - } - - private void doTestEncoding(String includePath, String inputEncoding, boolean useWriter, - String outputEncoding) throws Exception { - Tomcat tomcat = getTomcatInstance(); - - File appDir = new File("test/webapp"); - - Context ctxt = tomcat.addContext("", appDir.getAbsolutePath()); - - Wrapper defaultServlet = Tomcat.addServlet(ctxt, "default", DefaultServlet.class.getName()); - defaultServlet.addInitParameter("fileEncoding", inputEncoding); - ctxt.addServletMappingDecoded("/", "default"); - - Tomcat.addServlet(ctxt, "encoding", - new EncodingServlet(outputEncoding, includePath, useWriter)); - ctxt.addServletMappingDecoded("/test", "encoding"); - - tomcat.start(); - - final ByteChunk res = new ByteChunk(); - Map<String,List<String>> headers = new HashMap<>(); - - int rc = getUrl("http://localhost:" + getPort() + "/test", res, headers); - - Assert.assertEquals(HttpServletResponse.SC_OK, rc); - List<String> values = headers.get("Content-Type"); - if (values.size() == 1) { - MediaType mediaType = MediaType.parseMediaType(new StringReader(values.get(0))); - String charset = mediaType.getCharset(); - if (charset == null) { - res.setCharset(StandardCharsets.ISO_8859_1); - } else { - res.setCharset(B2CConverter.getCharset(charset)); - } - } else { - res.setCharset(StandardCharsets.ISO_8859_1); - } - Assert.assertEquals("\u00bd", res.toString()); - } - - @Test - public void testEncodingDirect() throws Exception { - Tomcat tomcat = getTomcatInstance(); - - File appDir = new File("test/webapp"); - - Context ctxt = tomcat.addContext("", appDir.getAbsolutePath()); - - Wrapper defaultServlet = Tomcat.addServlet(ctxt, "default", DefaultServlet.class.getName()); - defaultServlet.addInitParameter("fileEncoding", "IBM850"); - ctxt.addServletMappingDecoded("/", "default"); - - tomcat.start(); - - final ByteChunk res = new ByteChunk(); - Map<String,List<String>> headers = new HashMap<>(); - - int rc = getUrl("http://localhost:" + getPort() + "/bug49nnn/bug49464-ibm850.txt", - res, headers); - - // This test relies on no content-type being specified in the response - // and the user agent correctly figuring out the content type - Assert.assertEquals(HttpServletResponse.SC_OK, rc); - List<String> values = headers.get("Content-Type"); - Assert.assertNull(values); - res.setCharset(B2CConverter.getCharset("IBM850")); - Assert.assertEquals("\u00bd", res.toString()); - } - - private static class EncodingServlet extends HttpServlet { - - private static final long serialVersionUID = 1L; - - private final String outputEncoding; - private final String includeTarget; - private final boolean useWriter; - - public EncodingServlet(String outputEncoding, String includeTarget, boolean useWriter) { - this.outputEncoding = outputEncoding; - this.includeTarget = includeTarget; - this.useWriter = useWriter; - } - - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) - throws ServletException, IOException { - resp.setContentType("text/plain"); - resp.setCharacterEncoding(outputEncoding); - if (useWriter) { - resp.getWriter(); - } - resp.flushBuffer(); - RequestDispatcher rd = req.getRequestDispatcher(includeTarget); - rd.include(req, resp); - } - } } Added: tomcat/trunk/test/org/apache/catalina/servlets/TestDefaultServletEncoding.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/servlets/TestDefaultServletEncoding.java?rev=1803563&view=auto ============================================================================== --- tomcat/trunk/test/org/apache/catalina/servlets/TestDefaultServletEncoding.java (added) +++ tomcat/trunk/test/org/apache/catalina/servlets/TestDefaultServletEncoding.java Mon Jul 31 19:47:49 2017 @@ -0,0 +1,284 @@ +/* + * 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. + */ +package org.apache.catalina.servlets; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import org.apache.catalina.Context; +import org.apache.catalina.Wrapper; +import org.apache.catalina.startup.Tomcat; +import org.apache.catalina.startup.TomcatBaseTest; +import org.apache.tomcat.util.buf.B2CConverter; +import org.apache.tomcat.util.buf.ByteChunk; +import org.apache.tomcat.util.http.parser.MediaType; + +@RunWith(Parameterized.class) +public class TestDefaultServletEncoding extends TomcatBaseTest { + + @Parameterized.Parameters(name = "{index}: contextEnc[{0}], fileEnc[{1}], useBom[{2}]," + + " target[{3}], useInclude[{4}], outputEnc[{5}], callSetCharacterEnc[{6}]," + + " useWriter[{7}], expectedPass[{8}]") + public static Collection<Object[]> parameters() { + + String[] encodings = new String[] { + "utf-8", "ibm850", "cp1252", "iso-8859-1" }; + + String[] targetFiles = new String[] { + "cp1252", "ibm850", "iso-8859-1", "utf-8-bom", "utf-8" }; + + Boolean[] booleans = new Boolean[] { Boolean.FALSE, Boolean.TRUE }; + + List<Object[]> parameterSets = new ArrayList<>(); + + for (String contextResponseEncoding : encodings) { + for (String fileEncoding : encodings) { + for (Boolean useBom : booleans) { + for (String targetFile : targetFiles) { + for (Boolean useInclude : booleans) { + if (useInclude.booleanValue()) { + for (String outputEncoding : encodings) { + for (Boolean callSetCharacterEncoding : booleans) { + for (Boolean useWriter : booleans) { + Boolean expected = getExpected(fileEncoding, useBom, + targetFile, outputEncoding, + callSetCharacterEncoding, useWriter); + + parameterSets.add(new Object[] { + contextResponseEncoding, fileEncoding, useBom, + targetFile, useInclude, outputEncoding, + callSetCharacterEncoding, useWriter, expected + }); + } + } + } + } else { + /* + * Not using include so ignore outputEncoding, + * callSetCharacterEncoding and useWriter + * + * Tests that do not use include are always expected to + * pass. + */ + String encoding = targetFile; + if (encoding.endsWith("-bom")) { + encoding = encoding.substring(0, encoding.length() - 4); + } + parameterSets.add(new Object[] { contextResponseEncoding, + fileEncoding, useBom, targetFile, useInclude, encoding, + Boolean.FALSE, Boolean.FALSE, Boolean.TRUE }); + } + } + } + } + } + } + + return parameterSets; + } + + + private static Boolean getExpected(String fileEncoding, Boolean useBom, String targetFile, + String outputEncoding, Boolean callSetCharacterEncoding, Boolean useWriter) { + if (useWriter.booleanValue() || callSetCharacterEncoding.booleanValue()) { + /* + * Using a writer or setting the output character encoding means the + * response will specify a character set. These cases therefore + * reduce to can the file be read with the correct encoding. + * (Assuming any BOM is always skipped in the included output.) + */ + if (targetFile.endsWith("-bom") && useBom.booleanValue() || + targetFile.startsWith(fileEncoding) || + targetFile.equals("cp1252") && fileEncoding.equals("iso-8859-1") || + targetFile.equals("iso-8859-1") && fileEncoding.equals("cp1252")) { + return Boolean.TRUE; + } else { + return Boolean.FALSE; + } + } else if (!(targetFile.startsWith(outputEncoding) || + targetFile.equals("cp1252") && outputEncoding.equals("iso-8859-1") || + targetFile.equals("iso-8859-1") && outputEncoding.equals("cp1252"))) { + /* + * The non-writer use cases read the target file as bytes. These + * cases therefore reduce to can the bytes from the target file be + * included in the output without corruption? The character used in + * the tests has been chosen so that, apart from iso-8859-1 and + * cp1252, the bytes vary by character set. + * (Assuming any BOM is always skipped in the included output.) + */ + return Boolean.FALSE; + } else { + return Boolean.TRUE; + } + } + + + private final String contextResponseEncoding; + private final String fileEncoding; + private final boolean useBom; + private final String targetFile; + private final boolean useInclude; + private final String outputEncoding; + private final boolean callSetCharacterEncoding; + private final boolean useWriter; + private final boolean expectedPass; + + public TestDefaultServletEncoding(String contextResponseEncoding, String fileEncoding, + boolean useBom, String targetFile, boolean useInclude, String outputEncoding, + boolean callSetCharacterEncoding, boolean useWriter, boolean expectedPass) { + this.contextResponseEncoding = contextResponseEncoding; + this.fileEncoding = fileEncoding; + this.useBom = useBom; + this.targetFile = targetFile; + this.useInclude = useInclude; + this.outputEncoding = outputEncoding; + this.callSetCharacterEncoding = callSetCharacterEncoding; + this.useWriter = useWriter; + this.expectedPass = expectedPass; + } + + @Test + public void testEncoding() throws Exception { + Tomcat tomcat = getTomcatInstance(); + + File appDir = new File("test/webapp"); + Context ctxt = tomcat.addContext("", appDir.getAbsolutePath()); + ctxt.setResponseCharacterEncoding(contextResponseEncoding); + Wrapper defaultServlet = Tomcat.addServlet(ctxt, "default", DefaultServlet.class.getName()); + defaultServlet.addInitParameter("fileEncoding", fileEncoding); + defaultServlet.addInitParameter("useBomIfPresent", Boolean.toString(useBom)); + + ctxt.addServletMappingDecoded("/", "default"); + + if (useInclude) { + Tomcat.addServlet(ctxt, "include", new EncodingServlet( + outputEncoding, callSetCharacterEncoding, targetFile, useWriter)); + ctxt.addServletMappingDecoded("/include", "include"); + } + + tomcat.start(); + + final ByteChunk res = new ByteChunk(); + Map<String,List<String>> headers = new HashMap<>(); + + String target; + if (useInclude) { + target = "http://localhost:" + getPort() + "/include"; + } else { + target = "http://localhost:" + getPort() + "/bug49nnn/bug49464-" + targetFile + ".txt"; + } + int rc = getUrl(target, res, headers); + + Assert.assertEquals(HttpServletResponse.SC_OK, rc); + List<String> values = headers.get("Content-Type"); + if (values != null && values.size() == 1) { + MediaType mediaType = MediaType.parseMediaType(new StringReader(values.get(0))); + String charset = mediaType.getCharset(); + if (charset == null) { + res.setCharset(B2CConverter.getCharset(outputEncoding)); + } else { + res.setCharset(B2CConverter.getCharset(charset)); + } + } else { + res.setCharset(B2CConverter.getCharset(outputEncoding)); + } + String body = res.toString(); + /* + * Remove BOM before checking content + * BOM (should be) removed by Tomcat when file is included + */ + if (!useInclude && targetFile.endsWith("-bom")) { + body = body.substring(1); + } + + if (expectedPass) { + if (useInclude) { + Assert.assertEquals("\u00bd-\u00bd-\u00bd", body); + } else { + Assert.assertEquals("\u00bd", body); + } + } else { + if (useInclude) { + Assert.assertNotEquals("\u00bd-\u00bd-\u00bd", body); + } else { + Assert.assertNotEquals("\u00bd", body); + } + } + } + + + private static class EncodingServlet extends HttpServlet { + + private static final long serialVersionUID = 1L; + + private final String outputEncoding; + private final boolean callSetCharacterEncoding; + private final String includeTarget; + private final boolean useWriter; + + public EncodingServlet(String outputEncoding, boolean callSetCharacterEncoding, + String includeTarget, boolean useWriter) { + this.outputEncoding = outputEncoding; + this.callSetCharacterEncoding = callSetCharacterEncoding; + this.includeTarget = includeTarget; + this.useWriter = useWriter; + } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + resp.setContentType("text/plain"); + if (callSetCharacterEncoding) { + resp.setCharacterEncoding(outputEncoding); + } + if (useWriter) { + PrintWriter pw = resp.getWriter(); + pw.print("\u00bd-"); + } else { + resp.getOutputStream().write("\u00bd-".getBytes(outputEncoding)); + } + resp.flushBuffer(); + RequestDispatcher rd = + req.getRequestDispatcher("/bug49nnn/bug49464-" + includeTarget + ".txt"); + rd.include(req, resp); + if (useWriter) { + PrintWriter pw = resp.getWriter(); + pw.print("-\u00bd"); + } else { + resp.getOutputStream().write("-\u00bd".getBytes(outputEncoding)); + } + } + } +} Propchange: tomcat/trunk/test/org/apache/catalina/servlets/TestDefaultServletEncoding.java ------------------------------------------------------------------------------ svn:eol-style = native Added: tomcat/trunk/test/webapp/bug49nnn/bug49464-cp1252.txt URL: http://svn.apache.org/viewvc/tomcat/trunk/test/webapp/bug49nnn/bug49464-cp1252.txt?rev=1803563&view=auto ============================================================================== --- tomcat/trunk/test/webapp/bug49nnn/bug49464-cp1252.txt (added) +++ tomcat/trunk/test/webapp/bug49nnn/bug49464-cp1252.txt [cp1252] Mon Jul 31 19:47:49 2017 @@ -0,0 +1 @@ +½ \ No newline at end of file Propchange: tomcat/trunk/test/webapp/bug49nnn/bug49464-cp1252.txt ------------------------------------------------------------------------------ svn:eol-style = native Propchange: tomcat/trunk/test/webapp/bug49nnn/bug49464-cp1252.txt ------------------------------------------------------------------------------ svn:mime-type = text/plain; charset="cp1252" Added: tomcat/trunk/test/webapp/bug49nnn/bug49464-iso-8859-1.txt URL: http://svn.apache.org/viewvc/tomcat/trunk/test/webapp/bug49nnn/bug49464-iso-8859-1.txt?rev=1803563&view=auto ============================================================================== --- tomcat/trunk/test/webapp/bug49nnn/bug49464-iso-8859-1.txt (added) +++ tomcat/trunk/test/webapp/bug49nnn/bug49464-iso-8859-1.txt [ISO-8859-1] Mon Jul 31 19:47:49 2017 @@ -0,0 +1 @@ +½ \ No newline at end of file Propchange: tomcat/trunk/test/webapp/bug49nnn/bug49464-iso-8859-1.txt ------------------------------------------------------------------------------ svn:eol-style = native Propchange: tomcat/trunk/test/webapp/bug49nnn/bug49464-iso-8859-1.txt ------------------------------------------------------------------------------ svn:mime-type = text/plain; charset="ISO-8859-1" Propchange: tomcat/trunk/test/webapp/bug49nnn/bug49464-utf-8-bom.txt ------------------------------------------------------------------------------ svn:eol-style = native Propchange: tomcat/trunk/test/webapp/bug49nnn/bug49464-utf-8-bom.txt ------------------------------------------------------------------------------ svn:mime-type = text/plain; charset="UTF-8" Added: tomcat/trunk/test/webapp/bug49nnn/bug49464-utf-8.txt URL: http://svn.apache.org/viewvc/tomcat/trunk/test/webapp/bug49nnn/bug49464-utf-8.txt?rev=1803563&view=auto ============================================================================== --- tomcat/trunk/test/webapp/bug49nnn/bug49464-utf-8.txt (added) +++ tomcat/trunk/test/webapp/bug49nnn/bug49464-utf-8.txt [UTF-8] Mon Jul 31 19:47:49 2017 @@ -0,0 +1 @@ +½ \ No newline at end of file Propchange: tomcat/trunk/test/webapp/bug49nnn/bug49464-utf-8.txt ------------------------------------------------------------------------------ svn:eol-style = native Propchange: tomcat/trunk/test/webapp/bug49nnn/bug49464-utf-8.txt ------------------------------------------------------------------------------ svn:mime-type = text/plain; charset="UTF-8" Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1803563&r1=1803562&r2=1803563&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Mon Jul 31 19:47:49 2017 @@ -48,10 +48,8 @@ <subsection name="Catalina"> <changelog> <fix> - Correct another regression in the fix for <bug>49464</bug> that could - corrupt static content when no character encoding was explicitly defined - for the response and the <code>DefaultServlet</code> used a - <code>fileEncoding</code> that was not ISO-8859-1.(markt) + Correct multiple regressions in the fix for <bug>49464</bug> that could + corrupt static content served by the <code>DefaultServlet</code>.(markt) </fix> <fix> Correct a bug in the <code>PushBuilder</code> implementation that --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org