You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by lr...@apache.org on 2009/06/04 18:13:19 UTC
svn commit: r781787 - in /incubator/shindig/trunk/java/gadgets/src:
main/java/org/apache/shindig/gadgets/rewrite/image/
test/java/org/apache/shindig/gadgets/rewrite/image/
test/resources/org/apache/shindig/gadgets/rewrite/image/
Author: lryan
Date: Thu Jun 4 16:13:19 2009
New Revision: 781787
URL: http://svn.apache.org/viewvc?rev=781787&view=rev
Log:
Fixes for image resizing pipeline. Contributed by Filip Miletic. SHINDIG-1073
Added:
incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/image/expand.gif (with props)
incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/image/huge.gif (with props)
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BMPOptimizer.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BaseOptimizer.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/GIFOptimizer.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/ImageRewriter.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/JPEGOptimizer.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/PNGOptimizer.java
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/image/ImageRewriterTest.java
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BMPOptimizer.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BMPOptimizer.java?rev=781787&r1=781786&r2=781787&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BMPOptimizer.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BMPOptimizer.java Thu Jun 4 16:13:19 2009
@@ -37,17 +37,18 @@
return Sanselan.getBufferedImage(is);
}
- public BMPOptimizer(OptimizerConfig config, HttpResponse original)
- throws IOException {
+ public BMPOptimizer(OptimizerConfig config, HttpResponse original) {
super(config, original);
ImageWriter writer = ImageIO.getImageWritersByFormatName("png").next();
outputter = new ImageIOOutputter(writer, null);
}
- protected void rewriteImpl(BufferedImage image) throws IOException {
+ @Override
+ protected void rewriteImpl(BufferedImage image) throws IOException {
super.rewriteImpl(image);
}
+ @Override
protected String getOriginalContentType() {
return "image/bmp";
}
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BaseOptimizer.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BaseOptimizer.java?rev=781787&r1=781786&r2=781787&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BaseOptimizer.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BaseOptimizer.java Thu Jun 4 16:13:19 2009
@@ -60,8 +60,7 @@
int reductionPct;
- public BaseOptimizer(OptimizerConfig config, HttpResponse original)
- throws IOException {
+ public BaseOptimizer(OptimizerConfig config, HttpResponse original) {
this.config = config;
this.originalResponse = original;
this.minLength = original.getContentLength();
@@ -124,7 +123,6 @@
/**
* Get the rewritten image if available
- * @return
*/
protected final byte[] getRewrittenImage() {
return minBytes;
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java?rev=781787&r1=781786&r2=781787&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java Thu Jun 4 16:13:19 2009
@@ -33,6 +33,8 @@
import org.apache.shindig.gadgets.http.HttpRequest;
import org.apache.shindig.gadgets.http.HttpResponse;
import org.apache.shindig.gadgets.http.HttpResponseBuilder;
+import org.apache.shindig.gadgets.rewrite.image.BaseOptimizer.ImageIOOutputter;
+import org.apache.shindig.gadgets.rewrite.image.BaseOptimizer.ImageOutputter;
import java.awt.Color;
import java.awt.Graphics2D;
@@ -45,6 +47,7 @@
import java.util.logging.Logger;
import javax.imageio.ImageIO;
+import javax.imageio.ImageWriter;
/**
* Rewrite images to more efficiently compress their content. Can output to a different format file
@@ -55,6 +58,13 @@
*/
public class BasicImageRewriter implements ImageRewriter {
+ private static final String CONTENT_TYPE_IMAGE_PNG = "image/png";
+ /** Returned as the output message if a huge image is submitted to be scaled */
+ private static final String RESIZE_IMAGE_TOO_LARGE = "The image is too large to resize";
+ /** With resizing active, all images become PNGs */
+ private static final String RESIZE_OUTPUT_FORMAT = "png";
+
+ private static final String CONTENT_LENGTH = "Content-Length";
/** Parameter used to request image rendering quality */
public static final String PARAM_RESIZE_QUALITY = "resize_q";
/** Parameter used to request image width change */
@@ -71,12 +81,12 @@
private static final int DEFAULT_QUALITY = 100;
private static final int BITS_PER_BYTE = 8;
- private static final Color COLOR_TRANSPARENT = new Color(0, 0, 0, 0);
+ private static final Color COLOR_TRANSPARENT = new Color(255, 255, 255, 0);
private static final String CONTENT_TYPE = "Content-Type";
private static final Logger log = Logger.getLogger(BasicImageRewriter.class.getName());
private static final Set<String> SUPPORTED_MIME_TYPES = ImmutableSet.of(
- "image/gif", "image/png", "image/jpeg", "image/bmp");
+ "image/gif", CONTENT_TYPE_IMAGE_PNG, "image/jpeg", "image/bmp");
private static final Set<String> SUPPORTED_FILE_EXTENSIONS = ImmutableSet.of(
".gif", ".png", ".jpeg", ".jpg", ".bmp");
@@ -129,13 +139,20 @@
ImageInfo imageInfo = Sanselan.getImageInfo(response.getResponse(), uri.getPath());
+ boolean isOversizedImage = isImageTooLarge(imageInfo);
+ if (isResizeRequested && isOversizedImage) {
+ HttpResponseBuilder rejectedResponseBuilder = new HttpResponseBuilder()
+ .setHttpStatusCode(HttpResponse.SC_FORBIDDEN)
+ .setResponseString(RESIZE_IMAGE_TOO_LARGE);
+ return rejectedResponseBuilder.create();
+ }
+
// Don't handle animations.
// TODO: This doesn't work as current Sanselan doesn't return accurate image counts.
// See animated GIF detection below.
- if (imageInfo.getNumberOfImages() > 1 || isImageTooLarge(imageInfo)) {
+ if (imageInfo.getNumberOfImages() > 1 || isOversizedImage) {
return response;
}
-
int originalContentSize = response.getContentLength();
totalSourceImageSize.addAndGet(originalContentSize);
BufferedImage image = ImageIO.read(response.getResponse());
@@ -173,8 +190,10 @@
resizeQuality = DEFAULT_QUALITY;
}
- if (isResizeRequired(requestedWidth, requestedHeight, imageInfo)) {
+ if (isResizeRequired(requestedWidth, requestedHeight, imageInfo)
+ && !isTargetImageTooLarge(requestedWidth, requestedHeight, imageInfo)) {
image = resizeImage(image, requestedWidth, requestedHeight, widthDelta, heightDelta);
+ response = updateResponse(response, image);
}
}
response = getOptimizer(response, imageFormat, image);
@@ -191,6 +210,27 @@
return response;
}
+ /**
+ * As the image is resized, the request needs to change so that the optimizer can
+ * make sensible image size-related decisions down the pipeline. GIF images are rewritten
+ * as PNGs though, so as not to include the dependency on the GIF decoder.
+ *
+ * @param response the base response that will be modified with the resized image
+ * @param image the resized image that needs to be substituted for the original image from
+ * the response
+ */
+ private HttpResponse updateResponse(HttpResponse response, BufferedImage image)
+ throws IOException {
+ ImageWriter imageWriter = ImageIO.getImageWritersByFormatName(RESIZE_OUTPUT_FORMAT).next();
+ ImageOutputter outputter = new ImageIOOutputter(imageWriter, null);
+ byte[] imageBytes = outputter.toBytes(image);
+ HttpResponseBuilder newResponseBuilder = new HttpResponseBuilder(response)
+ .setResponse(imageBytes)
+ .setHeader(CONTENT_TYPE, CONTENT_TYPE_IMAGE_PNG)
+ .setHeader(CONTENT_LENGTH, String.valueOf(imageBytes.length));
+ return newResponseBuilder.create();
+ }
+
private boolean isUsableParameter(Integer parameterValue) {
if (parameterValue == null) {
return true;
@@ -241,7 +281,7 @@
private BufferedImage stretchImage(BufferedImage image, Integer requestedWidth,
Integer requestedHeight) {
BufferedImage scaledImage = new BufferedImage(requestedWidth, requestedHeight,
- BufferedImage.TYPE_INT_RGB);
+ BufferedImage.TYPE_INT_ARGB_PRE);
Graphics2D g2d = scaledImage.createGraphics();
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
@@ -256,7 +296,8 @@
}
private HttpResponse getOptimizer(HttpResponse response, ImageFormat imageFormat,
- BufferedImage image) throws IOException, ImageReadException {
+ BufferedImage image) throws IOException {
+
if (imageFormat == ImageFormat.IMAGE_FORMAT_GIF) {
// Detecting the existence of the NETSCAPE2.0 extension by string comparison
// is not exactly clean but is good enough to determine if a GIF is animated
@@ -275,7 +316,19 @@
}
private boolean isImageTooLarge(ImageInfo imageInfo) {
- long imagePixels = abs((long) imageInfo.getWidth()) * abs((long) imageInfo.getHeight());
+ return isTargetImageTooLarge(imageInfo.getWidth(), imageInfo.getHeight(), imageInfo);
+ }
+
+ /**
+ * @param requestedHeight the requested image height, assumed always nonnegative
+ * @param requestedWidth the requested image width, assumed always nonnegative
+ * @param imageInfo the image information to analyze
+ * @return {@code true} if the image size given by the parameters is too large to be acceptable
+ * for serving
+ */
+ private boolean isTargetImageTooLarge(int requestedHeight, int requestedWidth,
+ ImageInfo imageInfo) {
+ long imagePixels = abs(requestedHeight) * abs(requestedWidth);
long imageSizeBits = imagePixels * imageInfo.getBitsPerPixel();
return imageSizeBits > config.getMaxInMemoryBytes() * BITS_PER_BYTE;
}
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/GIFOptimizer.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/GIFOptimizer.java?rev=781787&r1=781786&r2=781787&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/GIFOptimizer.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/GIFOptimizer.java Thu Jun 4 16:13:19 2009
@@ -38,17 +38,17 @@
private boolean usePng;
- public GIFOptimizer(OptimizerConfig config, HttpResponse original)
- throws IOException {
+ public GIFOptimizer(OptimizerConfig config, HttpResponse original) {
super(config, original);
}
+ @Override
protected void rewriteImpl(BufferedImage image) throws IOException {
if (!ImageUtils.isOpaque(image)) {
- // We can rewrite tranparent GIFs to PNG but for IE6 it requires the use of
+ // We can rewrite transparent GIFs to PNG but for IE6 it requires the use of
// the AlphaImageReader and some pain. Deferring this until that is proven to work
- // Write to stip any metadata and re-compute the palette. We allow arbitrary large palettes
+ // Write to strip any metadata and re-compute the palette. We allow arbitrary large palettes
// here as if the image is already in a direct color model it will already have been
// constrained by the max in-mem constraint.
write(ImageUtils.palettize(image, Integer.MAX_VALUE));
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/ImageRewriter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/ImageRewriter.java?rev=781787&r1=781786&r2=781787&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/ImageRewriter.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/ImageRewriter.java Thu Jun 4 16:13:19 2009
@@ -25,7 +25,7 @@
/**
* Rewrite an image when it is read from the network
*/
-@ImplementedBy(NoOpImageRewriter.class)
+@ImplementedBy(BasicImageRewriter.class)
public interface ImageRewriter {
/**
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/JPEGOptimizer.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/JPEGOptimizer.java?rev=781787&r1=781786&r2=781787&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/JPEGOptimizer.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/JPEGOptimizer.java Thu Jun 4 16:13:19 2009
@@ -53,11 +53,11 @@
private boolean usePng;
- public JPEGOptimizer(OptimizerConfig config, HttpResponse original)
- throws IOException, ImageReadException {
+ public JPEGOptimizer(OptimizerConfig config, HttpResponse original) {
super(config, original);
}
+ @Override
protected void rewriteImpl(BufferedImage image) throws IOException {
// Create a new optimizer config and disable JPEG conversion
OptimizerConfig pngConfig = new OptimizerConfig(config.getMaxInMemoryBytes(),
@@ -85,6 +85,7 @@
}
}
+ @Override
protected String getOutputContentType() {
if (usePng) {
return "image/png";
@@ -92,10 +93,12 @@
return "image/jpeg";
}
+ @Override
protected String getOriginalContentType() {
return "image/jpeg";
}
+ @Override
protected String getOriginalFormatName() {
return "jpeg";
}
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/PNGOptimizer.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/PNGOptimizer.java?rev=781787&r1=781786&r2=781787&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/PNGOptimizer.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/PNGOptimizer.java Thu Jun 4 16:13:19 2009
@@ -41,11 +41,11 @@
private boolean useJpeg;
- public PNGOptimizer(OptimizerConfig config, HttpResponse original)
- throws IOException {
+ public PNGOptimizer(OptimizerConfig config, HttpResponse original) {
super(config, original);
}
+ @Override
protected void rewriteImpl(BufferedImage bufferedImage) throws IOException {
BufferedImage palettized = ImageUtils.palettize(bufferedImage, config.getMaxPaletteSize());
if (palettized != null) {
@@ -53,7 +53,7 @@
}
if (palettized == null) {
- // If we are efficiently palettized then only JPEG can really win
+ // If we are efficiently palletized then only JPEG can really win
if (this.minBytes == null) {
// nothing has been written yet, so just strip metadata
write(bufferedImage);
@@ -105,6 +105,7 @@
}
}
+ @Override
protected String getOutputContentType() {
if (useJpeg) {
return "image/jpeg";
@@ -112,10 +113,12 @@
return "image/png";
}
+ @Override
protected String getOriginalContentType() {
return "image/png";
}
+ @Override
protected String getOriginalFormatName() {
return "png";
}
Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/image/ImageRewriterTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/image/ImageRewriterTest.java?rev=781787&r1=781786&r2=781787&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/image/ImageRewriterTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/image/ImageRewriterTest.java Thu Jun 4 16:13:19 2009
@@ -38,6 +38,7 @@
import java.awt.image.BufferedImage;
import java.io.IOException;
+import java.util.Arrays;
import javax.imageio.ImageIO;
@@ -46,10 +47,20 @@
*/
public class ImageRewriterTest extends TestCase {
- /** The image used for the scaling tests, a head-shot of a white dog, 600pix x 600pix */
+ /** The image used for the scaling tests, a head-shot of a white dog, 500pix x 500pix */
private static final String SCALE_IMAGE = "org/apache/shindig/gadgets/rewrite/image/dog.gif";
+ /** A 60 x 30 image whose size in bytes expands when resized to 120 x 60 */
+ private static final String EXPAND_IMAGE = "org/apache/shindig/gadgets/rewrite/image/expand.gif";
+
+ /**
+ * This image has a huge memory footprint that the rewriter should refuse to resize, but not
+ * refuse to render. The response containing this image should not be rewritten.
+ */
+ private static final String HUGE_IMAGE = "org/apache/shindig/gadgets/rewrite/image/huge.gif";
+
private static final String CONTENT_TYPE_BOGUS = "notimage/anything";
+ private static final String CONTENT_TYPE_JPG = "image/jpeg";
private static final String CONTENT_TYPE_GIF = "image/gif";
private static final String CONTENT_TYPE_PNG = "image/png";
private static final String CONTENT_TYPE_HEADER = "Content-Type";
@@ -88,11 +99,7 @@
String targetContentType, String imageName, Integer width, Integer height, Integer quality)
throws Exception {
HttpResponse originalResponse = getImageResponse(sourceContentType, getImageBytes(imageName));
- HttpRequest request = mockControl.createMock(HttpRequest.class);
- expect(request.getUri()).andReturn(IMAGE_URL);
- expect(request.getParamAsInteger(PARAM_RESIZE_QUALITY)).andReturn(quality);
- expect(request.getParamAsInteger(PARAM_RESIZE_WIDTH)).andReturn(width);
- expect(request.getParamAsInteger(PARAM_RESIZE_HEIGHT)).andReturn(height);
+ HttpRequest request = getMockRequest(width, height, quality);
mockControl.replay();
HttpResponse rewrittenResponse = rewriter.rewrite(request, originalResponse);
@@ -102,6 +109,15 @@
return ImageIO.read(rewrittenResponse.getResponse());
}
+ private HttpRequest getMockRequest(Integer width, Integer height, Integer quality) {
+ HttpRequest request = mockControl.createMock(HttpRequest.class);
+ expect(request.getUri()).andReturn(IMAGE_URL);
+ expect(request.getParamAsInteger(PARAM_RESIZE_QUALITY)).andReturn(quality);
+ expect(request.getParamAsInteger(PARAM_RESIZE_WIDTH)).andReturn(width);
+ expect(request.getParamAsInteger(PARAM_RESIZE_HEIGHT)).andReturn(height);
+ return request;
+ }
+
public void testRewriteValidImageWithValidMimeAndExtn() throws Exception {
byte[] bytes = getImageBytes("org/apache/shindig/gadgets/rewrite/image/inefficient.png");
HttpResponse original = getImageResponse(CONTENT_TYPE_PNG, bytes);
@@ -157,7 +173,7 @@
// image content, as the ImageIO implementations vary across JVMs, so we have to skip it.
public void testResize_width() throws Exception {
- BufferedImage image = getResizedHttpResponseContent(CONTENT_TYPE_GIF, CONTENT_TYPE_PNG,
+ BufferedImage image = getResizedHttpResponseContent(CONTENT_TYPE_GIF, CONTENT_TYPE_JPG,
SCALE_IMAGE, 100 /* width */, null /* height */, null /* quality */);
assertEquals(100, image.getWidth());
assertEquals(100, image.getHeight());
@@ -165,14 +181,14 @@
public void testResize_height() throws Exception {
BufferedImage image = getResizedHttpResponseContent(
- CONTENT_TYPE_GIF, CONTENT_TYPE_PNG, SCALE_IMAGE, null, 100, null);
+ CONTENT_TYPE_GIF, CONTENT_TYPE_JPG, SCALE_IMAGE, null, 100, null);
assertEquals(100, image.getWidth());
assertEquals(100, image.getHeight());
}
public void testResize_both() throws Exception {
BufferedImage image = getResizedHttpResponseContent(
- CONTENT_TYPE_GIF, CONTENT_TYPE_PNG, SCALE_IMAGE, 100, 100, null);
+ CONTENT_TYPE_GIF, CONTENT_TYPE_JPG, SCALE_IMAGE, 100, 100, null);
assertEquals(100, image.getWidth());
assertEquals(100, image.getHeight());
}
@@ -180,29 +196,63 @@
public void testResize_all() throws Exception {
// The quality hint apparently has no effect on the result here
BufferedImage image = getResizedHttpResponseContent(
- CONTENT_TYPE_GIF, CONTENT_TYPE_PNG, SCALE_IMAGE, 100, 100, 10);
+ CONTENT_TYPE_GIF, CONTENT_TYPE_JPG, SCALE_IMAGE, 100, 100, 10);
assertEquals(100, image.getWidth());
assertEquals(100, image.getHeight());
}
public void testResize_wideImage() throws Exception {
BufferedImage image = getResizedHttpResponseContent(
- CONTENT_TYPE_GIF, CONTENT_TYPE_PNG, SCALE_IMAGE, 100, 50, null);
+ CONTENT_TYPE_GIF, CONTENT_TYPE_JPG, SCALE_IMAGE, 100, 50, null);
assertEquals(100, image.getWidth());
assertEquals(50, image.getHeight());
}
public void testResize_tallImage() throws Exception {
BufferedImage image = getResizedHttpResponseContent(
- CONTENT_TYPE_GIF, CONTENT_TYPE_PNG, SCALE_IMAGE, 50, 100, null);
+ CONTENT_TYPE_GIF, CONTENT_TYPE_JPG, SCALE_IMAGE, 50, 100, null);
assertEquals(50, image.getWidth());
assertEquals(100, image.getHeight());
}
+ public void testResize_skipResizeHugeOutputImage() throws Exception {
+ BufferedImage image = getResizedHttpResponseContent(
+ CONTENT_TYPE_GIF, CONTENT_TYPE_JPG, SCALE_IMAGE, 10000, 10000, null);
+ assertEquals(500, image.getWidth());
+ assertEquals(500, image.getHeight());
+ }
+
public void testResize_brokenParameter() throws Exception {
BufferedImage image = getResizedHttpResponseContent(
CONTENT_TYPE_GIF, CONTENT_TYPE_GIF, SCALE_IMAGE, -1, null, null);
assertEquals(500, image.getWidth());
assertEquals(500, image.getHeight());
}
+
+ public void testResize_expandImage() throws Exception {
+ BufferedImage image = getResizedHttpResponseContent(
+ CONTENT_TYPE_GIF, CONTENT_TYPE_JPG, EXPAND_IMAGE, 120, 60, null);
+ assertEquals(120, image.getWidth());
+ assertEquals(60, image.getHeight());
+ }
+
+ public void testResize_refuseHugeInputImages() throws Exception {
+ HttpResponse originalResponse = getImageResponse(CONTENT_TYPE_GIF, getImageBytes(HUGE_IMAGE));
+ HttpRequest request = getMockRequest(120, 60, null);
+ mockControl.replay();
+ HttpResponse rewrittenResponse = rewriter.rewrite(request, originalResponse);
+ mockControl.verify();
+ assertEquals(HttpResponse.SC_FORBIDDEN, rewrittenResponse.getHttpStatusCode());
+ }
+
+ public void testResize_acceptServeHugeImages() throws Exception {
+ byte[] imageBytes = getImageBytes(HUGE_IMAGE);
+ HttpResponse originalResponse = getImageResponse(CONTENT_TYPE_GIF, imageBytes);
+ HttpRequest request = getMockRequest(null, null, null);
+ mockControl.replay();
+ HttpResponse rewrittenResponse = rewriter.rewrite(request, originalResponse);
+ mockControl.verify();
+ assertEquals(HttpResponse.SC_OK, rewrittenResponse.getHttpStatusCode());
+ assertTrue(Arrays.equals(imageBytes, IOUtils.toByteArray(rewrittenResponse.getResponse())));
+ }
}
Added: incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/image/expand.gif
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/image/expand.gif?rev=781787&view=auto
==============================================================================
Binary file - no diff available.
Propchange: incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/image/expand.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/image/huge.gif
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/image/huge.gif?rev=781787&view=auto
==============================================================================
Binary file - no diff available.
Propchange: incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/image/huge.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream