Skip to content

Commit

Permalink
feat: RetryErrorInfoProvider is configurable per-protocol (#565)
Browse files Browse the repository at this point in the history
  • Loading branch information
jbelkins committed Jun 20, 2023
1 parent 7aafee3 commit 6eb145f
Show file tree
Hide file tree
Showing 6 changed files with 20 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,6 @@
public struct DefaultSDKRuntimeConfiguration<DefaultSDKRuntimeRetryStrategy: RetryStrategy,
DefaultSDKRuntimeRetryErrorInfoProvider: RetryErrorInfoProvider> {

public typealias DefaultSDKRuntimeRetryStrategy = DefaultRetryStrategy
public typealias DefaultSDKRuntimeRetryErrorInfoProvider = DefaultRetryErrorInfoProvider

/// The name of this Smithy service.
public var serviceName: String

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ public enum DefaultRetryErrorInfoProvider: RetryErrorInfoProvider {
.gatewayTimeout, // 504
]

/// Returns information used to determine how & if to retry an error.
/// - Parameter error: The error to be triaged for retry info
/// - Returns: `RetryErrorInfo` for the passed error, or `nil` if the error should not be retried.
public static func errorInfo(for error: Error) -> RetryErrorInfo? {
var hint: TimeInterval?
if let retryAfterString = (error as? HTTPError)?.httpResponse.headers.value(for: "x-retry-after") {
Expand Down
8 changes: 7 additions & 1 deletion Sources/ClientRuntime/Retries/RetryErrorInfo.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,11 @@ public struct RetryErrorInfo: Equatable {
public let retryAfterHint: TimeInterval?

/// Whether this error is a network timeout error.
var isTimeout: Bool
public var isTimeout: Bool

public init(errorType: RetryErrorType, retryAfterHint: TimeInterval?, isTimeout: Bool) {
self.errorType = errorType
self.retryAfterHint = retryAfterHint
self.isTimeout = isTimeout
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -415,7 +415,7 @@ abstract class HttpBindingProtocolGenerator : ProtocolGenerator {

operationMiddleware.appendMiddleware(operation, DeserializeMiddleware(ctx.model, ctx.symbolProvider))
operationMiddleware.appendMiddleware(operation, LoggingMiddleware(ctx.model, ctx.symbolProvider))
operationMiddleware.appendMiddleware(operation, RetryMiddleware(ctx.model, ctx.symbolProvider))
operationMiddleware.appendMiddleware(operation, RetryMiddleware(ctx.model, ctx.symbolProvider, retryErrorInfoProviderSymbol))

addProtocolSpecificMiddleware(ctx, operation)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ interface ProtocolGenerator {
val DefaultServiceErrorProtocolSymbol: Symbol = ClientRuntimeTypes.Core.ServiceError

val DefaultUnknownServiceErrorSymbol: Symbol = ClientRuntimeTypes.Http.UnknownHttpServiceError

val DefaultRetryErrorInfoProviderSymbol: Symbol = ClientRuntimeTypes.Core.DefaultRetryErrorInfoProvider
}

/**
Expand Down Expand Up @@ -86,6 +88,9 @@ interface ProtocolGenerator {
val unknownServiceErrorSymbol: Symbol
get() = DefaultUnknownServiceErrorSymbol

val retryErrorInfoProviderSymbol: Symbol
get() = DefaultRetryErrorInfoProviderSymbol

/**
* Generate serializers required by the protocol
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

package software.amazon.smithy.swift.codegen.integration.middlewares

import software.amazon.smithy.codegen.core.Symbol
import software.amazon.smithy.codegen.core.SymbolProvider
import software.amazon.smithy.model.Model
import software.amazon.smithy.model.shapes.OperationShape
Expand All @@ -17,7 +18,8 @@ import software.amazon.smithy.swift.codegen.middleware.MiddlewareStep

class RetryMiddleware(
val model: Model,
val symbolProvider: SymbolProvider
val symbolProvider: SymbolProvider,
val retryErrorInfoProviderSymbol: Symbol,
) : MiddlewareRenderable {

override val name = "RetryMiddleware"
Expand All @@ -33,7 +35,7 @@ class RetryMiddleware(
"$operationStackName.${middlewareStep.stringValue()}.intercept(position: ${position.stringValue()}, middleware: \$N<\$N, \$N, \$N, \$N>(options: config.retryStrategyOptions))",
ClientRuntimeTypes.Middleware.RetryMiddleware,
ClientRuntimeTypes.Core.DefaultRetryStrategy,
ClientRuntimeTypes.Core.DefaultRetryErrorInfoProvider,
retryErrorInfoProviderSymbol,
output,
outputError
)
Expand Down

0 comments on commit 6eb145f

Please sign in to comment.