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