🐛 Use simple manifest data for filtering, when present
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Sat, 3 Oct 2026 20:17:22 +0000 (22:17 +0200)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Sun, 4 Oct 2026 18:54:53 +0000 (20:54 +0200)
src/main/java/net/pterodactylus/sone/core/FreenetInterface.java
src/test/kotlin/net/pterodactylus/sone/core/FreenetInterfaceTest.kt

index 0abc4b8..3efab56 100644 (file)
@@ -182,8 +182,9 @@ public class FreenetInterface {
                                if (meta.isArchiveManifest()) {
                                        return false;
                                }
-                               String mimeType = meta.getMIMEType();
-                               boolean cancel = (mimeType == null) || backgroundFetchCallback.shouldCancel(uri, mimeType, meta.dataLength());
+                               Metadata actualMetadata = meta.isSimpleManifest() ? meta.getDocuments().values().stream().findFirst().get() : meta;
+                               String mimeType = actualMetadata.getMIMEType();
+                               boolean cancel = (mimeType == null) || backgroundFetchCallback.shouldCancel(uri, mimeType, actualMetadata.dataLength());
                                if (cancel) {
                                        backgroundFetchCallback.failed(uri);
                                }
index 3bf5791..5fc3c73 100644 (file)
@@ -390,6 +390,12 @@ class FreenetInterfaceTest {
        }
 
        @Test
+       fun `request is not cancelled for image mime type in simple manifest`() {
+               verifySnoopCancelsRequestForMimeType("image/png", false, simpleManifest = true)
+               verify(backgroundFetchCallback, never()).failed(uri)
+       }
+
+       @Test
        fun `request is cancelled for null mime type`() {
                verifySnoopCancelsRequestForMimeType(null, true)
                verify(backgroundFetchCallback, never()).shouldCancel(eq(uri), any(), anyLong())
@@ -397,30 +403,61 @@ class FreenetInterfaceTest {
        }
 
        @Test
+       fun `request is cancelled for null mime type in simple manifest`() {
+               verifySnoopCancelsRequestForMimeType(null, true, simpleManifest = true)
+               verify(backgroundFetchCallback, never()).shouldCancel(eq(uri), any(), anyLong())
+               verify(backgroundFetchCallback).failed(uri)
+       }
+
+       @Test
        fun `request is cancelled for video mime type`() {
                verifySnoopCancelsRequestForMimeType("video/mkv", true)
                verify(backgroundFetchCallback).failed(uri)
        }
 
        @Test
+       fun `request is cancelled for video mime type in simple manifest`() {
+               verifySnoopCancelsRequestForMimeType("video/mkv", true, simpleManifest = true)
+               verify(backgroundFetchCallback).failed(uri)
+       }
+
+       @Test
        fun `request is cancelled for audio mime type`() {
                verifySnoopCancelsRequestForMimeType("audio/mpeg", true)
                verify(backgroundFetchCallback).failed(uri)
        }
 
        @Test
+       fun `request is cancelled for audio mime type in simple manifest`() {
+               verifySnoopCancelsRequestForMimeType("audio/mpeg", true, simpleManifest = true)
+               verify(backgroundFetchCallback).failed(uri)
+       }
+
+       @Test
        fun `request is cancelled for text mime type`() {
                verifySnoopCancelsRequestForMimeType("text/plain", true)
                verify(backgroundFetchCallback).failed(uri)
        }
 
-       private fun verifySnoopCancelsRequestForMimeType(mimeType: String?, cancel: Boolean) {
+       @Test
+       fun `request is cancelled for text mime type in simple manifest`() {
+               verifySnoopCancelsRequestForMimeType("text/plain", true, simpleManifest = true)
+               verify(backgroundFetchCallback).failed(uri)
+       }
+
+       private fun verifySnoopCancelsRequestForMimeType(mimeType: String?, cancel: Boolean, simpleManifest: Boolean = false) {
                whenever(backgroundFetchCallback.shouldCancel(eq(uri), if (mimeType != null) eq(mimeType) else isNull(), anyLong())).thenReturn(cancel)
                freenetInterface.startFetch(uri, backgroundFetchCallback)
                val snoopMetadata = forClass(SnoopMetadata::class.java)
                verify(clientGetter).metaSnoop = snoopMetadata.capture()
                val metadata = mock<Metadata>()
-               whenever(metadata.mimeType).thenReturn(mimeType)
+               whenever(metadata.isSimpleManifest).thenReturn(simpleManifest)
+               if (simpleManifest) {
+                       val innerMetadata = mock<Metadata>().also { whenever(it.mimeType).thenReturn(mimeType) }
+                       whenever(metadata.documents).thenReturn(mapOf("file" to innerMetadata).let(::HashMap))
+               } else {
+                       whenever(metadata.mimeType).thenReturn(mimeType)
+               }
                assertThat(snoopMetadata.value.snoopMetadata(metadata, mock()), equalTo(cancel))
        }