Last active
May 14, 2021 13:21
-
-
Save daviddenton/5f505eefd0170abdad2097df4a25e7e8 to your computer and use it in GitHub Desktop.
http4k AzureSdkHttpClient adapter
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import com.azure.core.http.HttpClient | |
import com.azure.core.http.HttpHeader | |
import com.azure.core.http.HttpHeaders | |
import com.azure.core.http.HttpRequest | |
import com.azure.core.http.HttpResponse | |
import org.http4k.core.Body | |
import org.http4k.core.Body.Companion.EMPTY | |
import org.http4k.core.HttpHandler | |
import org.http4k.core.Method | |
import org.http4k.core.Request | |
import org.http4k.core.Response | |
import reactor.core.publisher.Flux | |
import reactor.core.publisher.Mono | |
import java.nio.ByteBuffer | |
import java.nio.ByteBuffer.allocate | |
import java.nio.charset.Charset | |
import java.util.stream.Collectors | |
fun AzureSdkHttpClient(http4k: HttpHandler): HttpClient = HttpClient { request -> | |
Mono.fromCallable { Http4kAzureResponse(http4k(request.toHttp4k()), request) } | |
} | |
private fun HttpRequest.toHttp4k() = Request(Method.valueOf(httpMethod.name), url.toExternalForm()) | |
.headers(headers.toMap().toList()) | |
.body(body | |
.collect(Collectors.reducing { a, b -> | |
allocate(a.remaining() + b.remaining()).put(a).put(b) | |
}) | |
.block() | |
?.map { Body(it) } | |
?.orElse(EMPTY) | |
?: EMPTY | |
) | |
class Http4kAzureResponse(private val http4k: Response, request: HttpRequest) : HttpResponse(request) { | |
override fun getStatusCode() = http4k.status.code | |
override fun getHeaderValue(name: String) = http4k.header(name) | |
override fun getHeaders() = HttpHeaders(http4k.headers.map { HttpHeader(it.first, it.second) }) | |
override fun getBody(): Flux<ByteBuffer> = Flux.just(http4k.body.payload) | |
override fun getBodyAsByteArray(): Mono<ByteArray> = Mono.just(http4k.body.payload.array()) | |
override fun getBodyAsString(): Mono<String> = Mono.just(http4k.bodyString()) | |
override fun getBodyAsString(charset: Charset): Mono<String> = bodyAsByteArray.map { String(it, charset) } | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
implementation group: 'com.azure', name: 'azure-core', version: '1.16.0' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment