From dac547b48fc2fb956b4e2192e4c54cc4c44a52c7 Mon Sep 17 00:00:00 2001 From: =?utf8?q?David=20=E2=80=98Bombe=E2=80=99=20Roden?= Date: Sat, 3 Oct 2026 22:17:22 +0200 Subject: [PATCH] =?utf8?q?=F0=9F=90=9B=20Use=20simple=20manifest=20data=20?= =?utf8?q?for=20filtering,=20when=20present?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../pterodactylus/sone/core/FreenetInterface.java | 5 +-- .../sone/core/FreenetInterfaceTest.kt | 41 ++++++++++++++++++++-- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/pterodactylus/sone/core/FreenetInterface.java b/src/main/java/net/pterodactylus/sone/core/FreenetInterface.java index 0abc4b8..3efab56 100644 --- a/src/main/java/net/pterodactylus/sone/core/FreenetInterface.java +++ b/src/main/java/net/pterodactylus/sone/core/FreenetInterface.java @@ -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); } diff --git a/src/test/kotlin/net/pterodactylus/sone/core/FreenetInterfaceTest.kt b/src/test/kotlin/net/pterodactylus/sone/core/FreenetInterfaceTest.kt index 3bf5791..5fc3c73 100644 --- a/src/test/kotlin/net/pterodactylus/sone/core/FreenetInterfaceTest.kt +++ b/src/test/kotlin/net/pterodactylus/sone/core/FreenetInterfaceTest.kt @@ -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() - whenever(metadata.mimeType).thenReturn(mimeType) + whenever(metadata.isSimpleManifest).thenReturn(simpleManifest) + if (simpleManifest) { + val innerMetadata = mock().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)) } -- 2.7.4