Skip to content
Permalink
Browse files

Render a relevant HTTP status code on snapshot image rendering error

Instead of a null response body which is not very helpful.
  • Loading branch information...
luccioman committed Oct 14, 2018
1 parent 50b6edf commit 746e0e788deb1cd9c5a867d6b19361de6538451c
@@ -31,6 +31,7 @@
import java.util.Map;
import java.util.TreeMap;

import org.apache.http.HttpStatus;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrInputDocument;

@@ -46,9 +47,10 @@
import net.yacy.cora.util.JSONException;
import net.yacy.cora.util.JSONObject;
import net.yacy.crawler.data.Snapshots;
import net.yacy.crawler.data.Transactions;
import net.yacy.crawler.data.Snapshots.Revisions;
import net.yacy.crawler.data.Transactions;
import net.yacy.document.ImageParser;
import net.yacy.http.servlets.TemplateProcessingException;
import net.yacy.kelondro.util.FileUtils;
import net.yacy.peers.graphics.EncodedImage;
import net.yacy.search.Switchboard;
@@ -289,25 +291,32 @@ public static Object respond(final RequestHeader header, serverObjects post, fin
String imageFileStub = pdfFile.getAbsolutePath(); imageFileStub = imageFileStub.substring(0, imageFileStub.length() - 3); // cut off extension
File imageFile = new File(imageFileStub + DEFAULT_WIDTH + "." + DEFAULT_HEIGHT + "." + ext);
if (!imageFile.exists() && authenticated) {
Html2Image.pdf2image(pdfFile, imageFile, DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_DENSITY, DEFAULT_QUALITY);
if(!Html2Image.pdf2image(pdfFile, imageFile, DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_DENSITY, DEFAULT_QUALITY)) {
throw new TemplateProcessingException(
"Could not generate the " + ext + " image snapshot file.");
}
}
if (!imageFile.exists()) {
throw new TemplateProcessingException(
"Could not find the " + ext
+ " image snapshot file. You must be authenticated to generate one on the fly.",
HttpStatus.SC_NOT_FOUND);
}
if (!imageFile.exists()) return null;
if (width == DEFAULT_WIDTH && height == DEFAULT_HEIGHT) {
try {
byte[] imageBinary = FileUtils.read(imageFile);
return new ByteArrayInputStream(imageBinary);
} catch (IOException e) {
} catch (final IOException e) {
ConcurrentLog.logException(e);
return null;
throw new TemplateProcessingException("Could not read the " + ext + " image snapshot file.");
}
}
// lets read the file and scale
Image image;
try {
image = ImageParser.parse(imageFile.getAbsolutePath(), FileUtils.read(imageFile));
if(image == null) {
/* Should not happen. If so, ImageParser.parse() should already have logged about the error */
return null;
throw new TemplateProcessingException("Could not parse the " + ext + " image snapshot file.");
}
final Image scaled = image.getScaledInstance(width, height, Image.SCALE_AREA_AVERAGING);
final MediaTracker mediaTracker = new MediaTracker(new Container());
@@ -321,9 +330,9 @@ public static Object respond(final RequestHeader header, serverObjects post, fin
BufferedImage scaledBufferedImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
scaledBufferedImg.createGraphics().drawImage(scaled, 0, 0, width, height, null);
return new EncodedImage(scaledBufferedImg, ext, true);
} catch (IOException e) {
} catch (final IOException e) {
ConcurrentLog.logException(e);
return null;
throw new TemplateProcessingException("Could not scale the " + ext + " image snapshot file.");
}

}
@@ -21,27 +21,31 @@

package net.yacy.http.servlets;

import org.eclipse.jetty.http.HttpStatus;

/**
* Use this to indicates a required parameter is missing for a template. Allows finer grained exception handling.
* Use this to indicates a required parameter is missing for a servlet template,
* and render a HTTP status 400 - bad Request. Allows finer grained exception
* handling.
*
* @author luc
*
*/
public class TemplateMissingParameterException extends IllegalArgumentException {

private static final long serialVersionUID = -3443324572847193267L;
@SuppressWarnings("serial")
public class TemplateMissingParameterException extends TemplateProcessingException {

/**
* Default constructor : use generic message.
*/
public TemplateMissingParameterException() {
super("Missing required parameters");
super("Missing required parameters", HttpStatus.BAD_REQUEST_400);
}

/**
* @param message detail message
*/
public TemplateMissingParameterException(String message) {
super(message);
public TemplateMissingParameterException(final String message) {
super(message, HttpStatus.BAD_REQUEST_400);
}

}
@@ -0,0 +1,71 @@
// TemplateProcessingException.java
// Copyright 2018 by luccioman; https://github.com/luccioman
//
// This is a part of YaCy, a peer-to-peer based web search engine
//
// LICENSE
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

package net.yacy.http.servlets;

import org.apache.http.HttpStatus;

/**
* Use this to indicates that a servlet template processing error occurred, and
* which HTTP status should be rendered by the HTTP servlet.
*
*/
@SuppressWarnings("serial")
public class TemplateProcessingException extends RuntimeException {

/** The HTTP status code that should be rendered. */
private final int status;

/**
* Default constructor : use a generic message and HTTP status 500 - Internal
* Server Error.
*/
public TemplateProcessingException() {
this("An error occurred while processing the template.", HttpStatus.SC_INTERNAL_SERVER_ERROR);
}

/**
* Create an instance with a detail message, and the default HTTP status 500 -
* Internal Server Error.
*
* @param message the detail message
*/
public TemplateProcessingException(final String message) {
this(message, HttpStatus.SC_INTERNAL_SERVER_ERROR);
}

/**
* @param message the detail message
* @param status the custom HTTP status code
*/
public TemplateProcessingException(final String message, final int status) {
super(message);
this.status = status;
}

/**
* @return the HTTP status code that should be rendered.
*/
public int getStatus() {
return this.status;
}

}
@@ -895,11 +895,12 @@ protected void handleTemplate(String target, HttpServletRequest request, HttpSe
+ " If you sent this request with a web browser, please refresh the origin page.");
return;
}
if(e.getCause() instanceof TemplateMissingParameterException) {
/* A template is used but miss some required parameter */
response.sendError(HttpServletResponse.SC_BAD_REQUEST, e.getCause().getMessage());
return;
}
if (e.getCause() instanceof TemplateProcessingException) {
/* A template processing error occurred, and the HTTP status and message have been set */
response.sendError(((TemplateProcessingException) e.getCause()).getStatus(),
e.getCause().getMessage());
return;
}
if(e.getCause() instanceof DisallowedMethodException) {
/* The request was sent using an disallowed HTTP method */
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, e.getCause().getMessage());

0 comments on commit 746e0e7

Please sign in to comment.
You can’t perform that action at this time.