# HG changeset patch # User robcast # Date 1445966138 -3600 # Node ID 69087d665d9648db761fc635935f079f6adcaa5f # Parent d4cfce3887f0d455f6f019f009c54005c8ded33f abort sending earlier when response is already committed. Tomcat triggers this error sometimes but I don't know why. diff -r d4cfce3887f0 -r 69087d665d96 servlet3/src/main/java/digilib/servlet/AsyncServletWorker.java --- 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) { diff -r d4cfce3887f0 -r 69087d665d96 servlet3/src/main/java/digilib/servlet/Scaler.java --- 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;