From: David ‘Bombe’ Roden Date: Sat, 3 Oct 2026 20:17:22 +0000 (+0200) Subject: 🐛 Use simple manifest data for filtering, when present X-Git-Tag: v83^2~5^2~10 X-Git-Url: https://git.pterodactylus.net/?a=commitdiff_plain;h=dac547b48fc2fb956b4e2192e4c54cc4c44a52c7;p=Sone.git 🐛 Use simple manifest data for filtering, when present --- 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)) }