Skip to content

Commit 4193224

Browse files
authored
fix: Retry URLSession timeout error (#855)
1 parent 83234cc commit 4193224

File tree

2 files changed

+11
-16
lines changed

2 files changed

+11
-16
lines changed

Diff for: Sources/ClientRuntime/Retries/DefaultRetryErrorInfoProvider.swift

+7-6
Original file line numberDiff line numberDiff line change
@@ -18,28 +18,29 @@ public enum DefaultRetryErrorInfoProvider: RetryErrorInfoProvider, Sendable {
1818
/// - Parameter error: The error to be triaged for retry info
1919
/// - Returns: `RetryErrorInfo` for the passed error, or `nil` if the error should not be retried.
2020
public static func errorInfo(for error: Error) -> RetryErrorInfo? {
21-
var hint: TimeInterval?
2221
let retryableStatusCodes: [HTTPStatusCode] = [
2322
.internalServerError, // 500
2423
.badGateway, // 502
2524
.serviceUnavailable, // 503
2625
.gatewayTimeout, // 504
2726
]
28-
if let retryAfterString = (error as? HTTPError)?.httpResponse.headers.value(for: "x-retry-after") {
29-
hint = TimeInterval(retryAfterString)
30-
}
3127
if let modeledError = error as? ModeledError {
3228
let type = type(of: modeledError)
3329
guard type.isRetryable else { return nil }
3430
let errorType: RetryErrorType = type.isThrottling ? .throttling : type.fault.retryErrorType
35-
return .init(errorType: errorType, retryAfterHint: hint, isTimeout: false)
31+
return .init(errorType: errorType, retryAfterHint: nil, isTimeout: false)
3632
} else if let code = (error as? HTTPError)?.httpResponse.statusCode, retryableStatusCodes.contains(code) {
37-
return .init(errorType: .serverError, retryAfterHint: hint, isTimeout: false)
33+
return .init(errorType: .serverError, retryAfterHint: nil, isTimeout: false)
3834
} else if (error as NSError).domain == NSURLErrorDomain, (error as NSError).code == -1005 {
3935
// Domain == "NSURLErrorDomain"
4036
// NSURLErrorNetworkConnectionLost = -1005
4137
// "The network connection was lost."
4238
return .init(errorType: .transient, retryAfterHint: nil, isTimeout: false)
39+
} else if (error as NSError).domain == NSURLErrorDomain, (error as NSError).code == -1001 {
40+
// Domain == "NSURLErrorDomain"
41+
// NSURLErrorTimedOut = -1001
42+
// "The request timed out."
43+
return .init(errorType: .transient, retryAfterHint: nil, isTimeout: true)
4344
}
4445
return nil
4546
}

Diff for: Tests/SmithyRetriesTests/DefaultRetryErrorInfoProviderTests.swift

+4-10
Original file line numberDiff line numberDiff line change
@@ -130,15 +130,9 @@ final class DefaultRetryErrorInfoProviderTests: XCTestCase {
130130
XCTAssertEqual(errorInfo, .init(errorType: .transient, retryAfterHint: nil, isTimeout: false))
131131
}
132132

133-
// MARK: - Retry after hint
134-
135-
func test_errorInfo_returnsRetryAfterDelayWhenRetryAfterHeaderIsSet() {
136-
137-
struct RetryAfterError: Error, HTTPError {
138-
var httpResponse = HTTPResponse(headers: Headers(["x-retry-after": String(0.027)]), statusCode: .internalServerError)
139-
}
140-
141-
let errorInfo = DefaultRetryErrorInfoProvider.errorInfo(for: RetryAfterError())
142-
XCTAssertEqual(errorInfo?.retryAfterHint, 0.027)
133+
func test_errorInfo_returnsRetryAfterNetworkTimeout() {
134+
let timedOut = NSError(domain: NSURLErrorDomain, code: -1001)
135+
let errorInfo = DefaultRetryErrorInfoProvider.errorInfo(for: timedOut)
136+
XCTAssertEqual(errorInfo, .init(errorType: .transient, retryAfterHint: nil, isTimeout: true))
143137
}
144138
}

0 commit comments

Comments
 (0)