New feature for retrying request after failed #26
New feature for retrying request after failed #26vevar wants to merge 3 commits intoicerockdev:developfrom
Conversation
network/src/commonMain/kotlin/dev/icerock/moko/network/features/HttpRetrySendFeature.kt
Show resolved
Hide resolved
| @param onGetDelay the callback for calculation a delay between failed request and next request | ||
| @param maxAmountRetrying the max amounts retrying requests | ||
| @param onConditionRetrying the callback for condition a retrying request. By default it check `e is IOException ` |
There was a problem hiding this comment.
naming invalid. onGetDelay called as callback, but it not "callback" - it behavior function. i suggest delayGetter: (lastDelayInMillisecond: Long, timeRetrying: Int) -> Long naming.
for onConditionRetrying - isShouldRetryRequest(e: Throwable): Boolean
| context.headers.remove(LAST_DELAY_HEADER) | ||
| context.headers.remove(RETRY_COUNTER_HEADER) | ||
| proceed() |
There was a problem hiding this comment.
strange logic. we send request without headers, but later we send request with headers one time and if it failed - we not catch again...do you debug this logic?
There was a problem hiding this comment.
In final this headers not send in a futher phase after HttpSendPipeline.Before. Logic:
if request failed then I'm fininishing current request(all pipeline) and create new request (new pipeline(requestPipeline->sendPipeline)) adding info in headers when new request(retryed) come in the HttpSendPipeline.Before phase then I get info from headers and I delete these headers then send to next phase.
If counter more or equel maxAmountsRetrying, I send to next phase like common request, that could throw a not handled exception(in this feature).
There was a problem hiding this comment.
confused logic in code...support of this will be pain - we should rework it to more clear version. @Tetraquark will help you
| feature.tokenProvider.getToken()?.apply { | ||
| context.headers.remove(feature.tokenHeaderName) | ||
| context.header(feature.tokenHeaderName, this) | ||
| context.headers[feature.tokenHeaderName] = this |
There was a problem hiding this comment.
Because it replace two operation(maybe more, search->get->delete-->add) to one(rewrite | write) => mini performance)
There was a problem hiding this comment.
it was added because we have case when multiple tokens was sent
| requestBuilder.headers[RETRY_COUNTER_HEADER] = indexRetrying.toString() | ||
| requestBuilder.headers[LAST_DELAY_HEADER] = nextDelay.toString() | ||
| delay(nextDelay) | ||
| finish() |
There was a problem hiding this comment.
for what we finish pipeline? later called proceed
There was a problem hiding this comment.
When finish a pipeline without a calling of proceedWith the ktor throw error:
java.lang.IllegalStateException: Failed to execute send pipeline. Expected to got [HttpClientCall], but received EmptyContent at io.ktor.client.features.HttpSend$DefaultSender.execute(HttpSend.kt:120) at io.ktor.client.features.HttpSend$DefaultSender$execute$1.invokeSuspend(Unknown Source:12) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(PipelineContext.kt:238) at io.ktor.util.pipeline.SuspendFunctionGun.loop(PipelineContext.kt:194) at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(PipelineContext.kt:67) at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(PipelineContext.kt:144) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46) at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(PipelineContext.kt:238) at io.ktor.util.pipeline.SuspendFunctionGun.loop(PipelineContext.kt:194) at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(PipelineContext.kt:67) at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(PipelineContext.kt:144) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46) at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(PipelineContext.kt:238) at io.ktor.util.pipeline.SuspendFunctionGun.loop(PipelineContext.kt:194) at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(PipelineContext.kt:67) at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(PipelineContext.kt:144) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46) at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(PipelineContext.kt:238) at io.ktor.util.pipeline.SuspendFunctionGun.loop(PipelineContext.kt:194) at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(PipelineContext.kt:67) at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(PipelineContext.kt:144) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46) at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(PipelineContext.kt:238) at io.ktor.util.pipeline.SuspendFunctionGun.loop(PipelineContext.kt:194) at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(PipelineContext.kt:67) at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(PipelineContext.kt:144) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46) at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(PipelineContext.kt:238) at io.ktor.util.pipeline.SuspendFunctionGun.loop(PipelineContext.kt:194) at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(PipelineContext.kt:67) at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(PipelineContext.kt:144) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:56) at android.os.Handler.handleCallback(Handler.java:883) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7403) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)
No description provided.