in anthropic-java-core/src/main/kotlin/com/anthropic/core/http/RetryingHttpClient.kt [32:71]
override fun execute(request: HttpRequest, requestOptions: RequestOptions): HttpResponse {
if (!isRetryable(request) || maxRetries <= 0) {
return httpClient.execute(request, requestOptions)
}
var modifiedRequest = maybeAddIdempotencyHeader(request)
// Don't send the current retry count in the headers if the caller set their own value.
val shouldSendRetryCount =
!modifiedRequest.headers.names().contains("X-Stainless-Retry-Count")
var retries = 0
while (true) {
if (shouldSendRetryCount) {
modifiedRequest = setRetryCountHeader(modifiedRequest, retries)
}
val response =
try {
val response = httpClient.execute(modifiedRequest, requestOptions)
if (++retries > maxRetries || !shouldRetry(response)) {
return response
}
response
} catch (throwable: Throwable) {
if (++retries > maxRetries || !shouldRetry(throwable)) {
throw throwable
}
null
}
val backoffDuration = getRetryBackoffDuration(retries, response)
// All responses must be closed, so close the failed one before retrying.
response?.close()
sleeper.sleep(backoffDuration)
}
}