Unverified Commit 2c27834f authored by Russell Cohen's avatar Russell Cohen Committed by GitHub
Browse files

Make required context parameters required (#2964)

## Motivation and Context
<!--- Why is this change required? What problem does it solve? -->
<!--- If it fixes an open issue, please link to the issue here -->
When a `@contextParam` is marked as required, we will enforce it on
inputs. Since these fields may influence endpoint, omitting them can
result in a different target being hit.

- #1668 
- aws-sdk-rust#873

## Description
<!--- Describe your changes in detail -->

## Testing
- [x] S3 Integration test

## Checklist
<!--- If a checkbox below is not applicable, then please DELETE it
rather than leaving it unchecked -->
- [x] I have updated `CHANGELOG.next.toml` if I made changes to the
smithy-rs codegen or runtime crates
- [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS
SDK, generated SDK code, or SDK runtime crates

----

_By submitting this pull request, I confirm that you can use, modify,
copy, and redistribute this contribution, under the terms of your
choice._
parent c98d5feb
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -90,3 +90,15 @@ message = "Fix code generation for union members with the `@httpPayload` trait."
references = ["smithy-rs#2969", "smithy-rs#1896"]
meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "all" }
author = "jdisanti"

[[aws-sdk-rust]]
message = "Make `bucket` required for request construction for S3. When `bucket` is not set, a **different** operation than intended can be triggered."
references = ["smithy-rs#1668", "aws-sdk-rust#873", "smithy-rs#2964"]
meta = { "breaking" = false, "tada" = false, "bug" = true }
author = "rcoh"

[[smithy-rs]]
message = "Required members with @contextParam are now treated as client-side required."
references = ["smithy-rs#2964"]
meta = { "breaking" = false, "tada" = false, "bug" = false, target = "client" }
author = "rcoh"
+28 −0
Original line number Diff line number Diff line
/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: Apache-2.0
 */

use aws_config::SdkConfig;
use aws_credential_types::provider::SharedCredentialsProvider;
use aws_sdk_s3::config::{Credentials, Region};
use aws_sdk_s3::Client;
use aws_smithy_client::test_connection::capture_request;

#[tokio::test]
async fn dont_dispatch_when_bucket_is_unset() {
    let (conn, rcvr) = capture_request(None);
    let sdk_config = SdkConfig::builder()
        .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))
        .region(Region::new("us-east-1"))
        .http_connector(conn.clone())
        .build();
    let client = Client::new(&sdk_config);
    let err = client
        .list_objects_v2()
        .send()
        .await
        .expect_err("bucket not set");
    assert_eq!(format!("{}", err), "failed to construct request");
    rcvr.expect_no_request();
}
+4 −0
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ async fn get_request_id_from_modeled_error() {
    let err = client
        .get_object()
        .key("dontcare")
        .bucket("dontcare")
        .send()
        .await
        .expect_err("status was 404, this is an error")
@@ -83,6 +84,7 @@ async fn get_request_id_from_unmodeled_error() {
    let client = Client::from_conf(config);
    let err = client
        .get_object()
        .bucket("dontcare")
        .key("dontcare")
        .send()
        .await
@@ -156,6 +158,7 @@ async fn get_request_id_from_successful_streaming_response() {
    let output = client
        .get_object()
        .key("dontcare")
        .bucket("dontcare")
        .send()
        .await
        .expect("valid successful response");
@@ -194,6 +197,7 @@ async fn conversion_to_service_error_maintains_request_id() {
    let client = Client::from_conf(config);
    let err = client
        .get_object()
        .bucket("dontcare")
        .key("dontcare")
        .send()
        .await
+1 −1
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@ plugins { }

allprojects {
    repositories {
        mavenLocal()
        /* mavenLocal() */
        mavenCentral()
        google()
    }
+5 −2
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate
import software.amazon.smithy.rust.codegen.core.rustlang.writable
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope
import software.amazon.smithy.rust.codegen.core.smithy.generators.enforceRequired
import software.amazon.smithy.rust.codegen.core.util.PANIC
import software.amazon.smithy.rust.codegen.core.util.dq
import software.amazon.smithy.rust.codegen.core.util.inputShape
@@ -134,8 +135,10 @@ class EndpointParamsInterceptorGenerator(
        // lastly, allow these to be overridden by members
        memberParams.forEach { (memberShape, param) ->
            val memberName = codegenContext.symbolProvider.toMemberName(memberShape)
            rust(
                ".${EndpointParamsGenerator.setterName(param.name)}(_input.$memberName.clone())",
            val member = memberShape.enforceRequired(writable("_input.$memberName.clone()"), codegenContext)

            rustTemplate(
                ".${EndpointParamsGenerator.setterName(param.name)}(#{member})", "member" to member,
            )
        }
    }
Loading