X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fkotlin%2Fnet%2Fpterodactylus%2Fsone%2Ffreenet%2FAsyncFreenetInterface.kt;fp=src%2Fmain%2Fkotlin%2Fnet%2Fpterodactylus%2Fsone%2Ffreenet%2FAsyncFreenetInterface.kt;h=8219d7e660c46dfa44589084e6cf05a51c476ef7;hb=85f599866faef4142c1700702af4aa57ee9daaf8;hp=0000000000000000000000000000000000000000;hpb=76f50d5fcdd6bf662f5776ee9a13ae014dde92f1;p=Sone.git diff --git a/src/main/kotlin/net/pterodactylus/sone/freenet/AsyncFreenetInterface.kt b/src/main/kotlin/net/pterodactylus/sone/freenet/AsyncFreenetInterface.kt new file mode 100644 index 0000000..8219d7e --- /dev/null +++ b/src/main/kotlin/net/pterodactylus/sone/freenet/AsyncFreenetInterface.kt @@ -0,0 +1,27 @@ +package net.pterodactylus.sone.freenet + +import freenet.client.* +import freenet.keys.* +import kotlinx.coroutines.* +import net.pterodactylus.sone.core.* + +class AsyncFreenetInterface(private val freenetClient: FreenetClient) { + + suspend fun fetchUri(freenetUri: FreenetURI): Fetched { + var currentUri = freenetUri + var result: FetchResult? = null + while (result == null) { + try { + result = withContext(Dispatchers.Default) { freenetClient.fetch(currentUri) } + } catch (fetchException: FetchException) { + if (fetchException.mode == FetchException.FetchExceptionMode.PERMANENT_REDIRECT) { + currentUri = fetchException.newURI + continue + } else + throw fetchException + } + } + return Fetched(currentUri, result) + } + +}