You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2017/07/10 20:48:32 UTC

svn commit: r1801530 - in /tomcat/trunk: java/org/apache/catalina/servlets/DefaultServlet.java webapps/docs/changelog.xml

Author: markt
Date: Mon Jul 10 20:48:32 2017
New Revision: 1801530

URL: http://svn.apache.org/viewvc?rev=1801530&view=rev
Log:
Correct a regression in the fix for bug 49464 that could cause an incorrect Content-Length header to be sent by the DefaultServlet if the encoding of a static is not consistent with the encoding of the response.

Modified:
    tomcat/trunk/java/org/apache/catalina/servlets/DefaultServlet.java
    tomcat/trunk/webapps/docs/changelog.xml

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=1801530&r1=1801529&r2=1801530&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/servlets/DefaultServlet.java (original)
+++ tomcat/trunk/java/org/apache/catalina/servlets/DefaultServlet.java Mon Jul 10 20:48:32 2017
@@ -962,6 +962,18 @@ public class DefaultServlet extends Http
             ranges = FULL;
         }
 
+        String outputEncoding = response.getCharacterEncoding();
+        Charset charset = B2CConverter.getCharset(outputEncoding);
+        boolean conversionRequired;
+        if (isText(contentType) && !charset.equals(fileEncodingCharset)) {
+            conversionRequired = true;
+            // Conversion often results fewer/more/different bytes.
+            // That does not play nicely with range requests.
+            ranges = FULL;
+        } else {
+            conversionRequired = false;
+        }
+
         if (resource.isDirectory() ||
                 isError ||
                 ( (ranges == null || ranges.isEmpty())
@@ -981,8 +993,8 @@ public class DefaultServlet extends Http
                     log("DefaultServlet.serveFile:  contentLength=" +
                         contentLength);
                 // Don't set a content length if something else has already
-                // written to the response.
-                if (contentWritten == 0) {
+                // written to the response or if conversion will be taking place
+                if (contentWritten == 0 && !conversionRequired) {
                     response.setContentLengthLong(contentLength);
                 }
             }
@@ -1010,9 +1022,21 @@ public class DefaultServlet extends Http
                     } else {
                         // Output is content of resource
                         // Check to see if conversion is required
-                        String outputEncoding = response.getCharacterEncoding();
-                        Charset charset = B2CConverter.getCharset(outputEncoding);
-                        if (!isText(contentType) || charset.equals(fileEncodingCharset)) {
+                        if (conversionRequired) {
+                            // A conversion is required from fileEncoding to
+                            // response encoding
+                            byte[] resourceBody = resource.getContent();
+                            InputStream source;
+                            if (resourceBody == null) {
+                                source = resource.getInputStream();
+                            } else {
+                                source = new ByteArrayInputStream(resourceBody);
+                            }
+                            OutputStreamWriter osw = new OutputStreamWriter(ostream, charset);
+                            PrintWriter pw = new PrintWriter(osw);
+                            copy(source, pw, fileEncoding);
+                            pw.flush();
+                        } else {
                             if (!checkSendfile(request, response, resource,
                                     contentLength, null)) {
                                 // sendfile not possible so check if resource
@@ -1027,20 +1051,6 @@ public class DefaultServlet extends Http
                                     ostream.write(resourceBody);
                                 }
                             }
-                        } else {
-                            // A conversion is required from fileEncoding to
-                            // response encoding
-                            byte[] resourceBody = resource.getContent();
-                            InputStream source;
-                            if (resourceBody == null) {
-                                source = resource.getInputStream();
-                            } else {
-                                source = new ByteArrayInputStream(resourceBody);
-                            }
-                            OutputStreamWriter osw = new OutputStreamWriter(ostream, charset);
-                            PrintWriter pw = new PrintWriter(osw);
-                            copy(source, pw, fileEncoding);
-                            pw.flush();
                         }
                     }
                     // If a stream was configured, it needs to be copied to

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1801530&r1=1801529&r2=1801530&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Mon Jul 10 20:48:32 2017
@@ -62,6 +62,12 @@
         <code>UnsupportedEncodingException</code> if the user agent specifies
         an unsupported character encoding. (markt)
       </fix>
+      <fix>
+        Correct a regression in the fix for <bug>49464</bug> that could cause an
+        incorrect <code>Content-Length</code> header to be sent by the
+        <code>DefaultServlet</code> if the encoding of a static is not
+        consistent with the encoding of the response. (markt)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Coyote">



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org