From 77032f8d3f4d3d60fbe92e3bf269ec064401b5f7 Mon Sep 17 00:00:00 2001 From: Andrea Aime Date: Mon, 17 Feb 2025 09:00:48 +0100 Subject: [PATCH] Mime type: advertise preferred content disposition --- .../java/org/geowebcache/mime/ApplicationMime.java | 5 +++++ .../main/java/org/geowebcache/mime/ImageMime.java | 8 +++++++- .../main/java/org/geowebcache/mime/MimeType.java | 11 +++++++++++ .../main/java/org/geowebcache/mime/XMLMime.java | 5 +++++ .../org/geowebcache/mime/ApplicationMimeTest.java | 2 ++ .../java/org/geowebcache/mime/ImageMimeTest.java | 14 ++++++++++++++ .../java/org/geowebcache/mime/XMLMimeTest.java | 10 ++++++++++ 7 files changed, 54 insertions(+), 1 deletion(-) diff --git a/geowebcache/core/src/main/java/org/geowebcache/mime/ApplicationMime.java b/geowebcache/core/src/main/java/org/geowebcache/mime/ApplicationMime.java index e3f7f8e0e1..2073cb7f87 100644 --- a/geowebcache/core/src/main/java/org/geowebcache/mime/ApplicationMime.java +++ b/geowebcache/core/src/main/java/org/geowebcache/mime/ApplicationMime.java @@ -93,4 +93,9 @@ public boolean isVector() { protected boolean isBinary() { return BINARY_FORMATS.contains(this.getMimeType()); } + + @Override + public boolean isInlinePreferred() { + return getMimeType().contains("json"); + } } diff --git a/geowebcache/core/src/main/java/org/geowebcache/mime/ImageMime.java b/geowebcache/core/src/main/java/org/geowebcache/mime/ImageMime.java index b499d23c0d..d3e3c9274d 100644 --- a/geowebcache/core/src/main/java/org/geowebcache/mime/ImageMime.java +++ b/geowebcache/core/src/main/java/org/geowebcache/mime/ImageMime.java @@ -113,7 +113,13 @@ public RenderedImage preprocess(RenderedImage canvas) { public static final ImageMime png_24 = new ImageMime("image/png; mode=24bit", "png_24", "png", "image/png;%20mode=24bit", true, true, true); - public static final ImageMime dds = new ImageMime("image/dds", "dds", "dds", "image/dds", false, false, false); + public static final ImageMime dds = new ImageMime("image/dds", "dds", "dds", "image/dds", false, false, false) { + + @Override + public boolean isInlinePreferred() { + return false; + } + }; public static final ImageMime jpegPng = new JpegPngMime("image/vnd.jpeg-png", "jpeg-png", "jpeg-png", "image/vnd.jpeg-png", jpeg, png); diff --git a/geowebcache/core/src/main/java/org/geowebcache/mime/MimeType.java b/geowebcache/core/src/main/java/org/geowebcache/mime/MimeType.java index fb9704c9db..691fd01dd9 100644 --- a/geowebcache/core/src/main/java/org/geowebcache/mime/MimeType.java +++ b/geowebcache/core/src/main/java/org/geowebcache/mime/MimeType.java @@ -196,4 +196,15 @@ public boolean isCompatible(String otherMimeType) { public String toString() { return mimeType; } + + /** + * Returns true if the format is preferred for inline display in a browser. By default, it will return true if the + * mime type starts with "text/*" or "image/*". + * + * @return + */ + public boolean isInlinePreferred() { + String mime = getMimeType(); + return mime.startsWith("text/") || mime.startsWith("image/"); + } } diff --git a/geowebcache/core/src/main/java/org/geowebcache/mime/XMLMime.java b/geowebcache/core/src/main/java/org/geowebcache/mime/XMLMime.java index f5b4c87baf..33f32dd62a 100644 --- a/geowebcache/core/src/main/java/org/geowebcache/mime/XMLMime.java +++ b/geowebcache/core/src/main/java/org/geowebcache/mime/XMLMime.java @@ -63,4 +63,9 @@ protected static XMLMime checkForExtension(String fileExtension) throws MimeExce return null; } + + @Override + public boolean isInlinePreferred() { + return true; + } } diff --git a/geowebcache/core/src/test/java/org/geowebcache/mime/ApplicationMimeTest.java b/geowebcache/core/src/test/java/org/geowebcache/mime/ApplicationMimeTest.java index 8650966c1b..4e9d459432 100644 --- a/geowebcache/core/src/test/java/org/geowebcache/mime/ApplicationMimeTest.java +++ b/geowebcache/core/src/test/java/org/geowebcache/mime/ApplicationMimeTest.java @@ -44,6 +44,8 @@ public void testMimeType() throws MimeException { result = MimeType.createFromExtension(mimeType.getFileExtension()); // Ensure it is the same instance assertEquals(mimeType, result); + // check inline or not + assertEquals(result.getMimeType().contains("json"), result.isInlinePreferred()); } } diff --git a/geowebcache/core/src/test/java/org/geowebcache/mime/ImageMimeTest.java b/geowebcache/core/src/test/java/org/geowebcache/mime/ImageMimeTest.java index 8cd3c94ec4..ea20a8a1d6 100644 --- a/geowebcache/core/src/test/java/org/geowebcache/mime/ImageMimeTest.java +++ b/geowebcache/core/src/test/java/org/geowebcache/mime/ImageMimeTest.java @@ -17,6 +17,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import java.awt.Color; import java.awt.Graphics2D; @@ -129,4 +130,17 @@ public void test4BitPNG() throws IOException, URISyntaxException { writer.getClass().getName(), ImageMime.NATIVE_PNG_WRITER_CLASS_NAME); } + + @Test + public void testInline() throws Exception { + // actual images + assertTrue(ImageMime.jpeg.isInlinePreferred()); + assertTrue(ImageMime.png.isInlinePreferred()); + assertTrue(ImageMime.png24.isInlinePreferred()); + assertTrue(ImageMime.png8.isInlinePreferred()); + assertTrue(ImageMime.jpegPng.isInlinePreferred()); + assertTrue(ImageMime.gif.isInlinePreferred()); + // this is a binary dump + assertFalse(ImageMime.dds.isInlinePreferred()); + } } diff --git a/geowebcache/core/src/test/java/org/geowebcache/mime/XMLMimeTest.java b/geowebcache/core/src/test/java/org/geowebcache/mime/XMLMimeTest.java index a98c7f22c7..14386153ac 100644 --- a/geowebcache/core/src/test/java/org/geowebcache/mime/XMLMimeTest.java +++ b/geowebcache/core/src/test/java/org/geowebcache/mime/XMLMimeTest.java @@ -3,6 +3,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import org.junit.Test; @@ -135,4 +136,13 @@ public void testUnknownExtension() throws MimeException { public void testUnknownFormat() throws MimeException { MimeType.createFromFormat("xxx/xxx"); } + + @Test + public void testIsInlinePreferred() { + assertTrue(XMLMime.ogcxml.isInlinePreferred()); + assertTrue(XMLMime.kml.isInlinePreferred()); + assertTrue(XMLMime.kmz.isInlinePreferred()); + assertTrue(XMLMime.gml.isInlinePreferred()); + assertTrue(XMLMime.gml3.isInlinePreferred()); + } }