changeset 1426:69087d665d96

abort sending earlier when response is already committed. Tomcat triggers this error sometimes but I don't know why.
author robcast
date Tue, 27 Oct 2015 18:15:38 +0100
parents d4cfce3887f0
children a244753f8f33
files servlet3/src/main/java/digilib/servlet/AsyncServletWorker.java servlet3/src/main/java/digilib/servlet/Scaler.java
diffstat 2 files changed, 39 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/servlet3/src/main/java/digilib/servlet/AsyncServletWorker.java	Tue Oct 27 18:12:40 2015 +0100
+++ b/servlet3/src/main/java/digilib/servlet/AsyncServletWorker.java	Tue Oct 27 18:15:38 2015 +0100
@@ -54,10 +54,10 @@
 public class AsyncServletWorker implements Runnable, AsyncListener {
 
     /** the AsyncServlet context */
-    private AsyncContext asyncContext;
+    private AsyncContext asyncContext = null;
 
     /** the ImageWorker we use */
-    private ImageWorker imageWorker;
+    private ImageWorker imageWorker = null;
 
     protected static Logger logger = Logger.getLogger(AsyncServletWorker.class);
     private long startTime;
@@ -92,22 +92,34 @@
     @Override
     public void run() {
         try {
-            // render the image
+            /*
+             * render the image
+             */
             DocuImage img = imageWorker.call();
             if (completed) {
                 logger.debug("AsyncServletWorker already completed (after scaling)!");
                 return;
             }
-            // forced destination image type
+            /*
+             * set forced destination image type
+             */
             String mt = null;
             if (jobinfo.hasOption("jpg")) {
                 mt = "image/jpeg";
             } else if (jobinfo.hasOption("png")) {
                 mt = "image/png";
             }
-            // send image
-            ServletOps.sendImage(img, mt,
-                    (HttpServletResponse) asyncContext.getResponse(), logger);
+            /*
+             *  send the image
+             */
+            HttpServletResponse response = (HttpServletResponse) asyncContext.getResponse();
+            if (response.isCommitted()) {
+            	logger.error("Crap! ServletResponse is already committed! Aborting.");
+            	// what now?
+            	return;
+            }
+            ServletOps.sendImage(img, mt, response, logger);
+            
             logger.debug("Job done in: "
                     + (System.currentTimeMillis() - startTime) + "ms");
         } catch (ImageOpException e) {
--- a/servlet3/src/main/java/digilib/servlet/Scaler.java	Tue Oct 27 18:12:40 2015 +0100
+++ b/servlet3/src/main/java/digilib/servlet/Scaler.java	Tue Oct 27 18:15:38 2015 +0100
@@ -229,8 +229,7 @@
         accountlog.debug("request: " + request.getQueryString());
         logger.debug("request: " + request.getQueryString());
         //logger.debug("headers: " + ServletOps.headersToString(request));
-        // logger.debug("response:"+ response + " committed=" +
-        // response.isCommitted());
+        //logger.debug("response committed=" + response.isCommitted());
         final long startTime = System.currentTimeMillis();
 
         // parse request
@@ -262,11 +261,13 @@
         
         try {
             /*
-             * check if we can fast-track without scaling
+             * get the input file
              */
             ImageInput fileToLoad = (ImageInput) jobTicket.getInput();
 
-            // check permissions
+            /*
+             * check permissions
+             */
             if (useAuthorization) {
                 // is the current request/user authorized?
                 if (!authOp.isAuthorized(dlRequest)) {
@@ -275,10 +276,13 @@
                 }
             }
 
-            // if requested, send image as a file
+            /*
+             * if requested, send image as a file
+             */
             if (sendFileAllowed && jobTicket.getSendAsFile()) {
                 String mt = null;
                 if (jobTicket.hasOption("rawfile")) {
+                	// mo=rawfile sends as octet-stream
                     mt = "application/octet-stream";
                 }
                 logger.debug("Sending RAW File as is.");
@@ -287,7 +291,9 @@
                 return;
             }
 
-            // if possible, send the image without actually having to transform it
+            /*
+             * if possible, send the image without actually having to transform it
+             */
             if (!jobTicket.isTransformRequired()) {
                 logger.debug("Sending File as is.");
                 ServletOps.sendFile(fileToLoad.getFile(), null, null, response, logger);
@@ -295,15 +301,19 @@
                 return;
             }
 
-            // check load of workers
+            /*
+             * check load of workers
+             */
             if (imageJobCenter.isBusy()) {
                 logger.error("Servlet overloaded!");
                 response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
                 return;
             }
 
-            // worker job is done asynchronously
-            AsyncContext asyncCtx = request.startAsync(request, response);
+            /*
+             * dispatch worker job to be done asynchronously
+             */
+            AsyncContext asyncCtx = request.startAsync();
             // create job
             AsyncServletWorker job = new AsyncServletWorker(dlConfig, jobTicket, asyncCtx, errMsgType, startTime);
             // AsyncServletWorker is its own AsyncListener
@@ -348,7 +358,7 @@
                 status = HttpServletResponse.SC_FORBIDDEN;
             } else if (error == Error.FILE) {
                 if (msg == null) {
-                    msg = "ERROR: Image file not found!";
+                    msg = "ERROR: Image file not found or image not readable!";
                 }
                 img = notfoundImgFile;
                 status = HttpServletResponse.SC_NOT_FOUND;