diff --git a/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/content/VirtualHttpContentFactory.java b/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/content/VirtualHttpContentFactory.java index 4a2089d8d31..335c7e67acd 100644 --- a/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/content/VirtualHttpContentFactory.java +++ b/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/content/VirtualHttpContentFactory.java @@ -16,6 +16,8 @@ package org.eclipse.jetty.http.content; import java.io.IOException; import org.eclipse.jetty.util.resource.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * An {@link HttpContent.Factory} implementation which takes a Resource and fakes this resource as @@ -24,6 +26,8 @@ import org.eclipse.jetty.util.resource.Resource; */ public class VirtualHttpContentFactory implements HttpContent.Factory { + private static final Logger LOG = LoggerFactory.getLogger(VirtualHttpContentFactory.class); + private final HttpContent.Factory _factory; private final Resource _resource; private final String _contentType; @@ -35,6 +39,10 @@ public class VirtualHttpContentFactory implements HttpContent.Factory _resource = resource; _matchSuffix = "/" + _resource.getFileName(); _contentType = contentType; + if (LOG.isDebugEnabled()) + { + LOG.debug("resource=({}) {}, resource.getFileName()={}", _resource.getClass().getName(), _resource, _resource.getFileName()); + } } /** diff --git a/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/resource/MountedPathResourceTest.java b/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/resource/MountedPathResourceTest.java index 08ca1a9c3f6..7529e03035b 100644 --- a/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/resource/MountedPathResourceTest.java +++ b/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/resource/MountedPathResourceTest.java @@ -23,6 +23,7 @@ import java.util.List; import java.util.zip.ZipFile; import org.eclipse.jetty.toolchain.test.FS; +import org.eclipse.jetty.toolchain.test.MavenPaths; import org.eclipse.jetty.toolchain.test.MavenTestingUtils; import org.eclipse.jetty.toolchain.test.jupiter.WorkDir; import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension; @@ -73,6 +74,10 @@ public class MountedPathResourceTest List entries = r.list().stream().map(Resource::getFileName).toList(); assertThat(entries, containsInAnyOrder("alphabet", "numbers", "subsubdir")); + Resource file = r.resolve("subsubdir/numbers"); + assertTrue(Resources.isReadableFile(file)); + assertThat(file.getFileName(), is("numbers")); + Path extract = workDir.getPathFile("extract"); FS.ensureEmpty(extract); @@ -101,6 +106,36 @@ public class MountedPathResourceTest } } + @Test + public void testZipFileName() + { + Path testZip = MavenTestingUtils.getTestResourcePathFile("TestData/test.zip"); + String s = "jar:" + testZip.toUri().toASCIIString() + "!/subdir/numbers"; + URI uri = URI.create(s); + try (ResourceFactory.Closeable resourceFactory = ResourceFactory.closeable()) + { + Resource r = resourceFactory.newResource(uri); + + assertTrue(Resources.isReadableFile(r)); + assertThat(r.getFileName(), is("numbers")); + } + } + + @Test + public void testJarFileName() + { + Path testZip = MavenPaths.findTestResourceFile("jar-file-resource.jar"); + String s = "jar:" + testZip.toUri().toASCIIString() + "!/rez/deep/zzz"; + URI uri = URI.create(s); + try (ResourceFactory.Closeable resourceFactory = ResourceFactory.closeable()) + { + Resource r = resourceFactory.newResource(uri); + + assertTrue(Resources.isReadableFile(r)); + assertThat(r.getFileName(), is("zzz")); + } + } + @Test public void testJarFileUnMounted() throws Exception {