Mercurial > hg > digilib
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;