diff --git a/.changelog/d74f8a813ddb431fb6006abefbdaba1b.json b/.changelog/d74f8a813ddb431fb6006abefbdaba1b.json index 98f835341b2..2704314e8cd 100644 --- a/.changelog/d74f8a813ddb431fb6006abefbdaba1b.json +++ b/.changelog/d74f8a813ddb431fb6006abefbdaba1b.json @@ -3,365 +3,6 @@ "type": "feature", "description": "add recursion detection middleware to all SDK requests to avoid recursion invocation in Lambda", "modules": [ - ".", - "example/service/dynamodb/createTable", - "example/service/dynamodb/scanItems", - "example/service/s3/listObjects", - "example/service/s3/usingPrivateLink", - "feature/dynamodb/attributevalue", - "feature/dynamodb/expression", - "feature/dynamodbstreams/attributevalue", - "feature/s3/manager", - "internal/protocoltest/awsrestjson", - "internal/protocoltest/ec2query", - "internal/protocoltest/jsonrpc", - "internal/protocoltest/jsonrpc10", - "internal/protocoltest/query", - "internal/protocoltest/restxml", - "internal/protocoltest/restxmlwithnamespace", - "service/accessanalyzer", - "service/account", - "service/acm", - "service/acmpca", - "service/alexaforbusiness", - "service/amp", - "service/amplify", - "service/amplifybackend", - "service/amplifyuibuilder", - "service/apigateway", - "service/apigatewaymanagementapi", - "service/apigatewayv2", - "service/appconfig", - "service/appconfigdata", - "service/appflow", - "service/appintegrations", - "service/applicationautoscaling", - "service/applicationcostprofiler", - "service/applicationdiscoveryservice", - "service/applicationinsights", - "service/appmesh", - "service/apprunner", - "service/appstream", - "service/appsync", - "service/arczonalshift", - "service/athena", - "service/auditmanager", - "service/autoscaling", - "service/autoscalingplans", - "service/backup", - "service/backupgateway", - "service/backupstorage", - "service/batch", - "service/billingconductor", - "service/braket", - "service/budgets", - "service/chime", - "service/chimesdkidentity", - "service/chimesdkmediapipelines", - "service/chimesdkmeetings", - "service/chimesdkmessaging", - "service/chimesdkvoice", - "service/cleanrooms", - "service/cloud9", - "service/cloudcontrol", - "service/clouddirectory", - "service/cloudformation", - "service/cloudfront", - "service/cloudhsm", - "service/cloudhsmv2", - "service/cloudsearch", - "service/cloudsearchdomain", - "service/cloudtrail", - "service/cloudtraildata", - "service/cloudwatch", - "service/cloudwatchevents", - "service/cloudwatchlogs", - "service/codeartifact", - "service/codebuild", - "service/codecatalyst", - "service/codecommit", - "service/codedeploy", - "service/codeguruprofiler", - "service/codegurureviewer", - "service/codepipeline", - "service/codestar", - "service/codestarconnections", - "service/codestarnotifications", - "service/cognitoidentity", - "service/cognitoidentityprovider", - "service/cognitosync", - "service/comprehend", - "service/comprehendmedical", - "service/computeoptimizer", - "service/configservice", - "service/connect", - "service/connectcampaigns", - "service/connectcases", - "service/connectcontactlens", - "service/connectparticipant", - "service/controltower", - "service/costandusagereportservice", - "service/costexplorer", - "service/customerprofiles", - "service/databasemigrationservice", - "service/databrew", - "service/dataexchange", - "service/datapipeline", - "service/datasync", - "service/dax", - "service/detective", - "service/devicefarm", - "service/devopsguru", - "service/directconnect", - "service/directoryservice", - "service/dlm", - "service/docdb", - "service/docdbelastic", - "service/drs", - "service/dynamodb", - "service/dynamodbstreams", - "service/ebs", - "service/ec2", - "service/ec2instanceconnect", - "service/ecr", - "service/ecrpublic", - "service/ecs", - "service/efs", - "service/eks", - "service/elasticache", - "service/elasticbeanstalk", - "service/elasticinference", - "service/elasticloadbalancing", - "service/elasticloadbalancingv2", - "service/elasticsearchservice", - "service/elastictranscoder", - "service/emr", - "service/emrcontainers", - "service/emrserverless", - "service/eventbridge", - "service/evidently", - "service/finspace", - "service/finspacedata", - "service/firehose", - "service/fis", - "service/fms", - "service/forecast", - "service/forecastquery", - "service/frauddetector", - "service/fsx", - "service/gamelift", - "service/gamesparks", - "service/glacier", - "service/globalaccelerator", - "service/glue", - "service/grafana", - "service/greengrass", - "service/greengrassv2", - "service/groundstation", - "service/guardduty", - "service/health", - "service/healthlake", - "service/honeycode", - "service/iam", - "service/identitystore", - "service/imagebuilder", - "service/inspector", - "service/inspector2", - "service/internal/benchmark", - "service/internal/integrationtest", - "service/internetmonitor", - "service/iot", - "service/iot1clickdevicesservice", - "service/iot1clickprojects", - "service/iotanalytics", - "service/iotdataplane", - "service/iotdeviceadvisor", - "service/iotevents", - "service/ioteventsdata", - "service/iotfleethub", - "service/iotfleetwise", - "service/iotjobsdataplane", - "service/iotroborunner", - "service/iotsecuretunneling", - "service/iotsitewise", - "service/iotthingsgraph", - "service/iottwinmaker", - "service/iotwireless", - "service/ivs", - "service/ivschat", - "service/ivsrealtime", - "service/kafka", - "service/kafkaconnect", - "service/kendra", - "service/kendraranking", - "service/keyspaces", - "service/kinesis", - "service/kinesisanalytics", - "service/kinesisanalyticsv2", - "service/kinesisvideo", - "service/kinesisvideoarchivedmedia", - "service/kinesisvideomedia", - "service/kinesisvideosignaling", - "service/kinesisvideowebrtcstorage", - "service/kms", - "service/lakeformation", - "service/lambda", - "service/lexmodelbuildingservice", - "service/lexmodelsv2", - "service/lexruntimeservice", - "service/lexruntimev2", - "service/licensemanager", - "service/licensemanagerlinuxsubscriptions", - "service/licensemanagerusersubscriptions", - "service/lightsail", - "service/location", - "service/lookoutequipment", - "service/lookoutmetrics", - "service/lookoutvision", - "service/m2", - "service/machinelearning", - "service/macie", - "service/macie2", - "service/managedblockchain", - "service/marketplacecatalog", - "service/marketplacecommerceanalytics", - "service/marketplaceentitlementservice", - "service/marketplacemetering", - "service/mediaconnect", - "service/mediaconvert", - "service/medialive", - "service/mediapackage", - "service/mediapackagevod", - "service/mediastore", - "service/mediastoredata", - "service/mediatailor", - "service/memorydb", - "service/mgn", - "service/migrationhub", - "service/migrationhubconfig", - "service/migrationhuborchestrator", - "service/migrationhubrefactorspaces", - "service/migrationhubstrategy", - "service/mobile", - "service/mq", - "service/mturk", - "service/mwaa", - "service/neptune", - "service/networkfirewall", - "service/networkmanager", - "service/nimble", - "service/oam", - "service/omics", - "service/opensearch", - "service/opensearchserverless", - "service/opsworks", - "service/opsworkscm", - "service/organizations", - "service/outposts", - "service/panorama", - "service/personalize", - "service/personalizeevents", - "service/personalizeruntime", - "service/pi", - "service/pinpoint", - "service/pinpointemail", - "service/pinpointsmsvoice", - "service/pinpointsmsvoicev2", - "service/pipes", - "service/polly", - "service/pricing", - "service/privatenetworks", - "service/proton", - "service/qldb", - "service/qldbsession", - "service/quicksight", - "service/ram", - "service/rbin", - "service/rds", - "service/rdsdata", - "service/redshift", - "service/redshiftdata", - "service/redshiftserverless", - "service/rekognition", - "service/resiliencehub", - "service/resourceexplorer2", - "service/resourcegroups", - "service/resourcegroupstaggingapi", - "service/robomaker", - "service/rolesanywhere", - "service/route53", - "service/route53domains", - "service/route53recoverycluster", - "service/route53recoverycontrolconfig", - "service/route53recoveryreadiness", - "service/route53resolver", - "service/rum", - "service/s3", - "service/s3control", - "service/s3outposts", - "service/sagemaker", - "service/sagemakera2iruntime", - "service/sagemakeredge", - "service/sagemakerfeaturestoreruntime", - "service/sagemakergeospatial", - "service/sagemakermetrics", - "service/sagemakerruntime", - "service/savingsplans", - "service/scheduler", - "service/schemas", - "service/secretsmanager", - "service/securityhub", - "service/securitylake", - "service/serverlessapplicationrepository", - "service/servicecatalog", - "service/servicecatalogappregistry", - "service/servicediscovery", - "service/servicequotas", - "service/ses", - "service/sesv2", - "service/sfn", - "service/shield", - "service/signer", - "service/simspaceweaver", - "service/sms", - "service/snowball", - "service/snowdevicemanagement", - "service/sns", - "service/sqs", - "service/ssm", - "service/ssmcontacts", - "service/ssmincidents", - "service/ssmsap", - "service/sso", - "service/ssoadmin", - "service/ssooidc", - "service/storagegateway", - "service/sts", - "service/support", - "service/supportapp", - "service/swf", - "service/synthetics", - "service/textract", - "service/timestreamquery", - "service/timestreamwrite", - "service/tnb", - "service/transcribe", - "service/transcribestreaming", - "service/transfer", - "service/translate", - "service/voiceid", - "service/vpclattice", - "service/waf", - "service/wafregional", - "service/wafv2", - "service/wellarchitected", - "service/wisdom", - "service/workdocs", - "service/worklink", - "service/workmail", - "service/workmailmessageflow", - "service/workspaces", - "service/workspacesweb", - "service/xray" + "." ] } \ No newline at end of file diff --git a/aws/middleware/middleware.go b/aws/middleware/middleware.go index 7378d744dd8..9bd0dfb1508 100644 --- a/aws/middleware/middleware.go +++ b/aws/middleware/middleware.go @@ -3,7 +3,6 @@ package middleware import ( "context" "fmt" - "os" "time" "github.com/aws/aws-sdk-go-v2/internal/rand" @@ -167,84 +166,3 @@ func AddRawResponseToMetadata(stack *middleware.Stack) error { func GetRawResponse(metadata middleware.Metadata) interface{} { return metadata.Get(rawResponseKey{}) } - -// AddRecursionDetection adds recursionDetection to the middleware stack -func AddRecursionDetection(stack *middleware.Stack) error { - return stack.Build.Add(&RecursionDetection{}, middleware.After) -} - -// RecursionDetection detects Lambda environment and sets its X-Ray trace ID to request header if absent -// to avoid recursion invocation in Lambda -type RecursionDetection struct{} - -// ID returns the middleware identifier -func (m *RecursionDetection) ID() string { - return "RecursionDetection" -} - -// HandleBuild detects Lambda environment and adds its trace ID to request header if absent -func (m *RecursionDetection) HandleBuild( - ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler, -) ( - out middleware.BuildOutput, metadata middleware.Metadata, err error, -) { - req, ok := in.Request.(*smithyhttp.Request) - if !ok { - return out, metadata, fmt.Errorf("unknown request type %T", req) - } - - _, hasLambdaEnv := os.LookupEnv("AWS_LAMBDA_FUNCTION_NAME") - xAmznTraceID, hasTraceID := os.LookupEnv("_X_AMZN_TRACE_ID") - value := req.Header.Get("X-Amzn-Trace-Id") - // only set the X-Amzn-Trace-Id header when it is not set initially, the - // current environment is Lambda and the _X_AMZN_TRACE_ID env variable exists - if value != "" || !hasLambdaEnv || !hasTraceID { - return next.HandleBuild(ctx, in) - } - - req.Header.Set("X-Amzn-Trace-Id", percentEncode(xAmznTraceID)) - return next.HandleBuild(ctx, in) -} - -func percentEncode(s string) string { - upperhex := "0123456789ABCDEF" - hexCount := 0 - for i := 0; i < len(s); i++ { - c := s[i] - if shouldEncode(c) { - hexCount++ - } - } - - if hexCount == 0 { - return s - } - - required := len(s) + 2*hexCount - t := make([]byte, required) - j := 0 - for i := 0; i < len(s); i++ { - if c := s[i]; shouldEncode(c) { - t[j] = '%' - t[j+1] = upperhex[c>>4] - t[j+2] = upperhex[c&15] - j += 3 - } else { - t[j] = c - j++ - } - } - return string(t) -} - -func shouldEncode(c byte) bool { - if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9' { - return false - } - switch c { - case '-', '=', ';', ':', '+', '&', '[', ']', '{', '}', '"', '\'', ',': - return false - default: - return true - } -} diff --git a/aws/middleware/middleware_test.go b/aws/middleware/middleware_test.go index 17a1048a2bd..e4a69c9c22a 100644 --- a/aws/middleware/middleware_test.go +++ b/aws/middleware/middleware_test.go @@ -4,7 +4,6 @@ import ( "bytes" "context" "net/http" - "os" "reflect" "strings" "testing" @@ -188,98 +187,3 @@ func TestAttemptClockSkewHandler(t *testing.T) { }) } } - -func TestRecursionDetection(t *testing.T) { - const lambdaFunc = "AWS_LAMBDA_FUNCTION_NAME" - const traceID = "_X_AMZN_TRACE_ID" - const traceIDHeaderKey = "X-Amzn-Trace-Id" - - cases := map[string]struct { - LambdaFuncName string - TraceID string - HeaderBefore string - HeaderAfter string - }{ - "non lambda env and no trace ID header before": {}, - "with lambda env but no trace ID env variable, no trace ID header before": { - LambdaFuncName: "some-function1", - }, - "with lambda env and trace ID env variable, no trace ID header before": { - LambdaFuncName: "some-function2", - TraceID: "traceID1", - HeaderAfter: "traceID1", - }, - "with lambda env and trace ID env variable, has trace ID header before": { - LambdaFuncName: "some-function3", - TraceID: "traceID2", - HeaderBefore: "traceID1", - HeaderAfter: "traceID1", - }, - "with lambda env and trace ID (needs encoding) env variable, no trace ID header before": { - LambdaFuncName: "some-function4", - TraceID: "traceID3\n", - HeaderAfter: "traceID3%0A", - }, - "with lambda env and trace ID (contains chars must not be encoded) env variable, no trace ID header before": { - LambdaFuncName: "some-function5", - TraceID: "traceID4-=;:+&[]{}\"'", - HeaderAfter: "traceID4-=;:+&[]{}\"'", - }, - } - - for name, c := range cases { - t.Run(name, func(t *testing.T) { - // has to pre-check if current os has lambda function and trace ID environment variable - // if exists, need to restore them after each test case - initialLambdaFunc, hasInitialLambdaFunc := os.LookupEnv(lambdaFunc) - initialTraceID, hasInitialTraceID := os.LookupEnv(traceID) - - setEnvVar(t, lambdaFunc, c.LambdaFuncName) - setEnvVar(t, traceID, c.TraceID) - - req := smithyhttp.NewStackRequest().(*smithyhttp.Request) - if c.HeaderBefore != "" { - req.Header.Set(traceIDHeaderKey, c.HeaderBefore) - } - var updatedRequest *smithyhttp.Request - m := middleware.RecursionDetection{} - _, _, err := m.HandleBuild(context.Background(), - smithymiddleware.BuildInput{Request: req}, - smithymiddleware.BuildHandlerFunc(func(ctx context.Context, input smithymiddleware.BuildInput) ( - out smithymiddleware.BuildOutput, metadata smithymiddleware.Metadata, err error) { - updatedRequest = input.Request.(*smithyhttp.Request) - return out, metadata, nil - }), - ) - if err != nil { - t.Fatalf("expect no error, got %v", err) - } - - if e, a := c.HeaderAfter, updatedRequest.Header.Get(traceIDHeaderKey); e != a { - t.Errorf("expect header value %v found, got %v", e, a) - } - - recoverEnvVar(hasInitialLambdaFunc, lambdaFunc, initialLambdaFunc) - recoverEnvVar(hasInitialTraceID, traceID, initialTraceID) - }) - } -} - -// check if test case has environment variable and set to os if it has -func setEnvVar(t *testing.T, key, value string) { - if value != "" { - err := os.Setenv(key, value) - if err != nil { - t.Fatalf("expect no error, got %v", err) - } - } -} - -// check and recover initial lambda env variables or unset them -func recoverEnvVar(hasEnvVar bool, key, value string) { - if hasEnvVar { - os.Setenv(key, value) - } else { - os.Unsetenv(key) - } -} diff --git a/aws/middleware/recursion_detection.go b/aws/middleware/recursion_detection.go new file mode 100644 index 00000000000..a1a7cf1ea2f --- /dev/null +++ b/aws/middleware/recursion_detection.go @@ -0,0 +1,94 @@ +package middleware + +import ( + "context" + "fmt" + "github.com/aws/smithy-go/middleware" + smithyhttp "github.com/aws/smithy-go/transport/http" + "os" +) + +const envAwsLambdaFunctionName = "AWS_LAMBDA_FUNCTION_NAME" +const envAmznTraceId = "_X_AMZN_TRACE_ID" +const amznTraceIdHeader = "X-Amzn-Trace-Id" + +// AddRecursionDetection adds recursionDetection to the middleware stack +func AddRecursionDetection(stack *middleware.Stack) error { + return stack.Build.Add(&RecursionDetection{}, middleware.After) +} + +// RecursionDetection detects Lambda environment and sets its X-Ray trace ID to request header if absent +// to avoid recursion invocation in Lambda +type RecursionDetection struct{} + +// ID returns the middleware identifier +func (m *RecursionDetection) ID() string { + return "RecursionDetection" +} + +// HandleBuild detects Lambda environment and adds its trace ID to request header if absent +func (m *RecursionDetection) HandleBuild( + ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler, +) ( + out middleware.BuildOutput, metadata middleware.Metadata, err error, +) { + req, ok := in.Request.(*smithyhttp.Request) + if !ok { + return out, metadata, fmt.Errorf("unknown request type %T", req) + } + + _, hasLambdaEnv := os.LookupEnv(envAwsLambdaFunctionName) + xAmznTraceID, hasTraceID := os.LookupEnv(envAmznTraceId) + value := req.Header.Get(amznTraceIdHeader) + // only set the X-Amzn-Trace-Id header when it is not set initially, the + // current environment is Lambda and the _X_AMZN_TRACE_ID env variable exists + if value != "" || !hasLambdaEnv || !hasTraceID { + return next.HandleBuild(ctx, in) + } + + req.Header.Set(amznTraceIdHeader, percentEncode(xAmznTraceID)) + return next.HandleBuild(ctx, in) +} + +func percentEncode(s string) string { + upperhex := "0123456789ABCDEF" + hexCount := 0 + for i := 0; i < len(s); i++ { + c := s[i] + if shouldEncode(c) { + hexCount++ + } + } + + if hexCount == 0 { + return s + } + + required := len(s) + 2*hexCount + t := make([]byte, required) + j := 0 + for i := 0; i < len(s); i++ { + if c := s[i]; shouldEncode(c) { + t[j] = '%' + t[j+1] = upperhex[c>>4] + t[j+2] = upperhex[c&15] + j += 3 + } else { + t[j] = c + j++ + } + } + return string(t) +} + +func shouldEncode(c byte) bool { + if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9' { + return false + } + switch c { + case '-', '=', ';', ':', '+', '&', '[', ']', '{', '}', '"', '\'', ',': + return false + default: + return true + } +} diff --git a/aws/middleware/recursion_detection_test.go b/aws/middleware/recursion_detection_test.go new file mode 100644 index 00000000000..64e79c5eb68 --- /dev/null +++ b/aws/middleware/recursion_detection_test.go @@ -0,0 +1,87 @@ +package middleware + +import ( + "context" + smithymiddleware "github.com/aws/smithy-go/middleware" + smithyhttp "github.com/aws/smithy-go/transport/http" + "os" + "testing" +) + +func TestRecursionDetection(t *testing.T) { + cases := map[string]struct { + LambdaFuncName string + TraceID string + HeaderBefore string + HeaderAfter string + }{ + "non lambda env and no trace ID header before": {}, + "with lambda env but no trace ID env variable, no trace ID header before": { + LambdaFuncName: "some-function1", + }, + "with lambda env and trace ID env variable, no trace ID header before": { + LambdaFuncName: "some-function2", + TraceID: "traceID1", + HeaderAfter: "traceID1", + }, + "with lambda env and trace ID env variable, has trace ID header before": { + LambdaFuncName: "some-function3", + TraceID: "traceID2", + HeaderBefore: "traceID1", + HeaderAfter: "traceID1", + }, + "with lambda env and trace ID (needs encoding) env variable, no trace ID header before": { + LambdaFuncName: "some-function4", + TraceID: "traceID3\n", + HeaderAfter: "traceID3%0A", + }, + "with lambda env and trace ID (contains chars must not be encoded) env variable, no trace ID header before": { + LambdaFuncName: "some-function5", + TraceID: "traceID4-=;:+&[]{}\"'", + HeaderAfter: "traceID4-=;:+&[]{}\"'", + }, + } + + for name, c := range cases { + t.Run(name, func(t *testing.T) { + // clear current case's environment variables and restore them at the end of the test func goroutine + restoreEnv := clearEnv() + defer restoreEnv() + + setEnvVar(t, envAwsLambdaFunctionName, c.LambdaFuncName) + setEnvVar(t, envAmznTraceId, c.TraceID) + + req := smithyhttp.NewStackRequest().(*smithyhttp.Request) + if c.HeaderBefore != "" { + req.Header.Set(amznTraceIdHeader, c.HeaderBefore) + } + var updatedRequest *smithyhttp.Request + m := RecursionDetection{} + _, _, err := m.HandleBuild(context.Background(), + smithymiddleware.BuildInput{Request: req}, + smithymiddleware.BuildHandlerFunc(func(ctx context.Context, input smithymiddleware.BuildInput) ( + out smithymiddleware.BuildOutput, metadata smithymiddleware.Metadata, err error) { + updatedRequest = input.Request.(*smithyhttp.Request) + return out, metadata, nil + }), + ) + if err != nil { + t.Fatalf("expect no error, got %v", err) + } + + if e, a := c.HeaderAfter, updatedRequest.Header.Get(amznTraceIdHeader); e != a { + t.Errorf("expect header value %v found, got %v", e, a) + } + }) + } +} + +// check if test case has environment variable and set to os if it has +func setEnvVar(t *testing.T, key, value string) { + if value != "" { + err := os.Setenv(key, value) + if err != nil { + t.Fatalf("expect no error, got %v", err) + } + } +} diff --git a/service/drs/api_op_CreateLaunchConfigurationTemplate.go b/service/drs/api_op_CreateLaunchConfigurationTemplate.go index 8ea556b4a99..71aac7bceb8 100644 --- a/service/drs/api_op_CreateLaunchConfigurationTemplate.go +++ b/service/drs/api_op_CreateLaunchConfigurationTemplate.go @@ -109,6 +109,9 @@ func (c *Client) addOperationCreateLaunchConfigurationTemplateMiddlewares(stack if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreateLaunchConfigurationTemplate(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/service/drs/api_op_DeleteLaunchConfigurationTemplate.go b/service/drs/api_op_DeleteLaunchConfigurationTemplate.go index 99c31edee26..8988f6fece1 100644 --- a/service/drs/api_op_DeleteLaunchConfigurationTemplate.go +++ b/service/drs/api_op_DeleteLaunchConfigurationTemplate.go @@ -94,6 +94,9 @@ func (c *Client) addOperationDeleteLaunchConfigurationTemplateMiddlewares(stack if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteLaunchConfigurationTemplate(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/service/drs/api_op_DescribeLaunchConfigurationTemplates.go b/service/drs/api_op_DescribeLaunchConfigurationTemplates.go index 35579ffaa78..057f61088e4 100644 --- a/service/drs/api_op_DescribeLaunchConfigurationTemplates.go +++ b/service/drs/api_op_DescribeLaunchConfigurationTemplates.go @@ -106,6 +106,9 @@ func (c *Client) addOperationDescribeLaunchConfigurationTemplatesMiddlewares(sta if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeLaunchConfigurationTemplates(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/service/drs/api_op_UpdateLaunchConfigurationTemplate.go b/service/drs/api_op_UpdateLaunchConfigurationTemplate.go index f619a2fb29d..7cc9053bb78 100644 --- a/service/drs/api_op_UpdateLaunchConfigurationTemplate.go +++ b/service/drs/api_op_UpdateLaunchConfigurationTemplate.go @@ -114,6 +114,9 @@ func (c *Client) addOperationUpdateLaunchConfigurationTemplateMiddlewares(stack if err = stack.Initialize.Add(newServiceMetadataMiddleware_opUpdateLaunchConfigurationTemplate(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/service/ram/api_op_CreatePermission.go b/service/ram/api_op_CreatePermission.go index 1dc9c2d424a..17fa83e41dc 100644 --- a/service/ram/api_op_CreatePermission.go +++ b/service/ram/api_op_CreatePermission.go @@ -152,6 +152,9 @@ func (c *Client) addOperationCreatePermissionMiddlewares(stack *middleware.Stack if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreatePermission(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/service/ram/api_op_CreatePermissionVersion.go b/service/ram/api_op_CreatePermissionVersion.go index b3bb60ff085..5afc0f1f1e5 100644 --- a/service/ram/api_op_CreatePermissionVersion.go +++ b/service/ram/api_op_CreatePermissionVersion.go @@ -144,6 +144,9 @@ func (c *Client) addOperationCreatePermissionVersionMiddlewares(stack *middlewar if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreatePermissionVersion(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/service/ram/api_op_DeletePermission.go b/service/ram/api_op_DeletePermission.go index 713cbca0e86..b4193ced517 100644 --- a/service/ram/api_op_DeletePermission.go +++ b/service/ram/api_op_DeletePermission.go @@ -123,6 +123,9 @@ func (c *Client) addOperationDeletePermissionMiddlewares(stack *middleware.Stack if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeletePermission(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/service/ram/api_op_DeletePermissionVersion.go b/service/ram/api_op_DeletePermissionVersion.go index ddcfeb2fd73..710de3a4237 100644 --- a/service/ram/api_op_DeletePermissionVersion.go +++ b/service/ram/api_op_DeletePermissionVersion.go @@ -136,6 +136,9 @@ func (c *Client) addOperationDeletePermissionVersionMiddlewares(stack *middlewar if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeletePermissionVersion(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/service/ram/api_op_ListPermissionAssociations.go b/service/ram/api_op_ListPermissionAssociations.go index 1a26621e8f6..bb2d1aefa94 100644 --- a/service/ram/api_op_ListPermissionAssociations.go +++ b/service/ram/api_op_ListPermissionAssociations.go @@ -146,6 +146,9 @@ func (c *Client) addOperationListPermissionAssociationsMiddlewares(stack *middle if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListPermissionAssociations(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/service/ram/api_op_ListReplacePermissionAssociationsWork.go b/service/ram/api_op_ListReplacePermissionAssociationsWork.go index 0c3a5a6046e..629b8ffd63f 100644 --- a/service/ram/api_op_ListReplacePermissionAssociationsWork.go +++ b/service/ram/api_op_ListReplacePermissionAssociationsWork.go @@ -126,6 +126,9 @@ func (c *Client) addOperationListReplacePermissionAssociationsWorkMiddlewares(st if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListReplacePermissionAssociationsWork(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/service/ram/api_op_PromotePermissionCreatedFromPolicy.go b/service/ram/api_op_PromotePermissionCreatedFromPolicy.go index 1bfa2b38481..6b2a7a6ba10 100644 --- a/service/ram/api_op_PromotePermissionCreatedFromPolicy.go +++ b/service/ram/api_op_PromotePermissionCreatedFromPolicy.go @@ -143,6 +143,9 @@ func (c *Client) addOperationPromotePermissionCreatedFromPolicyMiddlewares(stack if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPromotePermissionCreatedFromPolicy(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/service/ram/api_op_ReplacePermissionAssociations.go b/service/ram/api_op_ReplacePermissionAssociations.go index fe45e205fc2..86227f37bdc 100644 --- a/service/ram/api_op_ReplacePermissionAssociations.go +++ b/service/ram/api_op_ReplacePermissionAssociations.go @@ -142,6 +142,9 @@ func (c *Client) addOperationReplacePermissionAssociationsMiddlewares(stack *mid if err = stack.Initialize.Add(newServiceMetadataMiddleware_opReplacePermissionAssociations(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/service/ram/api_op_SetDefaultPermissionVersion.go b/service/ram/api_op_SetDefaultPermissionVersion.go index 02550c371c2..8ba1705964a 100644 --- a/service/ram/api_op_SetDefaultPermissionVersion.go +++ b/service/ram/api_op_SetDefaultPermissionVersion.go @@ -126,6 +126,9 @@ func (c *Client) addOperationSetDefaultPermissionVersionMiddlewares(stack *middl if err = stack.Initialize.Add(newServiceMetadataMiddleware_opSetDefaultPermissionVersion(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/service/wafv2/api_op_CreateAPIKey.go b/service/wafv2/api_op_CreateAPIKey.go index dfe9da1ac5d..1def32a775c 100644 --- a/service/wafv2/api_op_CreateAPIKey.go +++ b/service/wafv2/api_op_CreateAPIKey.go @@ -122,6 +122,9 @@ func (c *Client) addOperationCreateAPIKeyMiddlewares(stack *middleware.Stack, op if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreateAPIKey(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/service/wafv2/api_op_GetDecryptedAPIKey.go b/service/wafv2/api_op_GetDecryptedAPIKey.go index 09291a0d58a..8338e92213a 100644 --- a/service/wafv2/api_op_GetDecryptedAPIKey.go +++ b/service/wafv2/api_op_GetDecryptedAPIKey.go @@ -116,6 +116,9 @@ func (c *Client) addOperationGetDecryptedAPIKeyMiddlewares(stack *middleware.Sta if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetDecryptedAPIKey(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/service/wafv2/api_op_ListAPIKeys.go b/service/wafv2/api_op_ListAPIKeys.go index d4ba5cd5941..3bab35a63c0 100644 --- a/service/wafv2/api_op_ListAPIKeys.go +++ b/service/wafv2/api_op_ListAPIKeys.go @@ -130,6 +130,9 @@ func (c *Client) addOperationListAPIKeysMiddlewares(stack *middleware.Stack, opt if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListAPIKeys(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err }