Elka
10/15/2020, 2:39 PMrequest
, I never get a result
as if some “deadlock” occurred.
val requestBuilder = HttpRequestBuilder().takeFrom(context.request)
val result: HttpResponse = context.client!!.request(requestBuilder)
Any idea? Anyone implemented a RefreshToken feature that works with latest Ktor?ribesg
10/15/2020, 2:41 PMFeature
for that.
override fun install(feature: AuthFeature, scope: HttpClient) {
scope.requestPipeline.intercept(HttpRequestPipeline.State) {
if (context.usesAuthentication) {
val token = feature.authTokenService.getToken() ?: return@intercept
context.headers[HttpHeaders.Authorization] = "Bearer $token"
}
}
val circuitBreaker = AttributeKey<Unit>("my-auth-request")
scope.feature(HttpSend)!!.intercept { origin, context ->
if (origin.response.status != HttpStatusCode.Unauthorized) return@intercept origin
if (origin.request.attributes.contains(circuitBreaker)) return@intercept origin
if (!feature.authTokenService.refreshToken()) return@intercept origin
val token = feature.authTokenService.getToken() ?: return@intercept origin
val request = HttpRequestBuilder()
request.takeFromWithExecutionContext(context)
request.headers[HttpHeaders.Authorization] = "Bearer $token"
request.attributes.put(circuitBreaker, Unit)
return@intercept execute(request)
}
}
Elka
10/16/2020, 6:07 AMtakeFromWithExecutionContext
is internal in Ktor 1.4
ribesg
10/16/2020, 9:03 AM/**
* Mutates [this] copying all the data from another [builder] using it as base.
*/
@InternalAPI
public fun takeFromWithExecutionContext(builder: HttpRequestBuilder): HttpRequestBuilder {
executionContext = builder.executionContext
return takeFrom(builder)
}
public
Elka
10/18/2020, 3:32 PMHttpSend
Feature tracks the network call and cancels it when it is modified… Canceling it is necessary otherwise the new network call doesn’t kickstart.