Skip to content

Instantly share code, notes, and snippets.

@daviddenton
Last active May 14, 2021 13:21
Show Gist options
  • Save daviddenton/5f505eefd0170abdad2097df4a25e7e8 to your computer and use it in GitHub Desktop.
Save daviddenton/5f505eefd0170abdad2097df4a25e7e8 to your computer and use it in GitHub Desktop.
http4k AzureSdkHttpClient adapter
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) }
}
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