Update of /var/cvs/applications/resources/src/org/mmbase/servlet
In directory james.mmbase.org:/tmp/cvs-serv25560

Modified Files:
        HandleServlet.java 
Log Message:
  MMB-1415. Making sure length is always served


See also: 
http://cvs.mmbase.org/viewcvs/applications/resources/src/org/mmbase/servlet
See also: http://www.mmbase.org/jira/browse/MMB-1415


Index: HandleServlet.java
===================================================================
RCS file: 
/var/cvs/applications/resources/src/org/mmbase/servlet/HandleServlet.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- HandleServlet.java  3 Sep 2008 17:18:05 -0000       1.2
+++ HandleServlet.java  26 Sep 2008 10:12:26 -0000      1.3
@@ -17,6 +17,7 @@
 import javax.servlet.http.*;
 
 import org.mmbase.bridge.*;
+import org.mmbase.cache.Cache;
 
 import org.mmbase.util.*;
 import org.mmbase.util.logging.*;
@@ -27,7 +28,7 @@
  * specialized servlets. The mime-type is always application/x-binary, forcing 
the browser to
  * download.
  *
- * @version $Id: HandleServlet.java,v 1.2 2008/09/03 17:18:05 michiel Exp $
+ * @version $Id: HandleServlet.java,v 1.3 2008/09/26 10:12:26 michiel Exp $
  * @author Michiel Meeuwissen
  * @since  MMBase-1.6
  * @see ImageServlet
@@ -40,6 +41,8 @@
 
     private boolean isIECompatibleJpeg = true;
 
+    private static Cache<Integer, Integer> jpegSizes = null;
+
     protected Map getAssociations() {
         Map a = super.getAssociations();
         // Can do the following:
@@ -69,6 +72,18 @@
         if (ieCompat != null) {
             isIECompatibleJpeg = Boolean.valueOf(ieCompat).booleanValue();
         }
+        if (isIECompatibleJpeg && jpegSizes == null) {
+            jpegSizes = new Cache<Integer, Integer>(5000) {
+                public String getName() {
+                    return "JPEGSizes";
+                }
+                public String getDescription() {
+                    return "HandleServlet may ditch some bytes from 
Jpeg-steams to please IE";
+                }
+
+            };
+            jpegSizes.putCache();
+        }
     }
 
     // just to get HandleServlet in the stacktrace.
@@ -228,8 +243,6 @@
         if (node.isNull("handle")) {
             return;
         }
-        InputStream bytes = node.getInputStreamValue("handle");
-
 
         //remove additional information left by PhotoShop 7 in jpegs
         //this information may crash Internet Exploder. that's why you need to 
remove it.
@@ -239,14 +252,23 @@
         //However they break many applications, including Quark and, 
significantly,
         //various versions of Internet Explorer on various platforms.
 
-        boolean canSendLength = true;
+        int jpegLength = -1;
 
-        if (isIECompatibleJpeg) {
-               if (mimeType.equals("image/jpeg") || 
mimeType.equals("image/jpg")) {
-               bytes = new IECompatibleJpegInputStream(bytes);
-               canSendLength = false;
-               //res.setHeader("X-MMBase-IECompatibleJpeg", "This image was 
filtered, because Microsoft Internet Explorer might crash otherwise");
+        final InputStream bytes;
+        if (isIECompatibleJpeg && (mimeType.equals("image/jpeg") || 
mimeType.equals("image/jpg"))) {
+            Integer l = jpegSizes.get(node.getNumber());
+            if (l == null) {
+                byte[] byteArray = 
IECompatibleJpegInputStream.process(node.getByteValue("handle"));
+                l = byteArray.length;
+                jpegSizes.put(node.getNumber(), l);
+                bytes = new ByteArrayInputStream(byteArray);
+            } else {
+                bytes = new 
IECompatibleJpegInputStream(node.getInputStreamValue("handle"));
             }
+            jpegLength = l;
+            res.setHeader("X-MMBase-IECompatibleJpeg", "This image was 
filtered, because Microsoft Internet Explorer might crash otherwise");
+        } else {
+            bytes = node.getInputStreamValue("handle");
         }
 
         if (!setContent(query, node, mimeType)) {
@@ -255,7 +277,7 @@
         setExpires(res, node);
         setCacheControl(res, node);
 
-        if (canSendLength) {
+        if (jpegLength == -1) {
             int size = -1;
             if (manager.hasField("size")) {
                 size = node.getIntValue("size");
@@ -267,7 +289,8 @@
             }
             log.debug("Serving node " + node.getNumber() + " with bytes " + 
size);
         } else {
-            log.debug("Serving node " + node.getNumber() + " with unknown 
size, because IE sucks");
+            res.setContentLength(jpegLength);
+            log.debug("Serving node " + node.getNumber() + " with bytes " + 
jpegLength);
         }
         sendBytes(res, bytes);
     }
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to