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