🔀 Merge “release/v81” into “master”
[Sone.git] / src / main / kotlin / net / pterodactylus / sone / freenet / AsyncFreenetInterface.kt
1 package net.pterodactylus.sone.freenet
2
3 import freenet.client.*
4 import freenet.keys.*
5 import kotlinx.coroutines.*
6 import net.pterodactylus.sone.core.*
7
8 class AsyncFreenetInterface(private val freenetClient: FreenetClient) {
9
10         suspend fun fetchUri(freenetUri: FreenetURI): Fetched {
11                 var currentUri = freenetUri
12                 var result: FetchResult? = null
13                 while (result == null) {
14                         try {
15                                 result = withContext(Dispatchers.Default) { freenetClient.fetch(currentUri) }
16                         } catch (fetchException: FetchException) {
17                                 if (fetchException.mode == FetchException.FetchExceptionMode.PERMANENT_REDIRECT) {
18                                         currentUri = fetchException.newURI
19                                         continue
20                                 } else
21                                         throw fetchException
22                         }
23                 }
24                 return Fetched(currentUri, result)
25         }
26
27 }