🧑‍💻 Include reason for rejection in rejection object
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Sat, 3 Oct 2026 13:32:44 +0000 (15:32 +0200)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Sun, 4 Oct 2026 18:54:52 +0000 (20:54 +0200)
src/main/kotlin/net/pterodactylus/sone/core/DefaultElementLoader.kt
src/test/kotlin/net/pterodactylus/sone/core/DefaultElementLoaderTest.kt

index 7615776..72e9c78 100644 (file)
@@ -32,12 +32,12 @@ class DefaultElementLoader(private val freenetInterface: FreenetInterface, ticke
                override fun shouldCancel(uri: FreenetURI, mimeType: String, size: Long): Boolean {
                        if (size > 2097152) {
                                logger.fine { "Canceling download of $uri because it’s > 2 MiB." }
-                               rejectedElements += uri.toString() to RejectionReason.SizeTooLarge
+                               rejectedElements[uri.toString()] = Rejected(RejectionReason.SizeTooLarge, size)
                                return true
                        }
                        if (!mimeType.startsWith("image/") && !mimeType.startsWith("text/html")) {
                                logger.fine { "Canceling download of $uri because of its MIME type, $mimeType." }
-                               rejectedElements += uri.toString() to RejectionReason.InvalidMediaType
+                               rejectedElements[uri.toString()] = Rejected(RejectionReason.InvalidMediaType, mimeType)
                                return true
                        }
                        return false
@@ -111,7 +111,7 @@ class DefaultElementLoader(private val freenetInterface: FreenetInterface, ticke
        val loadedElements: Set<LinkedElement>
                get() = elementCache.asMap().values.toSet()
 
-       val rejectedElements: Map<String, RejectionReason>
+       val rejectedElements: Map<String, Rejected>
                field = mutableMapOf()
 
        val failedElements: Set<String>
@@ -124,6 +124,8 @@ class DefaultElementLoader(private val freenetInterface: FreenetInterface, ticke
 
        }
 
+       data class Rejected(val reason: RejectionReason, val data: Any)
+
 }
 
 private fun String.decode() = try { URLDecoder.decode(this, "UTF-8")!! } catch (e: RuntimeException) { freenet.support.Logger.error(DefaultElementLoader::class.java, "Could not decode %s!".format(this), e); throw e }
index eb9ee15..bc2f177 100644 (file)
@@ -10,6 +10,7 @@ import java.util.logging.Level.ALL
 import java.util.logging.LogRecord
 import java.util.logging.Logger
 import kotlin.math.min
+import net.pterodactylus.sone.core.DefaultElementLoader.Rejected
 import net.pterodactylus.sone.core.DefaultElementLoader.RejectionReason.InvalidMediaType
 import net.pterodactylus.sone.core.DefaultElementLoader.RejectionReason.SizeTooLarge
 import net.pterodactylus.sone.core.FreenetInterface.BackgroundFetchCallback
@@ -263,7 +264,7 @@ class DefaultElementLoaderTest {
        fun `element loader exposes rejected element when media type does not match`() {
                runWithCallback("KSK@test") { elementLoader, _, callback, _ ->
                        callback.shouldCancel(FreenetURI("KSK@test"), "application/x-test-data", 1234)
-                       assertThat(elementLoader.rejectedElements, hasEntry("KSK@test", InvalidMediaType))
+                       assertThat(elementLoader.rejectedElements, hasEntry("KSK@test", Rejected(InvalidMediaType, "application/x-test-data")))
                }
        }
 
@@ -271,7 +272,7 @@ class DefaultElementLoaderTest {
        fun `element loader exposes rejected element when data is too large`() {
                runWithCallback("KSK@test") { elementLoader, _, callback, _ ->
                        callback.shouldCancel(FreenetURI("KSK@test"), "image/png", 12345678)
-                       assertThat(elementLoader.rejectedElements, hasEntry("KSK@test", SizeTooLarge))
+                       assertThat(elementLoader.rejectedElements, hasEntry("KSK@test", Rejected(SizeTooLarge, 12345678L)))
                }
        }