class KtorBlockingFetcher(val ktorClient: HttpClient) : BlockingFetcher<HttpRequestBuilder> {
override fun fetch(request: HttpRequestBuilder): Result = runBlocking { // runBlocking because ktor is fully build on coroutines but in our example we want it blocking
with(ktorClient.request<HttpResponse>(request)) { // do http call with ktor client
Result( // map ktor result to skrape{it} result
responseBody = readText(),
responseStatus = Result.Status(status.value, status.description),
contentType = contentType()?.toString(),
headers = headers.toMap().mapValues { it.value.firstOrNull().orEmpty() },
baseUri = request.url.toString(),
cookies = listOf(setCookie()) as List<Cookie>
override val requestBuilder: HttpRequestBuilder
get() = HttpRequestBuilder()