From 2fffa5ac8bce9f53fbe9e159f7f66c911a1466b1 Mon Sep 17 00:00:00 2001 From: Jaykumar Gosar Date: Mon, 15 May 2023 22:37:47 -0700 Subject: [PATCH 01/18] Fix generics related warning in Signer interfaces --- .../amazon/awssdk/http/auth/spi/HttpSignRequest.java | 10 +++++----- .../awssdk/http/auth/spi/SignedHttpRequest.java | 8 ++++---- .../auth/spi/internal/DefaultHttpSignRequest.java | 12 ++++++------ .../auth/spi/internal/DefaultSignedHttpRequest.java | 10 +++++----- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java index c67b0c4a5bf7..dcb75f3a5761 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java @@ -37,7 +37,7 @@ public interface HttpSignRequest { * Get a new builder for creating a {@link HttpSignRequest}. */ static Builder builder(Class payloadType) { - return new DefaultHttpSignRequest.BuilderImpl(payloadType); + return new DefaultHttpSignRequest.BuilderImpl<>(payloadType); } /** @@ -63,21 +63,21 @@ static Builder builder(Class payloadType) { /** * A builder for a {@link HttpSignRequest}. */ - interface Builder extends SdkBuilder, HttpSignRequest> { + interface Builder extends SdkBuilder, HttpSignRequest> { /** * Set the HTTP request object, without the request body payload. */ - Builder request(SdkHttpRequest request); + Builder request(SdkHttpRequest request); /** * Set the body payload of the request. A payload is optional. By default, the payload will be empty. */ - Builder payload(PayloadT payload); + Builder payload(PayloadT payload); /** * Set a property that the {@link HttpSigner} can use during signing. */ - Builder putProperty(SignerProperty key, T value); + Builder putProperty(SignerProperty key, T value); } } diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SignedHttpRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SignedHttpRequest.java index 380fdff00f46..416abe0c2757 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SignedHttpRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SignedHttpRequest.java @@ -37,7 +37,7 @@ public interface SignedHttpRequest { * Get a new builder for creating a {@link SignedHttpRequest}. */ static Builder builder(Class payloadType) { - return new DefaultSignedHttpRequest.BuilderImpl(payloadType); + return new DefaultSignedHttpRequest.BuilderImpl<>(payloadType); } /** @@ -58,16 +58,16 @@ static Builder builder(Class payloadType) { /** * A builder for a {@link SignedHttpRequest}. */ - interface Builder extends SdkBuilder, SignedHttpRequest> { + interface Builder extends SdkBuilder, SignedHttpRequest> { /** * Set the HTTP request object, without the request body payload. */ - Builder request(SdkHttpRequest request); + Builder request(SdkHttpRequest request); /** * Set the body payload of the request. A payload is optional. By default, the payload will be empty. */ - Builder payload(PayloadT payload); + Builder payload(PayloadT payload); } } diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java index 544620400482..cc412c69e87d 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java @@ -51,7 +51,7 @@ public SdkHttpRequest request() { } @Override - public Optional payload() { + public Optional payload() { return payload == null ? Optional.empty() : Optional.of(payload); } @@ -81,26 +81,26 @@ public BuilderImpl(Class payloadType) { } @Override - public Builder request(SdkHttpRequest request) { + public Builder request(SdkHttpRequest request) { this.request = request; return this; } @Override - public Builder payload(PayloadT payload) { + public Builder payload(PayloadT payload) { this.payload = payload; return this; } @Override - public Builder putProperty(SignerProperty key, T value) { + public Builder putProperty(SignerProperty key, T value) { this.properties.put(key, value); return this; } @Override - public HttpSignRequest build() { - return new DefaultHttpSignRequest(this); + public HttpSignRequest build() { + return new DefaultHttpSignRequest<>(this); } } } diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSignedHttpRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSignedHttpRequest.java index 3e2b70ecd764..1b9c9230b534 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSignedHttpRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSignedHttpRequest.java @@ -46,7 +46,7 @@ public SdkHttpRequest request() { } @Override - public Optional payload() { + public Optional payload() { return payload == null ? Optional.empty() : Optional.of(payload); } @@ -68,20 +68,20 @@ public BuilderImpl(Class payloadType) { } @Override - public Builder request(SdkHttpRequest request) { + public Builder request(SdkHttpRequest request) { this.request = request; return this; } @Override - public Builder payload(PayloadT payload) { + public Builder payload(PayloadT payload) { this.payload = payload; return this; } @Override - public SignedHttpRequest build() { - return new DefaultSignedHttpRequest(this); + public SignedHttpRequest build() { + return new DefaultSignedHttpRequest<>(this); } } } From f1cf80f252bd92bbbd10ad690d3bcd618edb6c32 Mon Sep 17 00:00:00 2001 From: Jaykumar Gosar Date: Mon, 15 May 2023 22:43:26 -0700 Subject: [PATCH 02/18] Remove for HttpAuthOption.Builder.schemeId --- .../software/amazon/awssdk/http/auth/spi/HttpAuthOption.java | 2 +- .../awssdk/http/auth/spi/internal/DefaultHttpAuthOption.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpAuthOption.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpAuthOption.java index f7f3ddc29ba2..481421b6f5d9 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpAuthOption.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpAuthOption.java @@ -81,7 +81,7 @@ interface SignerPropertyConsumer { } interface Builder extends SdkBuilder { - Builder schemeId(String schemeId); + Builder schemeId(String schemeId); Builder putIdentityProperty(IdentityProperty key, T value); diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpAuthOption.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpAuthOption.java index 36acc96df21a..3d375f6a642c 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpAuthOption.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpAuthOption.java @@ -83,7 +83,7 @@ public static final class BuilderImpl implements Builder { private final Map, Object> signerProperties = new HashMap<>(); @Override - public Builder schemeId(String schemeId) { + public Builder schemeId(String schemeId) { this.schemeId = schemeId; return this; } From 0690ad8265a1c3aeebe4f5d661d4755ec469ab13 Mon Sep 17 00:00:00 2001 From: Jaykumar Gosar Date: Mon, 15 May 2023 22:49:40 -0700 Subject: [PATCH 03/18] Remove wildcards from sign methods --- .../java/software/amazon/awssdk/http/auth/spi/HttpSigner.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java index 60596518403f..7101e37b8f2a 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java @@ -33,7 +33,7 @@ public interface HttpSigner { * @param request The request to sign, with sync payload * @return A signed version of the input request */ - SignedHttpRequest sign(HttpSignRequest request); + SignedHttpRequest sign(HttpSignRequest request); /** * Method that takes in a request and returns a signed version of the request. @@ -41,5 +41,5 @@ public interface HttpSigner { * @param request The request to sign, with async payload * @return A signed version of the input request */ - SignedHttpRequest> signAsync(HttpSignRequest> request); + SignedHttpRequest> signAsync(HttpSignRequest> request); } From daaf834a9bab3370e4bea95fccf4c0a11af994e2 Mon Sep 17 00:00:00 2001 From: Jaykumar Gosar Date: Mon, 15 May 2023 23:44:41 -0700 Subject: [PATCH 04/18] Make Identity explicit in HttpSignRequest --- .../awssdk/http/auth/spi/HttpAuthScheme.java | 2 +- .../awssdk/http/auth/spi/HttpSignRequest.java | 28 +++++++++++++------ .../awssdk/http/auth/spi/HttpSigner.java | 20 ++++++------- .../http/auth/spi/SignedHttpRequest.java | 2 +- .../awssdk/http/auth/spi/SignerProperty.java | 2 +- .../spi/internal/DefaultHttpSignRequest.java | 28 ++++++++++++++----- 6 files changed, 53 insertions(+), 29 deletions(-) diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpAuthScheme.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpAuthScheme.java index 69b5d863bfdc..155a7c605e11 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpAuthScheme.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpAuthScheme.java @@ -58,5 +58,5 @@ public interface HttpAuthScheme { * Retrieve the signer associated with this authentication scheme. This signer is guaranteed to support the identity * generated by the identity provider in this authentication scheme. */ - HttpSigner signer(); + HttpSigner signer(); } diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java index dcb75f3a5761..52719c91fb0d 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java @@ -24,19 +24,21 @@ import software.amazon.awssdk.utils.builder.SdkBuilder; /** - * Represents a request to be signed by {@link HttpSigner}. + * Input parameters to sign a request using {@link HttpSigner}. * - * @param The type of payload of this request. + * @param The type of payload of the request. */ @SdkPublicApi @Immutable @ThreadSafe -public interface HttpSignRequest { +// TODO: should be IdentityT extends Identity +public interface HttpSignRequest { /** * Get a new builder for creating a {@link HttpSignRequest}. */ - static Builder builder(Class payloadType) { + // TODO: Should it take Class identityType too? + static Builder builder(Class payloadType) { return new DefaultHttpSignRequest.BuilderImpl<>(payloadType); } @@ -55,29 +57,37 @@ static Builder builder(Class payloadType) { */ Optional payload(); + IdentityT identity(); + /** - * Returns the property that the {@link HttpSigner} can use during signing. + * Returns the value of a property that the {@link HttpSigner} can use during signing. */ T property(SignerProperty property); /** * A builder for a {@link HttpSignRequest}. */ - interface Builder extends SdkBuilder, HttpSignRequest> { + interface Builder extends SdkBuilder, HttpSignRequest> { /** * Set the HTTP request object, without the request body payload. */ - Builder request(SdkHttpRequest request); + Builder request(SdkHttpRequest request); + + /** + * Set the body payload of the request. A payload is optional. By default, the payload will be empty. + */ + Builder payload(PayloadT payload); /** * Set the body payload of the request. A payload is optional. By default, the payload will be empty. */ - Builder payload(PayloadT payload); + Builder identity(IdentityT identity); /** * Set a property that the {@link HttpSigner} can use during signing. */ - Builder putProperty(SignerProperty key, T value); + Builder putProperty(SignerProperty key, T value); } } diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java index 7101e37b8f2a..d96f77e57e83 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java @@ -22,24 +22,24 @@ /** * Interface for the process of modifying a request destined for a service so that the service can authenticate the SDK - * customer’s identity + * customer’s identity. */ @SdkPublicApi -public interface HttpSigner { +public interface HttpSigner { /** - * Method that takes in a request and returns a signed version of the request. + * Method that takes in inputs to sign a request and returns a signed version of the request. * - * @param request The request to sign, with sync payload - * @return A signed version of the input request + * @param request The inputs to sign a request, with sync payload. + * @return A signed version of the request. */ - SignedHttpRequest sign(HttpSignRequest request); + SignedHttpRequest sign(HttpSignRequest request); /** - * Method that takes in a request and returns a signed version of the request. + * Method that takes in inputs to sign a request and returns a signed version of the request. * - * @param request The request to sign, with async payload - * @return A signed version of the input request + * @param request The inputs to sign a request, with async payload. + * @return A signed version of the request. */ - SignedHttpRequest> signAsync(HttpSignRequest> request); + SignedHttpRequest> signAsync(HttpSignRequest, IdentityT> request); } diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SignedHttpRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SignedHttpRequest.java index 416abe0c2757..e9153b671fcf 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SignedHttpRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SignedHttpRequest.java @@ -26,7 +26,7 @@ /** * Represents a request that has been signed by {@link HttpSigner}. * - * @param The type of payload of this request. + * @param The type of payload of the request. */ @SdkPublicApi @Immutable diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SignerProperty.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SignerProperty.java index 7a424a71bdb8..299421a829e1 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SignerProperty.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SignerProperty.java @@ -24,7 +24,7 @@ /** * A strongly-typed property for input to an {@link HttpSigner}. - * @param The type of the attribute. + * @param The type of the property. */ @SdkPublicApi @Immutable diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java index cc412c69e87d..326049f9eea0 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java @@ -26,17 +26,19 @@ import software.amazon.awssdk.utils.Validate; @SdkInternalApi -public final class DefaultHttpSignRequest implements HttpSignRequest { +public final class DefaultHttpSignRequest implements HttpSignRequest { private final Class payloadType; private final SdkHttpRequest request; private final PayloadT payload; + private final IdentityT identity; private final Map, Object> properties; - DefaultHttpSignRequest(BuilderImpl builder) { + DefaultHttpSignRequest(BuilderImpl builder) { this.payloadType = Validate.paramNotNull(builder.payloadType, "payloadType"); this.request = Validate.paramNotNull(builder.request, "request"); this.payload = builder.payload; + this.identity = Validate.paramNotNull(builder.identity, "identity"); this.properties = new HashMap<>(builder.properties); } @@ -55,6 +57,11 @@ public Optional payload() { return payload == null ? Optional.empty() : Optional.of(payload); } + @Override + public IdentityT identity() { + return identity; + } + @Override public T property(SignerProperty property) { return (T) properties.get(property); @@ -70,10 +77,11 @@ public String toString() { } - public static final class BuilderImpl implements Builder { + public static final class BuilderImpl implements Builder { private final Class payloadType; private SdkHttpRequest request; private PayloadT payload; + private IdentityT identity; private final Map, Object> properties = new HashMap<>(); public BuilderImpl(Class payloadType) { @@ -81,25 +89,31 @@ public BuilderImpl(Class payloadType) { } @Override - public Builder request(SdkHttpRequest request) { + public Builder request(SdkHttpRequest request) { this.request = request; return this; } @Override - public Builder payload(PayloadT payload) { + public Builder payload(PayloadT payload) { this.payload = payload; return this; } @Override - public Builder putProperty(SignerProperty key, T value) { + public Builder identity(IdentityT identity) { + this.identity = identity; + return this; + } + + @Override + public Builder putProperty(SignerProperty key, T value) { this.properties.put(key, value); return this; } @Override - public HttpSignRequest build() { + public HttpSignRequest build() { return new DefaultHttpSignRequest<>(this); } } From d9c7ac93144e115b52e16d3890db41f8d4edad0e Mon Sep 17 00:00:00 2001 From: Jaykumar Gosar Date: Tue, 16 May 2023 12:28:43 -0700 Subject: [PATCH 05/18] Make IdentityT type extend Identity in HttpSigner --- .../java/software/amazon/awssdk/http/auth/spi/HttpSigner.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java index d96f77e57e83..1b05e3ed2f2b 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java @@ -19,13 +19,14 @@ import org.reactivestreams.Publisher; import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.http.ContentStreamProvider; +import software.amazon.awssdk.identity.spi.Identity; /** * Interface for the process of modifying a request destined for a service so that the service can authenticate the SDK * customer’s identity. */ @SdkPublicApi -public interface HttpSigner { +public interface HttpSigner { /** * Method that takes in inputs to sign a request and returns a signed version of the request. From b5c989ff0f1cbd6890eb00f88e38d8b08aa95a49 Mon Sep 17 00:00:00 2001 From: Jaykumar Gosar Date: Wed, 17 May 2023 12:40:00 -0700 Subject: [PATCH 06/18] Add consumer builder pattern to HttpSigner methods They have default implementation that rely on new DefaultHttpSignRequest.BuilderImpl constructor that relies on the generic IdentityT without knowing the Class of that type. This class is @SdkInternalApi so this constructor is considered private. Also, make HttpSignRequest.builder take Class as parameter. Also, make IdentityT type extends Identity in HttpSignRequest. --- .../awssdk/http/auth/spi/HttpSignRequest.java | 13 +++--- .../awssdk/http/auth/spi/HttpSigner.java | 42 +++++++++++++++++-- .../spi/internal/DefaultHttpSignRequest.java | 5 ++- 3 files changed, 48 insertions(+), 12 deletions(-) diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java index 52719c91fb0d..a94848287d38 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java @@ -21,24 +21,25 @@ import software.amazon.awssdk.annotations.ThreadSafe; import software.amazon.awssdk.http.SdkHttpRequest; import software.amazon.awssdk.http.auth.spi.internal.DefaultHttpSignRequest; +import software.amazon.awssdk.identity.spi.Identity; import software.amazon.awssdk.utils.builder.SdkBuilder; /** * Input parameters to sign a request using {@link HttpSigner}. * * @param The type of payload of the request. + * @param The type of the identity. */ @SdkPublicApi @Immutable @ThreadSafe -// TODO: should be IdentityT extends Identity -public interface HttpSignRequest { +public interface HttpSignRequest { /** * Get a new builder for creating a {@link HttpSignRequest}. */ - // TODO: Should it take Class identityType too? - static Builder builder(Class payloadType) { + static Builder builder(Class payloadType, + Class identityType) { return new DefaultHttpSignRequest.BuilderImpl<>(payloadType); } @@ -67,8 +68,8 @@ static Builder builder(Class extends SdkBuilder, HttpSignRequest> { + interface Builder + extends SdkBuilder, HttpSignRequest> { /** * Set the HTTP request object, without the request body payload. diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java index 1b05e3ed2f2b..43c49893f962 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java @@ -16,31 +16,65 @@ package software.amazon.awssdk.http.auth.spi; import java.nio.ByteBuffer; +import java.util.function.Consumer; import org.reactivestreams.Publisher; import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.http.ContentStreamProvider; +import software.amazon.awssdk.http.auth.spi.internal.DefaultHttpSignRequest; import software.amazon.awssdk.identity.spi.Identity; /** * Interface for the process of modifying a request destined for a service so that the service can authenticate the SDK * customer’s identity. + * + * @param The type of the identity. */ @SdkPublicApi public interface HttpSigner { /** - * Method that takes in inputs to sign a request and returns a signed version of the request. + * Method that takes in inputs to sign a request with sync payload and returns a signed version of the request. * - * @param request The inputs to sign a request, with sync payload. + * @param request The inputs to sign a request. * @return A signed version of the request. */ SignedHttpRequest sign(HttpSignRequest request); /** - * Method that takes in inputs to sign a request and returns a signed version of the request. + * Method that takes in inputs to sign a request with sync payload and returns a signed version of the request. + *

+ * Similar to {@link #sign(HttpSignRequest)}, but takes a lambda to configure a new {@link HttpSignRequest.Builder}. This + * removes the need to call {@link HttpSignRequest#builder(Class, Class)}} and {@link HttpSignRequest.Builder#build()}. + * + * @param consumer A {@link Consumer} to which an empty {@link HttpSignRequest.Builder} will be given. + * @return A signed version of the request. + */ + default SignedHttpRequest sign( + Consumer> consumer) { + return sign(new DefaultHttpSignRequest.BuilderImpl(ContentStreamProvider.class) + .applyMutation(consumer).build()); + } + + /** + * Method that takes in inputs to sign a request with async payload and returns a signed version of the request. * - * @param request The inputs to sign a request, with async payload. + * @param request The inputs to sign a request. * @return A signed version of the request. */ SignedHttpRequest> signAsync(HttpSignRequest, IdentityT> request); + + /** + * Method that takes in inputs to sign a request with async payload and returns a signed version of the request. + *

+ * Similar to {@link #signAsync(HttpSignRequest)}, but takes a lambda to configure a new {@link HttpSignRequest.Builder}. This + * removes the need to call {@link HttpSignRequest#builder(Class, Class)}} and {@link HttpSignRequest.Builder#build()}. + * + * @param consumer A {@link Consumer} to which an empty {@link HttpSignRequest.Builder} will be given. + * @return A signed version of the request. + */ + default SignedHttpRequest> signAsync( + Consumer, IdentityT>> consumer) { + return signAsync(new DefaultHttpSignRequest.BuilderImpl, IdentityT>((Class)Publisher.class) + .applyMutation(consumer).build()); + } } diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java index 326049f9eea0..5f1a17a23c12 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java @@ -22,11 +22,12 @@ import software.amazon.awssdk.http.SdkHttpRequest; import software.amazon.awssdk.http.auth.spi.HttpSignRequest; import software.amazon.awssdk.http.auth.spi.SignerProperty; +import software.amazon.awssdk.identity.spi.Identity; import software.amazon.awssdk.utils.ToString; import software.amazon.awssdk.utils.Validate; @SdkInternalApi -public final class DefaultHttpSignRequest implements HttpSignRequest { +public final class DefaultHttpSignRequest implements HttpSignRequest { private final Class payloadType; private final SdkHttpRequest request; @@ -77,7 +78,7 @@ public String toString() { } - public static final class BuilderImpl implements Builder { + public static final class BuilderImpl implements Builder { private final Class payloadType; private SdkHttpRequest request; private PayloadT payload; From 33a9b04a7dff61d912ccd55584fe71414123ccec Mon Sep 17 00:00:00 2001 From: Jaykumar Gosar Date: Wed, 17 May 2023 13:19:17 -0700 Subject: [PATCH 07/18] Add test to show HttpSigner usage --- core/http-auth-spi/pom.xml | 5 + .../awssdk/http/auth/spi/HttpSignerTest.java | 113 ++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 core/http-auth-spi/src/test/java/software/amazon/awssdk/http/auth/spi/HttpSignerTest.java diff --git a/core/http-auth-spi/pom.xml b/core/http-auth-spi/pom.xml index c366580aa013..1cc8f8771d11 100644 --- a/core/http-auth-spi/pom.xml +++ b/core/http-auth-spi/pom.xml @@ -70,6 +70,11 @@ equalsverifier test + + org.mockito + mockito-core + test + diff --git a/core/http-auth-spi/src/test/java/software/amazon/awssdk/http/auth/spi/HttpSignerTest.java b/core/http-auth-spi/src/test/java/software/amazon/awssdk/http/auth/spi/HttpSignerTest.java new file mode 100644 index 000000000000..4a04246ed6b3 --- /dev/null +++ b/core/http-auth-spi/src/test/java/software/amazon/awssdk/http/auth/spi/HttpSignerTest.java @@ -0,0 +1,113 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.http.auth.spi; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Mockito.mock; + +import java.nio.ByteBuffer; +import org.junit.jupiter.api.Test; +import org.reactivestreams.Publisher; +import software.amazon.awssdk.http.ContentStreamProvider; +import software.amazon.awssdk.http.SdkHttpRequest; +import software.amazon.awssdk.identity.spi.TokenIdentity; + +public class HttpSignerTest { + + private static final SignerProperty KEY = SignerProperty.create(String.class, "key"); + private static final String VALUE = "value"; + private TokenIdentity IDENTITY = TokenIdentity.create("token"); + + final HttpSigner signer = new TestSigner(); + + @Test + public void sign_usingConsumerBuilder_works() { + SignedHttpRequest signedRequest = signer.sign(r -> r.request(mock(SdkHttpRequest.class)) + .identity(IDENTITY) + .putProperty(KEY, VALUE)); + assertNotNull(signedRequest); + } + + @Test + public void sign_usingRequest_works() { + SignedHttpRequest signedRequest = + signer.sign(HttpSignRequest.builder(ContentStreamProvider.class, TokenIdentity.class) + .request(mock(SdkHttpRequest.class)) + .identity(IDENTITY) + .putProperty(KEY, VALUE) + .build()); + assertNotNull(signedRequest); + } + + @Test + public void signAsync_usingConsumerBuilder_works() { + Publisher payload = subscriber -> {}; + SignedHttpRequest> signedRequest = signer.signAsync(r -> r.request(mock(SdkHttpRequest.class)) + .payload(payload) + .identity(IDENTITY) + .putProperty(KEY, VALUE)); + assertNotNull(signedRequest); + } + + // @Test + public void signAsync_usingRequest_works() { + Publisher payload = subscriber -> {}; + // Don't know how to make this work.... + // HttpSignRequest.Builder, TokenIdentity> builder = + // HttpSignRequest.builder(Publisher.class, TokenIdentity.class); + HttpSignRequest.Builder, TokenIdentity> builder = null; + assertNotNull(signer.signAsync(builder.request(mock(SdkHttpRequest.class)) + .payload(payload) + .identity(IDENTITY) + .putProperty(KEY, VALUE) + .build())); + } + + /** + * NoOp Signer that asserts that the HttpSignRequest created via builder or Consumer builder pattern are set up correctly, + * e.g., have the correct payloadType, and makes sure that payloadType works with SignedHttpRequest without runtime + * exceptions. + */ + private class TestSigner implements HttpSigner { + @Override + public SignedHttpRequest sign(HttpSignRequest request) { + Class clazz = request.payloadType(); + assertEquals(ContentStreamProvider.class, clazz); + + assertEquals(VALUE, request.property(KEY)); + assertEquals(IDENTITY, request.identity()); + + return doSign(request); + } + + @Override + public SignedHttpRequest> signAsync(HttpSignRequest, TokenIdentity> request) { + Class> clazz = request.payloadType(); + assertEquals(Publisher.class, clazz); + + assertEquals(VALUE, request.property(KEY)); + assertEquals(IDENTITY, request.identity()); + + return doSign(request); + } + + // no-op + private SignedHttpRequest doSign(HttpSignRequest request) { + return SignedHttpRequest.builder(request.payloadType()).request(request.request()).build(); + } + } +} From fc79989b60d85d11b775bf8d63ad47a9aadb6d53 Mon Sep 17 00:00:00 2001 From: Jaykumar Gosar Date: Wed, 17 May 2023 13:39:30 -0700 Subject: [PATCH 08/18] Note identityType parameter is ignored in HttpSignRequest.builder --- .../software/amazon/awssdk/http/auth/spi/HttpSignRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java index a94848287d38..96b069951dd2 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java @@ -39,7 +39,7 @@ public interface HttpSignRequest { * Get a new builder for creating a {@link HttpSignRequest}. */ static Builder builder(Class payloadType, - Class identityType) { + Class ignoredIdentityType) { return new DefaultHttpSignRequest.BuilderImpl<>(payloadType); } From e1cc7bc62d372700150826e2ce4bc0ac34b3c556 Mon Sep 17 00:00:00 2001 From: Jaykumar Gosar Date: Wed, 17 May 2023 16:51:13 -0700 Subject: [PATCH 09/18] Use separate interfaces for sync and async sign requests This fixes HttpSignerTest.signAsync_usingRequest_works test. --- .../http/auth/spi/AsyncHttpSignRequest.java | 59 ++++++++++ .../awssdk/http/auth/spi/HttpSignRequest.java | 16 +-- .../awssdk/http/auth/spi/HttpSigner.java | 30 +++-- .../http/auth/spi/SyncHttpSignRequest.java | 57 +++++++++ .../internal/DefaultAsyncHttpSignRequest.java | 110 ++++++++++++++++++ .../spi/internal/DefaultHttpSignRequest.java | 5 - .../internal/DefaultSyncHttpSignRequest.java | 109 +++++++++++++++++ .../awssdk/http/auth/spi/HttpSignerTest.java | 38 +++--- 8 files changed, 373 insertions(+), 51 deletions(-) create mode 100644 core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncHttpSignRequest.java create mode 100644 core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncHttpSignRequest.java create mode 100644 core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncHttpSignRequest.java create mode 100644 core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncHttpSignRequest.java diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncHttpSignRequest.java new file mode 100644 index 000000000000..eba2ac7c6da6 --- /dev/null +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncHttpSignRequest.java @@ -0,0 +1,59 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.http.auth.spi; + +import java.nio.ByteBuffer; +import org.reactivestreams.Publisher; +import software.amazon.awssdk.annotations.Immutable; +import software.amazon.awssdk.annotations.SdkPublicApi; +import software.amazon.awssdk.annotations.ThreadSafe; +import software.amazon.awssdk.http.SdkHttpRequest; +import software.amazon.awssdk.http.auth.spi.internal.DefaultAsyncHttpSignRequest; +import software.amazon.awssdk.identity.spi.Identity; +import software.amazon.awssdk.utils.builder.SdkBuilder; + +@SdkPublicApi +@Immutable +@ThreadSafe +public interface AsyncHttpSignRequest extends HttpSignRequest, IdentityT> { + /** + * Get a new builder for creating a {@link AsyncHttpSignRequest}. + */ + static Builder builder(Class ignoredIdentityType) { + return new DefaultAsyncHttpSignRequest.BuilderImpl<>(); + } + + @Override + default Class> payloadType() { + // TODO: Code Review Note: Note this cast + return (Class) Publisher.class; + } + + interface Builder extends HttpSignRequest.Builder, IdentityT>, + SdkBuilder, AsyncHttpSignRequest> { + @Override + Builder request(SdkHttpRequest request); + + @Override + Builder payload(Publisher payload); + + @Override + Builder identity(IdentityT identity); + + @Override + Builder putProperty(SignerProperty key, T value); + } +} diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java index 96b069951dd2..7eaf7f80d2a5 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java @@ -20,9 +20,7 @@ import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.annotations.ThreadSafe; import software.amazon.awssdk.http.SdkHttpRequest; -import software.amazon.awssdk.http.auth.spi.internal.DefaultHttpSignRequest; import software.amazon.awssdk.identity.spi.Identity; -import software.amazon.awssdk.utils.builder.SdkBuilder; /** * Input parameters to sign a request using {@link HttpSigner}. @@ -30,19 +28,14 @@ * @param The type of payload of the request. * @param The type of the identity. */ +// TODO: Code Reviewer Note: Seems like this could be package-private/SdkProtectedApi, since there are 2 sub-interfaces that +// HttpSigner uses, however for implementation of HttpSigner that don't care about Sync v/s Async, they can share their +// implementation by using this type with generic PayloadT. Should this be public but SdkProtectedApi? @SdkPublicApi @Immutable @ThreadSafe public interface HttpSignRequest { - /** - * Get a new builder for creating a {@link HttpSignRequest}. - */ - static Builder builder(Class payloadType, - Class ignoredIdentityType) { - return new DefaultHttpSignRequest.BuilderImpl<>(payloadType); - } - /** * Returns the type of the payload. */ @@ -68,8 +61,7 @@ static Builder build /** * A builder for a {@link HttpSignRequest}. */ - interface Builder - extends SdkBuilder, HttpSignRequest> { + interface Builder { /** * Set the HTTP request object, without the request body payload. diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java index 43c49893f962..3b5fcb5f8478 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java @@ -20,7 +20,8 @@ import org.reactivestreams.Publisher; import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.http.ContentStreamProvider; -import software.amazon.awssdk.http.auth.spi.internal.DefaultHttpSignRequest; +import software.amazon.awssdk.http.auth.spi.internal.DefaultAsyncHttpSignRequest; +import software.amazon.awssdk.http.auth.spi.internal.DefaultSyncHttpSignRequest; import software.amazon.awssdk.identity.spi.Identity; /** @@ -38,21 +39,19 @@ public interface HttpSigner { * @param request The inputs to sign a request. * @return A signed version of the request. */ - SignedHttpRequest sign(HttpSignRequest request); + SignedHttpRequest sign(SyncHttpSignRequest request); /** * Method that takes in inputs to sign a request with sync payload and returns a signed version of the request. *

- * Similar to {@link #sign(HttpSignRequest)}, but takes a lambda to configure a new {@link HttpSignRequest.Builder}. This - * removes the need to call {@link HttpSignRequest#builder(Class, Class)}} and {@link HttpSignRequest.Builder#build()}. + * Similar to {@link #sign(SyncHttpSignRequest)}, but takes a lambda to configure a new {@link HttpSignRequest.Builder}. This + * removes the need to call {@link SyncHttpSignRequest#builder(Class)}} and {@link SyncHttpSignRequest.Builder#build()}. * - * @param consumer A {@link Consumer} to which an empty {@link HttpSignRequest.Builder} will be given. + * @param consumer A {@link Consumer} to which an empty {@link SyncHttpSignRequest.Builder} will be given. * @return A signed version of the request. */ - default SignedHttpRequest sign( - Consumer> consumer) { - return sign(new DefaultHttpSignRequest.BuilderImpl(ContentStreamProvider.class) - .applyMutation(consumer).build()); + default SignedHttpRequest sign(Consumer> consumer) { + return sign(new DefaultSyncHttpSignRequest.BuilderImpl().applyMutation(consumer).build()); } /** @@ -61,20 +60,19 @@ default SignedHttpRequest sign( * @param request The inputs to sign a request. * @return A signed version of the request. */ - SignedHttpRequest> signAsync(HttpSignRequest, IdentityT> request); + SignedHttpRequest> signAsync(AsyncHttpSignRequest request); /** * Method that takes in inputs to sign a request with async payload and returns a signed version of the request. *

- * Similar to {@link #signAsync(HttpSignRequest)}, but takes a lambda to configure a new {@link HttpSignRequest.Builder}. This - * removes the need to call {@link HttpSignRequest#builder(Class, Class)}} and {@link HttpSignRequest.Builder#build()}. + * Similar to {@link #signAsync(AsyncHttpSignRequest)}, but takes a lambda to configure a new + * {@link AsyncHttpSignRequest.Builder}. This removes the need to call {@link AsyncHttpSignRequest#builder(Class)}} and + * {@link AsyncHttpSignRequest.Builder#build()}. * * @param consumer A {@link Consumer} to which an empty {@link HttpSignRequest.Builder} will be given. * @return A signed version of the request. */ - default SignedHttpRequest> signAsync( - Consumer, IdentityT>> consumer) { - return signAsync(new DefaultHttpSignRequest.BuilderImpl, IdentityT>((Class)Publisher.class) - .applyMutation(consumer).build()); + default SignedHttpRequest> signAsync(Consumer> consumer) { + return signAsync(new DefaultAsyncHttpSignRequest.BuilderImpl().applyMutation(consumer).build()); } } diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncHttpSignRequest.java new file mode 100644 index 000000000000..992debb1cfa6 --- /dev/null +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncHttpSignRequest.java @@ -0,0 +1,57 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.http.auth.spi; + +import software.amazon.awssdk.annotations.Immutable; +import software.amazon.awssdk.annotations.SdkPublicApi; +import software.amazon.awssdk.annotations.ThreadSafe; +import software.amazon.awssdk.http.ContentStreamProvider; +import software.amazon.awssdk.http.SdkHttpRequest; +import software.amazon.awssdk.http.auth.spi.internal.DefaultSyncHttpSignRequest; +import software.amazon.awssdk.identity.spi.Identity; +import software.amazon.awssdk.utils.builder.SdkBuilder; + +@SdkPublicApi +@Immutable +@ThreadSafe +public interface SyncHttpSignRequest extends HttpSignRequest { + /** + * Get a new builder for creating a {@link SyncHttpSignRequest}. + */ + static Builder builder(Class ignoredIdentityType) { + return new DefaultSyncHttpSignRequest.BuilderImpl<>(); + } + + @Override + default Class payloadType() { + return ContentStreamProvider.class; + } + + interface Builder extends HttpSignRequest.Builder, + SdkBuilder, SyncHttpSignRequest> { + @Override + Builder request(SdkHttpRequest request); + + @Override + Builder payload(ContentStreamProvider payload); + + @Override + Builder identity(IdentityT identity); + + @Override + Builder putProperty(SignerProperty key, T value); + } +} diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncHttpSignRequest.java new file mode 100644 index 000000000000..63604d7bec8d --- /dev/null +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncHttpSignRequest.java @@ -0,0 +1,110 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.http.auth.spi.internal; + +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import org.reactivestreams.Publisher; +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.http.SdkHttpRequest; +import software.amazon.awssdk.http.auth.spi.AsyncHttpSignRequest; +import software.amazon.awssdk.http.auth.spi.SignerProperty; +import software.amazon.awssdk.identity.spi.Identity; +import software.amazon.awssdk.utils.ToString; +import software.amazon.awssdk.utils.Validate; + +@SdkInternalApi +public final class DefaultAsyncHttpSignRequest implements AsyncHttpSignRequest { + + private final SdkHttpRequest request; + private final Publisher payload; + private final IdentityT identity; + private final Map, Object> properties; + + DefaultAsyncHttpSignRequest(BuilderImpl builder) { + this.request = Validate.paramNotNull(builder.request, "request"); + this.payload = builder.payload; + this.identity = Validate.paramNotNull(builder.identity, "identity"); + this.properties = new HashMap<>(builder.properties); + } + + @Override + public SdkHttpRequest request() { + return request; + } + + @Override + public Optional> payload() { + return payload == null ? Optional.empty() : Optional.of(payload); + } + + @Override + public IdentityT identity() { + return identity; + } + + @Override + public T property(SignerProperty property) { + return (T) properties.get(property); + } + + @Override + public String toString() { + return ToString.builder("AsyncHttpSignRequest") + .add("request", request) + .add("properties", properties) + .build(); + } + + @SdkInternalApi + public static final class BuilderImpl implements Builder { + private SdkHttpRequest request; + private Publisher payload; + private IdentityT identity; + private final Map, Object> properties = new HashMap<>(); + + @Override + public Builder request(SdkHttpRequest request) { + this.request = request; + return this; + } + + @Override + public Builder payload(Publisher payload) { + this.payload = payload; + return this; + } + + @Override + public Builder identity(IdentityT identity) { + this.identity = identity; + return this; + } + + @Override + public Builder putProperty(SignerProperty key, T value) { + this.properties.put(key, value); + return this; + } + + @Override + public AsyncHttpSignRequest build() { + return new DefaultAsyncHttpSignRequest<>(this); + } + } +} diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java index 5f1a17a23c12..be9847227231 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java @@ -112,10 +112,5 @@ public Builder putProperty(SignerProperty key, T val this.properties.put(key, value); return this; } - - @Override - public HttpSignRequest build() { - return new DefaultHttpSignRequest<>(this); - } } } diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncHttpSignRequest.java new file mode 100644 index 000000000000..dbbf159b53a9 --- /dev/null +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncHttpSignRequest.java @@ -0,0 +1,109 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.http.auth.spi.internal; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.http.ContentStreamProvider; +import software.amazon.awssdk.http.SdkHttpRequest; +import software.amazon.awssdk.http.auth.spi.SignerProperty; +import software.amazon.awssdk.http.auth.spi.SyncHttpSignRequest; +import software.amazon.awssdk.identity.spi.Identity; +import software.amazon.awssdk.utils.ToString; +import software.amazon.awssdk.utils.Validate; + +@SdkInternalApi +public final class DefaultSyncHttpSignRequest implements SyncHttpSignRequest { + + private final SdkHttpRequest request; + private final ContentStreamProvider payload; + private final IdentityT identity; + private final Map, Object> properties; + + DefaultSyncHttpSignRequest(BuilderImpl builder) { + this.request = Validate.paramNotNull(builder.request, "request"); + this.payload = builder.payload; + this.identity = Validate.paramNotNull(builder.identity, "identity"); + this.properties = new HashMap<>(builder.properties); + } + + @Override + public SdkHttpRequest request() { + return request; + } + + @Override + public Optional payload() { + return payload == null ? Optional.empty() : Optional.of(payload); + } + + @Override + public IdentityT identity() { + return identity; + } + + @Override + public T property(SignerProperty property) { + return (T) properties.get(property); + } + + @Override + public String toString() { + return ToString.builder("SyncHttpSignRequest") + .add("request", request) + .add("properties", properties) + .build(); + } + + @SdkInternalApi + public static final class BuilderImpl implements Builder { + private SdkHttpRequest request; + private ContentStreamProvider payload; + private IdentityT identity; + private final Map, Object> properties = new HashMap<>(); + + @Override + public Builder request(SdkHttpRequest request) { + this.request = request; + return this; + } + + @Override + public Builder payload(ContentStreamProvider payload) { + this.payload = payload; + return this; + } + + @Override + public Builder identity(IdentityT identity) { + this.identity = identity; + return this; + } + + @Override + public Builder putProperty(SignerProperty key, T value) { + this.properties.put(key, value); + return this; + } + + @Override + public SyncHttpSignRequest build() { + return new DefaultSyncHttpSignRequest<>(this); + } + } +} diff --git a/core/http-auth-spi/src/test/java/software/amazon/awssdk/http/auth/spi/HttpSignerTest.java b/core/http-auth-spi/src/test/java/software/amazon/awssdk/http/auth/spi/HttpSignerTest.java index 4a04246ed6b3..9091a4941436 100644 --- a/core/http-auth-spi/src/test/java/software/amazon/awssdk/http/auth/spi/HttpSignerTest.java +++ b/core/http-auth-spi/src/test/java/software/amazon/awssdk/http/auth/spi/HttpSignerTest.java @@ -45,11 +45,11 @@ public void sign_usingConsumerBuilder_works() { @Test public void sign_usingRequest_works() { SignedHttpRequest signedRequest = - signer.sign(HttpSignRequest.builder(ContentStreamProvider.class, TokenIdentity.class) - .request(mock(SdkHttpRequest.class)) - .identity(IDENTITY) - .putProperty(KEY, VALUE) - .build()); + signer.sign(SyncHttpSignRequest.builder(TokenIdentity.class) + .request(mock(SdkHttpRequest.class)) + .identity(IDENTITY) + .putProperty(KEY, VALUE) + .build()); assertNotNull(signedRequest); } @@ -63,18 +63,17 @@ public void signAsync_usingConsumerBuilder_works() { assertNotNull(signedRequest); } - // @Test + @Test public void signAsync_usingRequest_works() { Publisher payload = subscriber -> {}; - // Don't know how to make this work.... - // HttpSignRequest.Builder, TokenIdentity> builder = - // HttpSignRequest.builder(Publisher.class, TokenIdentity.class); - HttpSignRequest.Builder, TokenIdentity> builder = null; - assertNotNull(signer.signAsync(builder.request(mock(SdkHttpRequest.class)) - .payload(payload) - .identity(IDENTITY) - .putProperty(KEY, VALUE) - .build())); + SignedHttpRequest> signedRequest = + signer.signAsync(AsyncHttpSignRequest.builder(TokenIdentity.class) + .request(mock(SdkHttpRequest.class)) + .payload(payload) + .identity(IDENTITY) + .putProperty(KEY, VALUE) + .build()); + assertNotNull(signedRequest); } /** @@ -84,7 +83,7 @@ public void signAsync_usingRequest_works() { */ private class TestSigner implements HttpSigner { @Override - public SignedHttpRequest sign(HttpSignRequest request) { + public SignedHttpRequest sign(SyncHttpSignRequest request) { Class clazz = request.payloadType(); assertEquals(ContentStreamProvider.class, clazz); @@ -95,7 +94,7 @@ public SignedHttpRequest sign(HttpSignRequest> signAsync(HttpSignRequest, TokenIdentity> request) { + public SignedHttpRequest> signAsync(AsyncHttpSignRequest request) { Class> clazz = request.payloadType(); assertEquals(Publisher.class, clazz); @@ -107,7 +106,10 @@ public SignedHttpRequest> signAsync(HttpSignRequest SignedHttpRequest doSign(HttpSignRequest request) { - return SignedHttpRequest.builder(request.payloadType()).request(request.request()).build(); + return SignedHttpRequest.builder(request.payloadType()) + .request(request.request()) + .payload(request.payload().orElse(null)) + .build(); } } } From 74e085b084b54fe808723b7117c1dee33ddb5849 Mon Sep 17 00:00:00 2001 From: Jaykumar Gosar Date: Thu, 18 May 2023 01:02:55 -0700 Subject: [PATCH 10/18] Use abstract DefaultHttpSignRequest to avoid duplication --- .../awssdk/http/auth/spi/HttpSigner.java | 4 +- .../internal/DefaultAsyncHttpSignRequest.java | 73 ++----------------- .../spi/internal/DefaultHttpSignRequest.java | 59 ++++++--------- .../internal/DefaultSyncHttpSignRequest.java | 73 ++----------------- 4 files changed, 37 insertions(+), 172 deletions(-) diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java index 3b5fcb5f8478..2d15e4a65168 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java @@ -44,8 +44,8 @@ public interface HttpSigner { /** * Method that takes in inputs to sign a request with sync payload and returns a signed version of the request. *

- * Similar to {@link #sign(SyncHttpSignRequest)}, but takes a lambda to configure a new {@link HttpSignRequest.Builder}. This - * removes the need to call {@link SyncHttpSignRequest#builder(Class)}} and {@link SyncHttpSignRequest.Builder#build()}. + * Similar to {@link #sign(SyncHttpSignRequest)}, but takes a lambda to configure a new {@link SyncHttpSignRequest.Builder}. + * This removes the need to call {@link SyncHttpSignRequest#builder(Class)}} and {@link SyncHttpSignRequest.Builder#build()}. * * @param consumer A {@link Consumer} to which an empty {@link SyncHttpSignRequest.Builder} will be given. * @return A signed version of the request. diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncHttpSignRequest.java index 63604d7bec8d..a37573f59dd2 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncHttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncHttpSignRequest.java @@ -16,51 +16,18 @@ package software.amazon.awssdk.http.auth.spi.internal; import java.nio.ByteBuffer; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; import org.reactivestreams.Publisher; import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.http.SdkHttpRequest; import software.amazon.awssdk.http.auth.spi.AsyncHttpSignRequest; -import software.amazon.awssdk.http.auth.spi.SignerProperty; import software.amazon.awssdk.identity.spi.Identity; import software.amazon.awssdk.utils.ToString; -import software.amazon.awssdk.utils.Validate; @SdkInternalApi -public final class DefaultAsyncHttpSignRequest implements AsyncHttpSignRequest { +public final class DefaultAsyncHttpSignRequest + extends DefaultHttpSignRequest, IdentityT> implements AsyncHttpSignRequest { - private final SdkHttpRequest request; - private final Publisher payload; - private final IdentityT identity; - private final Map, Object> properties; - - DefaultAsyncHttpSignRequest(BuilderImpl builder) { - this.request = Validate.paramNotNull(builder.request, "request"); - this.payload = builder.payload; - this.identity = Validate.paramNotNull(builder.identity, "identity"); - this.properties = new HashMap<>(builder.properties); - } - - @Override - public SdkHttpRequest request() { - return request; - } - - @Override - public Optional> payload() { - return payload == null ? Optional.empty() : Optional.of(payload); - } - - @Override - public IdentityT identity() { - return identity; - } - - @Override - public T property(SignerProperty property) { - return (T) properties.get(property); + private DefaultAsyncHttpSignRequest(BuilderImpl builder) { + super(builder); } @Override @@ -72,35 +39,9 @@ public String toString() { } @SdkInternalApi - public static final class BuilderImpl implements Builder { - private SdkHttpRequest request; - private Publisher payload; - private IdentityT identity; - private final Map, Object> properties = new HashMap<>(); - - @Override - public Builder request(SdkHttpRequest request) { - this.request = request; - return this; - } - - @Override - public Builder payload(Publisher payload) { - this.payload = payload; - return this; - } - - @Override - public Builder identity(IdentityT identity) { - this.identity = identity; - return this; - } - - @Override - public Builder putProperty(SignerProperty key, T value) { - this.properties.put(key, value); - return this; - } + public static final class BuilderImpl + extends DefaultHttpSignRequest.BuilderImpl, Publisher, IdentityT> + implements AsyncHttpSignRequest.Builder { @Override public AsyncHttpSignRequest build() { diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java index be9847227231..9e87de3dc3c6 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java @@ -23,31 +23,23 @@ import software.amazon.awssdk.http.auth.spi.HttpSignRequest; import software.amazon.awssdk.http.auth.spi.SignerProperty; import software.amazon.awssdk.identity.spi.Identity; -import software.amazon.awssdk.utils.ToString; import software.amazon.awssdk.utils.Validate; @SdkInternalApi -public final class DefaultHttpSignRequest implements HttpSignRequest { +abstract class DefaultHttpSignRequest implements HttpSignRequest { - private final Class payloadType; - private final SdkHttpRequest request; - private final PayloadT payload; - private final IdentityT identity; - private final Map, Object> properties; + protected final SdkHttpRequest request; + protected final PayloadT payload; + protected final IdentityT identity; + protected final Map, Object> properties; - DefaultHttpSignRequest(BuilderImpl builder) { - this.payloadType = Validate.paramNotNull(builder.payloadType, "payloadType"); + protected DefaultHttpSignRequest(BuilderImpl builder) { this.request = Validate.paramNotNull(builder.request, "request"); this.payload = builder.payload; this.identity = Validate.paramNotNull(builder.identity, "identity"); this.properties = new HashMap<>(builder.properties); } - @Override - public Class payloadType() { - return payloadType; - } - @Override public SdkHttpRequest request() { return request; @@ -68,49 +60,40 @@ public T property(SignerProperty property) { return (T) properties.get(property); } - @Override - public String toString() { - return ToString.builder("HttpSignRequest") - .add("payloadType", payloadType) - .add("request", request) - .add("properties", properties) - .build(); - } - - - public static final class BuilderImpl implements Builder { - private final Class payloadType; + @SdkInternalApi + protected static class BuilderImpl, PayloadT, IdentityT extends Identity> + implements HttpSignRequest.Builder { private SdkHttpRequest request; private PayloadT payload; private IdentityT identity; private final Map, Object> properties = new HashMap<>(); - public BuilderImpl(Class payloadType) { - this.payloadType = payloadType; - } - @Override - public Builder request(SdkHttpRequest request) { + public B request(SdkHttpRequest request) { this.request = request; - return this; + return thisBuilder(); } @Override - public Builder payload(PayloadT payload) { + public B payload(PayloadT payload) { this.payload = payload; - return this; + return thisBuilder(); } @Override - public Builder identity(IdentityT identity) { + public B identity(IdentityT identity) { this.identity = identity; - return this; + return thisBuilder(); } @Override - public Builder putProperty(SignerProperty key, T value) { + public B putProperty(SignerProperty key, T value) { this.properties.put(key, value); - return this; + return thisBuilder(); + } + + private B thisBuilder() { + return (B) this; } } } diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncHttpSignRequest.java index dbbf159b53a9..a16b8154bcb6 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncHttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncHttpSignRequest.java @@ -15,51 +15,18 @@ package software.amazon.awssdk.http.auth.spi.internal; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; import software.amazon.awssdk.annotations.SdkInternalApi; import software.amazon.awssdk.http.ContentStreamProvider; -import software.amazon.awssdk.http.SdkHttpRequest; -import software.amazon.awssdk.http.auth.spi.SignerProperty; import software.amazon.awssdk.http.auth.spi.SyncHttpSignRequest; import software.amazon.awssdk.identity.spi.Identity; import software.amazon.awssdk.utils.ToString; -import software.amazon.awssdk.utils.Validate; @SdkInternalApi -public final class DefaultSyncHttpSignRequest implements SyncHttpSignRequest { +public final class DefaultSyncHttpSignRequest + extends DefaultHttpSignRequest implements SyncHttpSignRequest { - private final SdkHttpRequest request; - private final ContentStreamProvider payload; - private final IdentityT identity; - private final Map, Object> properties; - - DefaultSyncHttpSignRequest(BuilderImpl builder) { - this.request = Validate.paramNotNull(builder.request, "request"); - this.payload = builder.payload; - this.identity = Validate.paramNotNull(builder.identity, "identity"); - this.properties = new HashMap<>(builder.properties); - } - - @Override - public SdkHttpRequest request() { - return request; - } - - @Override - public Optional payload() { - return payload == null ? Optional.empty() : Optional.of(payload); - } - - @Override - public IdentityT identity() { - return identity; - } - - @Override - public T property(SignerProperty property) { - return (T) properties.get(property); + private DefaultSyncHttpSignRequest(BuilderImpl builder) { + super(builder); } @Override @@ -71,35 +38,9 @@ public String toString() { } @SdkInternalApi - public static final class BuilderImpl implements Builder { - private SdkHttpRequest request; - private ContentStreamProvider payload; - private IdentityT identity; - private final Map, Object> properties = new HashMap<>(); - - @Override - public Builder request(SdkHttpRequest request) { - this.request = request; - return this; - } - - @Override - public Builder payload(ContentStreamProvider payload) { - this.payload = payload; - return this; - } - - @Override - public Builder identity(IdentityT identity) { - this.identity = identity; - return this; - } - - @Override - public Builder putProperty(SignerProperty key, T value) { - this.properties.put(key, value); - return this; - } + public static final class BuilderImpl + extends DefaultHttpSignRequest.BuilderImpl, ContentStreamProvider, IdentityT> + implements SyncHttpSignRequest.Builder { @Override public SyncHttpSignRequest build() { From 80bc11c529b35aed58074873b9c542d7db6c0b28 Mon Sep 17 00:00:00 2001 From: Jaykumar Gosar Date: Fri, 19 May 2023 14:15:07 -0700 Subject: [PATCH 11/18] Split sync/async interfaces for SignedHttpRequest And removed `payloadType()` accessor. Also, HttpSignRequest builders take Identity as parameter instead of Class. --- .../http/auth/spi/AsyncHttpSignRequest.java | 10 +--- .../http/auth/spi/AsyncSignedHttpRequest.java | 60 +++++++++++++++++++ .../awssdk/http/auth/spi/HttpSignRequest.java | 8 +-- .../awssdk/http/auth/spi/HttpSigner.java | 16 +++-- .../http/auth/spi/SignedHttpRequest.java | 16 +---- .../http/auth/spi/SyncHttpSignRequest.java | 12 +--- .../http/auth/spi/SyncSignedHttpRequest.java | 59 ++++++++++++++++++ .../internal/DefaultAsyncHttpSignRequest.java | 7 +++ .../DefaultAsyncSignedHttpRequest.java | 49 +++++++++++++++ .../spi/internal/DefaultHttpSignRequest.java | 9 ++- .../internal/DefaultSignedHttpRequest.java | 43 ++++--------- .../internal/DefaultSyncHttpSignRequest.java | 7 +++ .../DefaultSyncSignedHttpRequest.java | 48 +++++++++++++++ .../awssdk/http/auth/spi/HttpSignerTest.java | 49 +++++++-------- 14 files changed, 285 insertions(+), 108 deletions(-) create mode 100644 core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncSignedHttpRequest.java create mode 100644 core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncSignedHttpRequest.java create mode 100644 core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncSignedHttpRequest.java create mode 100644 core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncSignedHttpRequest.java diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncHttpSignRequest.java index eba2ac7c6da6..0049c0968c6e 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncHttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncHttpSignRequest.java @@ -32,14 +32,8 @@ public interface AsyncHttpSignRequest extends HttpSi /** * Get a new builder for creating a {@link AsyncHttpSignRequest}. */ - static Builder builder(Class ignoredIdentityType) { - return new DefaultAsyncHttpSignRequest.BuilderImpl<>(); - } - - @Override - default Class> payloadType() { - // TODO: Code Review Note: Note this cast - return (Class) Publisher.class; + static Builder builder(IdentityT identity) { + return new DefaultAsyncHttpSignRequest.BuilderImpl<>(identity); } interface Builder extends HttpSignRequest.Builder, IdentityT>, diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncSignedHttpRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncSignedHttpRequest.java new file mode 100644 index 000000000000..dbb525c69bc4 --- /dev/null +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncSignedHttpRequest.java @@ -0,0 +1,60 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.http.auth.spi; + +import java.nio.ByteBuffer; +import org.reactivestreams.Publisher; +import software.amazon.awssdk.annotations.Immutable; +import software.amazon.awssdk.annotations.SdkPublicApi; +import software.amazon.awssdk.annotations.ThreadSafe; +import software.amazon.awssdk.http.SdkHttpRequest; +import software.amazon.awssdk.http.auth.spi.internal.DefaultAsyncSignedHttpRequest; +import software.amazon.awssdk.utils.builder.SdkBuilder; + +/** + * Represents a request that has been signed by {@link HttpSigner}. + ** //TODO: + */ +@SdkPublicApi +@Immutable +@ThreadSafe +public interface AsyncSignedHttpRequest extends SignedHttpRequest> { + + /** + * Get a new builder for creating a {@link SyncSignedHttpRequest}. + */ + static Builder builder() { + return new DefaultAsyncSignedHttpRequest.BuilderImpl(); + } + + /** + * A builder for a {@link SyncSignedHttpRequest}. + */ + interface Builder extends SignedHttpRequest.Builder>, SdkBuilder { + + /** + * Set the HTTP request object, without the request body payload. + */ + @Override + Builder request(SdkHttpRequest request); + + /** + * Set the body payload of the request. A payload is optional. By default, the payload will be empty. + */ + @Override + Builder payload(Publisher payload); + } +} diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java index 7eaf7f80d2a5..94cfa65c1641 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java @@ -36,11 +36,6 @@ @ThreadSafe public interface HttpSignRequest { - /** - * Returns the type of the payload. - */ - Class payloadType(); - /** * Returns the HTTP request object, without the request body payload. */ @@ -51,6 +46,9 @@ public interface HttpSignRequest { */ Optional payload(); + /** + * Returns the identity. + */ IdentityT identity(); /** diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java index 2d15e4a65168..af2b01888706 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java @@ -15,11 +15,8 @@ package software.amazon.awssdk.http.auth.spi; -import java.nio.ByteBuffer; import java.util.function.Consumer; -import org.reactivestreams.Publisher; import software.amazon.awssdk.annotations.SdkPublicApi; -import software.amazon.awssdk.http.ContentStreamProvider; import software.amazon.awssdk.http.auth.spi.internal.DefaultAsyncHttpSignRequest; import software.amazon.awssdk.http.auth.spi.internal.DefaultSyncHttpSignRequest; import software.amazon.awssdk.identity.spi.Identity; @@ -39,18 +36,19 @@ public interface HttpSigner { * @param request The inputs to sign a request. * @return A signed version of the request. */ - SignedHttpRequest sign(SyncHttpSignRequest request); + SyncSignedHttpRequest sign(SyncHttpSignRequest request); /** * Method that takes in inputs to sign a request with sync payload and returns a signed version of the request. *

* Similar to {@link #sign(SyncHttpSignRequest)}, but takes a lambda to configure a new {@link SyncHttpSignRequest.Builder}. - * This removes the need to call {@link SyncHttpSignRequest#builder(Class)}} and {@link SyncHttpSignRequest.Builder#build()}. + * This removes the need to call {@link SyncHttpSignRequest#builder(IdentityT)}} and + * {@link SyncHttpSignRequest.Builder#build()}. * * @param consumer A {@link Consumer} to which an empty {@link SyncHttpSignRequest.Builder} will be given. * @return A signed version of the request. */ - default SignedHttpRequest sign(Consumer> consumer) { + default SyncSignedHttpRequest sign(Consumer> consumer) { return sign(new DefaultSyncHttpSignRequest.BuilderImpl().applyMutation(consumer).build()); } @@ -60,19 +58,19 @@ default SignedHttpRequest sign(Consumer> signAsync(AsyncHttpSignRequest request); + AsyncSignedHttpRequest signAsync(AsyncHttpSignRequest request); /** * Method that takes in inputs to sign a request with async payload and returns a signed version of the request. *

* Similar to {@link #signAsync(AsyncHttpSignRequest)}, but takes a lambda to configure a new - * {@link AsyncHttpSignRequest.Builder}. This removes the need to call {@link AsyncHttpSignRequest#builder(Class)}} and + * {@link AsyncHttpSignRequest.Builder}. This removes the need to call {@link AsyncHttpSignRequest#builder(IdentityT)}} and * {@link AsyncHttpSignRequest.Builder#build()}. * * @param consumer A {@link Consumer} to which an empty {@link HttpSignRequest.Builder} will be given. * @return A signed version of the request. */ - default SignedHttpRequest> signAsync(Consumer> consumer) { + default AsyncSignedHttpRequest signAsync(Consumer> consumer) { return signAsync(new DefaultAsyncHttpSignRequest.BuilderImpl().applyMutation(consumer).build()); } } diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SignedHttpRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SignedHttpRequest.java index e9153b671fcf..58fb1c37b34b 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SignedHttpRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SignedHttpRequest.java @@ -20,8 +20,6 @@ import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.annotations.ThreadSafe; import software.amazon.awssdk.http.SdkHttpRequest; -import software.amazon.awssdk.http.auth.spi.internal.DefaultSignedHttpRequest; -import software.amazon.awssdk.utils.builder.SdkBuilder; /** * Represents a request that has been signed by {@link HttpSigner}. @@ -33,18 +31,6 @@ @ThreadSafe public interface SignedHttpRequest { - /** - * Get a new builder for creating a {@link SignedHttpRequest}. - */ - static Builder builder(Class payloadType) { - return new DefaultSignedHttpRequest.BuilderImpl<>(payloadType); - } - - /** - * Returns the type of the payload. - */ - Class payloadType(); - /** * Returns the HTTP request object, without the request body payload. */ @@ -58,7 +44,7 @@ static Builder builder(Class payloadType) { /** * A builder for a {@link SignedHttpRequest}. */ - interface Builder extends SdkBuilder, SignedHttpRequest> { + interface Builder { /** * Set the HTTP request object, without the request body payload. diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncHttpSignRequest.java index 992debb1cfa6..94a451bbaf2c 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncHttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncHttpSignRequest.java @@ -31,13 +31,8 @@ public interface SyncHttpSignRequest extends HttpSig /** * Get a new builder for creating a {@link SyncHttpSignRequest}. */ - static Builder builder(Class ignoredIdentityType) { - return new DefaultSyncHttpSignRequest.BuilderImpl<>(); - } - - @Override - default Class payloadType() { - return ContentStreamProvider.class; + static Builder builder(IdentityT identity) { + return new DefaultSyncHttpSignRequest.BuilderImpl<>(identity); } interface Builder extends HttpSignRequest.Builder, @@ -48,9 +43,6 @@ interface Builder extends HttpSignRequest.Builder payload(ContentStreamProvider payload); - @Override - Builder identity(IdentityT identity); - @Override Builder putProperty(SignerProperty key, T value); } diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncSignedHttpRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncSignedHttpRequest.java new file mode 100644 index 000000000000..24668bd141e2 --- /dev/null +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncSignedHttpRequest.java @@ -0,0 +1,59 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.http.auth.spi; + +import software.amazon.awssdk.annotations.Immutable; +import software.amazon.awssdk.annotations.SdkPublicApi; +import software.amazon.awssdk.annotations.ThreadSafe; +import software.amazon.awssdk.http.ContentStreamProvider; +import software.amazon.awssdk.http.SdkHttpRequest; +import software.amazon.awssdk.http.auth.spi.internal.DefaultSyncSignedHttpRequest; +import software.amazon.awssdk.utils.builder.SdkBuilder; + +/** + * Represents a request that has been signed by {@link HttpSigner}. + * //TODO: + */ +@SdkPublicApi +@Immutable +@ThreadSafe +public interface SyncSignedHttpRequest extends SignedHttpRequest { + + /** + * Get a new builder for creating a {@link SyncSignedHttpRequest}. + */ + static Builder builder() { + return new DefaultSyncSignedHttpRequest.BuilderImpl(); + } + + /** + * A builder for a {@link SyncSignedHttpRequest}. + */ + interface Builder extends SignedHttpRequest.Builder, SdkBuilder { + + /** + * Set the HTTP request object, without the request body payload. + */ + @Override + Builder request(SdkHttpRequest request); + + /** + * Set the body payload of the request. A payload is optional. By default, the payload will be empty. + */ + @Override + Builder payload(ContentStreamProvider payload); + } +} diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncHttpSignRequest.java index a37573f59dd2..ea79274febde 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncHttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncHttpSignRequest.java @@ -43,6 +43,13 @@ public static final class BuilderImpl extends DefaultHttpSignRequest.BuilderImpl, Publisher, IdentityT> implements AsyncHttpSignRequest.Builder { + public BuilderImpl() { + } + + public BuilderImpl(IdentityT identity) { + super(identity); + } + @Override public AsyncHttpSignRequest build() { return new DefaultAsyncHttpSignRequest<>(this); diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncSignedHttpRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncSignedHttpRequest.java new file mode 100644 index 000000000000..357b018d6a39 --- /dev/null +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncSignedHttpRequest.java @@ -0,0 +1,49 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.http.auth.spi.internal; + +import java.nio.ByteBuffer; +import org.reactivestreams.Publisher; +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.http.auth.spi.AsyncSignedHttpRequest; +import software.amazon.awssdk.utils.ToString; + +@SdkInternalApi +public final class DefaultAsyncSignedHttpRequest + extends DefaultSignedHttpRequest> implements AsyncSignedHttpRequest { + + private DefaultAsyncSignedHttpRequest(BuilderImpl builder) { + super(builder); + } + + @Override + public String toString() { + return ToString.builder("SyncSignedHttpRequest") + .add("request", request) + .build(); + } + + @SdkInternalApi + public static final class BuilderImpl + extends DefaultSignedHttpRequest.BuilderImpl> + implements AsyncSignedHttpRequest.Builder { + + @Override + public AsyncSignedHttpRequest build() { + return new DefaultAsyncSignedHttpRequest(this); + } + } +} diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java index 9e87de3dc3c6..5cd6fedf6ba1 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java @@ -62,12 +62,19 @@ public T property(SignerProperty property) { @SdkInternalApi protected static class BuilderImpl, PayloadT, IdentityT extends Identity> - implements HttpSignRequest.Builder { + implements Builder { private SdkHttpRequest request; private PayloadT payload; private IdentityT identity; private final Map, Object> properties = new HashMap<>(); + protected BuilderImpl() { + } + + protected BuilderImpl(IdentityT identity) { + this.identity = identity; + } + @Override public B request(SdkHttpRequest request) { this.request = request; diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSignedHttpRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSignedHttpRequest.java index 1b9c9230b534..2965d53b4ff1 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSignedHttpRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSignedHttpRequest.java @@ -19,27 +19,19 @@ import software.amazon.awssdk.annotations.SdkInternalApi; import software.amazon.awssdk.http.SdkHttpRequest; import software.amazon.awssdk.http.auth.spi.SignedHttpRequest; -import software.amazon.awssdk.utils.ToString; import software.amazon.awssdk.utils.Validate; @SdkInternalApi -public final class DefaultSignedHttpRequest implements SignedHttpRequest { +abstract class DefaultSignedHttpRequest implements SignedHttpRequest { - private final Class payloadType; - private final SdkHttpRequest request; - private final PayloadT payload; + protected final SdkHttpRequest request; + protected final PayloadT payload; - DefaultSignedHttpRequest(BuilderImpl builder) { - this.payloadType = Validate.paramNotNull(builder.payloadType, "payloadType"); + protected DefaultSignedHttpRequest(BuilderImpl builder) { this.request = Validate.paramNotNull(builder.request, "request"); this.payload = builder.payload; } - @Override - public Class payloadType() { - return payloadType; - } - @Override public SdkHttpRequest request() { return request; @@ -50,38 +42,27 @@ public Optional payload() { return payload == null ? Optional.empty() : Optional.of(payload); } - @Override - public String toString() { - return ToString.builder("SignedHttpRequest") - .add("payloadType", payloadType) - .add("request", request) - .build(); - } - - public static final class BuilderImpl implements Builder { - private final Class payloadType; + protected static class BuilderImpl, PayloadT> implements Builder { private SdkHttpRequest request; private PayloadT payload; - public BuilderImpl(Class payloadType) { - this.payloadType = payloadType; + protected BuilderImpl() { } @Override - public Builder request(SdkHttpRequest request) { + public B request(SdkHttpRequest request) { this.request = request; - return this; + return thisBuilder(); } @Override - public Builder payload(PayloadT payload) { + public B payload(PayloadT payload) { this.payload = payload; - return this; + return thisBuilder(); } - @Override - public SignedHttpRequest build() { - return new DefaultSignedHttpRequest<>(this); + private B thisBuilder() { + return (B) this; } } } diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncHttpSignRequest.java index a16b8154bcb6..1029eceb983f 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncHttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncHttpSignRequest.java @@ -42,6 +42,13 @@ public static final class BuilderImpl extends DefaultHttpSignRequest.BuilderImpl, ContentStreamProvider, IdentityT> implements SyncHttpSignRequest.Builder { + public BuilderImpl() { + } + + public BuilderImpl(IdentityT identity) { + super(identity); + } + @Override public SyncHttpSignRequest build() { return new DefaultSyncHttpSignRequest<>(this); diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncSignedHttpRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncSignedHttpRequest.java new file mode 100644 index 000000000000..13ca68934804 --- /dev/null +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncSignedHttpRequest.java @@ -0,0 +1,48 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.http.auth.spi.internal; + +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.http.ContentStreamProvider; +import software.amazon.awssdk.http.auth.spi.SyncSignedHttpRequest; +import software.amazon.awssdk.utils.ToString; + +@SdkInternalApi +public final class DefaultSyncSignedHttpRequest + extends DefaultSignedHttpRequest implements SyncSignedHttpRequest { + + private DefaultSyncSignedHttpRequest(BuilderImpl builder) { + super(builder); + } + + @Override + public String toString() { + return ToString.builder("SyncSignedHttpRequest") + .add("request", request) + .build(); + } + + @SdkInternalApi + public static final class BuilderImpl + extends DefaultSignedHttpRequest.BuilderImpl + implements SyncSignedHttpRequest.Builder { + + @Override + public SyncSignedHttpRequest build() { + return new DefaultSyncSignedHttpRequest(this); + } + } +} diff --git a/core/http-auth-spi/src/test/java/software/amazon/awssdk/http/auth/spi/HttpSignerTest.java b/core/http-auth-spi/src/test/java/software/amazon/awssdk/http/auth/spi/HttpSignerTest.java index 9091a4941436..c3694a503fb5 100644 --- a/core/http-auth-spi/src/test/java/software/amazon/awssdk/http/auth/spi/HttpSignerTest.java +++ b/core/http-auth-spi/src/test/java/software/amazon/awssdk/http/auth/spi/HttpSignerTest.java @@ -22,7 +22,6 @@ import java.nio.ByteBuffer; import org.junit.jupiter.api.Test; import org.reactivestreams.Publisher; -import software.amazon.awssdk.http.ContentStreamProvider; import software.amazon.awssdk.http.SdkHttpRequest; import software.amazon.awssdk.identity.spi.TokenIdentity; @@ -36,18 +35,18 @@ public class HttpSignerTest { @Test public void sign_usingConsumerBuilder_works() { - SignedHttpRequest signedRequest = signer.sign(r -> r.request(mock(SdkHttpRequest.class)) - .identity(IDENTITY) - .putProperty(KEY, VALUE)); + SyncSignedHttpRequest signedRequest = signer.sign(r -> r.request(mock(SdkHttpRequest.class)) + .identity(IDENTITY) + .putProperty(KEY, VALUE)); assertNotNull(signedRequest); } @Test public void sign_usingRequest_works() { - SignedHttpRequest signedRequest = - signer.sign(SyncHttpSignRequest.builder(TokenIdentity.class) + SyncSignedHttpRequest signedRequest = + signer.sign(SyncHttpSignRequest.builder(IDENTITY) .request(mock(SdkHttpRequest.class)) - .identity(IDENTITY) + //.identity(x) // Note, this is doable .putProperty(KEY, VALUE) .build()); assertNotNull(signedRequest); @@ -56,21 +55,21 @@ public void sign_usingRequest_works() { @Test public void signAsync_usingConsumerBuilder_works() { Publisher payload = subscriber -> {}; - SignedHttpRequest> signedRequest = signer.signAsync(r -> r.request(mock(SdkHttpRequest.class)) - .payload(payload) - .identity(IDENTITY) - .putProperty(KEY, VALUE)); + AsyncSignedHttpRequest signedRequest = signer.signAsync(r -> r.request(mock(SdkHttpRequest.class)) + .payload(payload) + .identity(IDENTITY) + .putProperty(KEY, VALUE)); assertNotNull(signedRequest); } @Test public void signAsync_usingRequest_works() { Publisher payload = subscriber -> {}; - SignedHttpRequest> signedRequest = - signer.signAsync(AsyncHttpSignRequest.builder(TokenIdentity.class) + AsyncSignedHttpRequest signedRequest = + signer.signAsync(AsyncHttpSignRequest.builder(IDENTITY) .request(mock(SdkHttpRequest.class)) .payload(payload) - .identity(IDENTITY) + //.identity(x) // Note, this is doable .putProperty(KEY, VALUE) .build()); assertNotNull(signedRequest); @@ -83,30 +82,22 @@ public void signAsync_usingRequest_works() { */ private class TestSigner implements HttpSigner { @Override - public SignedHttpRequest sign(SyncHttpSignRequest request) { - Class clazz = request.payloadType(); - assertEquals(ContentStreamProvider.class, clazz); - + public SyncSignedHttpRequest sign(SyncHttpSignRequest request) { assertEquals(VALUE, request.property(KEY)); assertEquals(IDENTITY, request.identity()); - return doSign(request); + return SyncSignedHttpRequest.builder() + .request(request.request()) + .payload(request.payload().orElse(null)) + .build(); } @Override - public SignedHttpRequest> signAsync(AsyncHttpSignRequest request) { - Class> clazz = request.payloadType(); - assertEquals(Publisher.class, clazz); - + public AsyncSignedHttpRequest signAsync(AsyncHttpSignRequest request) { assertEquals(VALUE, request.property(KEY)); assertEquals(IDENTITY, request.identity()); - return doSign(request); - } - - // no-op - private SignedHttpRequest doSign(HttpSignRequest request) { - return SignedHttpRequest.builder(request.payloadType()) + return AsyncSignedHttpRequest.builder() .request(request.request()) .payload(request.payload().orElse(null)) .build(); From ab7fdd8fd382fc40d952e68e88d9d9c1c773406e Mon Sep 17 00:00:00 2001 From: Jaykumar Gosar Date: Fri, 19 May 2023 22:59:52 -0700 Subject: [PATCH 12/18] Minor fixes * Added missing Builder method override for identity * Fixed javadocs * Fixed toString --- .../http/auth/spi/AsyncHttpSignRequest.java | 8 ++++++++ .../http/auth/spi/AsyncSignedHttpRequest.java | 13 +++--------- .../awssdk/http/auth/spi/HttpSignRequest.java | 2 +- .../http/auth/spi/SyncHttpSignRequest.java | 11 ++++++++++ .../http/auth/spi/SyncSignedHttpRequest.java | 9 +-------- .../internal/DefaultAsyncHttpSignRequest.java | 3 +++ .../DefaultAsyncSignedHttpRequest.java | 2 +- .../internal/DefaultSyncHttpSignRequest.java | 3 +++ .../awssdk/http/auth/spi/HttpSignerTest.java | 20 +++++++++---------- 9 files changed, 40 insertions(+), 31 deletions(-) diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncHttpSignRequest.java index 0049c0968c6e..8d9b953a5925 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncHttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncHttpSignRequest.java @@ -25,6 +25,11 @@ import software.amazon.awssdk.identity.spi.Identity; import software.amazon.awssdk.utils.builder.SdkBuilder; +/** + * Input parameters to sign a request with async payload, using {@link HttpSigner}. + * + * @param The type of the identity. + */ @SdkPublicApi @Immutable @ThreadSafe @@ -36,6 +41,9 @@ static Builder builder(IdentityT identit return new DefaultAsyncHttpSignRequest.BuilderImpl<>(identity); } + /** + * A builder for a {@link AsyncHttpSignRequest}. + */ interface Builder extends HttpSignRequest.Builder, IdentityT>, SdkBuilder, AsyncHttpSignRequest> { @Override diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncSignedHttpRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncSignedHttpRequest.java index dbb525c69bc4..ca5c66bcf98f 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncSignedHttpRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncSignedHttpRequest.java @@ -25,8 +25,7 @@ import software.amazon.awssdk.utils.builder.SdkBuilder; /** - * Represents a request that has been signed by {@link HttpSigner}. - ** //TODO: + * Represents a request with async payload that has been signed by {@link HttpSigner}. */ @SdkPublicApi @Immutable @@ -34,26 +33,20 @@ public interface AsyncSignedHttpRequest extends SignedHttpRequest> { /** - * Get a new builder for creating a {@link SyncSignedHttpRequest}. + * Get a new builder for creating a {@link AsyncSignedHttpRequest}. */ static Builder builder() { return new DefaultAsyncSignedHttpRequest.BuilderImpl(); } /** - * A builder for a {@link SyncSignedHttpRequest}. + * A builder for a {@link AsyncSignedHttpRequest}. */ interface Builder extends SignedHttpRequest.Builder>, SdkBuilder { - /** - * Set the HTTP request object, without the request body payload. - */ @Override Builder request(SdkHttpRequest request); - /** - * Set the body payload of the request. A payload is optional. By default, the payload will be empty. - */ @Override Builder payload(Publisher payload); } diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java index 94cfa65c1641..bccef1c4e37c 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java @@ -72,7 +72,7 @@ interface Builder { Builder payload(PayloadT payload); /** - * Set the body payload of the request. A payload is optional. By default, the payload will be empty. + * Set the identity of the request. */ Builder identity(IdentityT identity); diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncHttpSignRequest.java index 94a451bbaf2c..e3a99fb595e3 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncHttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncHttpSignRequest.java @@ -24,6 +24,11 @@ import software.amazon.awssdk.identity.spi.Identity; import software.amazon.awssdk.utils.builder.SdkBuilder; +/** + * Input parameters to sign a request with sync payload, using {@link HttpSigner}. + * + * @param The type of the identity. + */ @SdkPublicApi @Immutable @ThreadSafe @@ -35,6 +40,9 @@ static Builder builder(IdentityT identit return new DefaultSyncHttpSignRequest.BuilderImpl<>(identity); } + /** + * A builder for a {@link SyncHttpSignRequest}. + */ interface Builder extends HttpSignRequest.Builder, SdkBuilder, SyncHttpSignRequest> { @Override @@ -43,6 +51,9 @@ interface Builder extends HttpSignRequest.Builder payload(ContentStreamProvider payload); + @Override + Builder identity(IdentityT identity); + @Override Builder putProperty(SignerProperty key, T value); } diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncSignedHttpRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncSignedHttpRequest.java index 24668bd141e2..ef583e5aa9fa 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncSignedHttpRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncSignedHttpRequest.java @@ -24,8 +24,7 @@ import software.amazon.awssdk.utils.builder.SdkBuilder; /** - * Represents a request that has been signed by {@link HttpSigner}. - * //TODO: + * Represents a request with sync payload that has been signed by {@link HttpSigner}. */ @SdkPublicApi @Immutable @@ -44,15 +43,9 @@ static Builder builder() { */ interface Builder extends SignedHttpRequest.Builder, SdkBuilder { - /** - * Set the HTTP request object, without the request body payload. - */ @Override Builder request(SdkHttpRequest request); - /** - * Set the body payload of the request. A payload is optional. By default, the payload will be empty. - */ @Override Builder payload(ContentStreamProvider payload); } diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncHttpSignRequest.java index ea79274febde..970c29099463 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncHttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncHttpSignRequest.java @@ -34,6 +34,7 @@ private DefaultAsyncHttpSignRequest(BuilderImpl builder) { public String toString() { return ToString.builder("AsyncHttpSignRequest") .add("request", request) + .add("identity", identity) .add("properties", properties) .build(); } @@ -43,9 +44,11 @@ public static final class BuilderImpl extends DefaultHttpSignRequest.BuilderImpl, Publisher, IdentityT> implements AsyncHttpSignRequest.Builder { + // Used to enable consumer builder pattern in HttpSigner.signAsync() public BuilderImpl() { } + // Used by AsyncHttpSignRequest#builder() where identity is passed as parameter, to avoid having to pass Class. public BuilderImpl(IdentityT identity) { super(identity); } diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncSignedHttpRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncSignedHttpRequest.java index 357b018d6a39..0334f128e603 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncSignedHttpRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncSignedHttpRequest.java @@ -31,7 +31,7 @@ private DefaultAsyncSignedHttpRequest(BuilderImpl builder) { @Override public String toString() { - return ToString.builder("SyncSignedHttpRequest") + return ToString.builder("AsyncSignedHttpRequest") .add("request", request) .build(); } diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncHttpSignRequest.java index 1029eceb983f..5c7419a96fa6 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncHttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncHttpSignRequest.java @@ -33,6 +33,7 @@ private DefaultSyncHttpSignRequest(BuilderImpl builder) { public String toString() { return ToString.builder("SyncHttpSignRequest") .add("request", request) + .add("identity", identity) .add("properties", properties) .build(); } @@ -42,9 +43,11 @@ public static final class BuilderImpl extends DefaultHttpSignRequest.BuilderImpl, ContentStreamProvider, IdentityT> implements SyncHttpSignRequest.Builder { + // Used to enable consumer builder pattern in HttpSigner.sign() public BuilderImpl() { } + // Used by SyncHttpSignRequest#builder() where identity is passed as parameter, to avoid having to pass Class. public BuilderImpl(IdentityT identity) { super(identity); } diff --git a/core/http-auth-spi/src/test/java/software/amazon/awssdk/http/auth/spi/HttpSignerTest.java b/core/http-auth-spi/src/test/java/software/amazon/awssdk/http/auth/spi/HttpSignerTest.java index c3694a503fb5..938c26ea2cdf 100644 --- a/core/http-auth-spi/src/test/java/software/amazon/awssdk/http/auth/spi/HttpSignerTest.java +++ b/core/http-auth-spi/src/test/java/software/amazon/awssdk/http/auth/spi/HttpSignerTest.java @@ -46,7 +46,7 @@ public void sign_usingRequest_works() { SyncSignedHttpRequest signedRequest = signer.sign(SyncHttpSignRequest.builder(IDENTITY) .request(mock(SdkHttpRequest.class)) - //.identity(x) // Note, this is doable + .identity(IDENTITY) // Note, this is doable .putProperty(KEY, VALUE) .build()); assertNotNull(signedRequest); @@ -69,16 +69,14 @@ public void signAsync_usingRequest_works() { signer.signAsync(AsyncHttpSignRequest.builder(IDENTITY) .request(mock(SdkHttpRequest.class)) .payload(payload) - //.identity(x) // Note, this is doable + .identity(IDENTITY) // Note, this is doable .putProperty(KEY, VALUE) .build()); assertNotNull(signedRequest); } /** - * NoOp Signer that asserts that the HttpSignRequest created via builder or Consumer builder pattern are set up correctly, - * e.g., have the correct payloadType, and makes sure that payloadType works with SignedHttpRequest without runtime - * exceptions. + * NoOp Signer that asserts that the input created via builder or Consumer builder pattern are set up correctly. */ private class TestSigner implements HttpSigner { @Override @@ -87,9 +85,9 @@ public SyncSignedHttpRequest sign(SyncHttpSignRequest request) { assertEquals(IDENTITY, request.identity()); return SyncSignedHttpRequest.builder() - .request(request.request()) - .payload(request.payload().orElse(null)) - .build(); + .request(request.request()) + .payload(request.payload().orElse(null)) + .build(); } @Override @@ -98,9 +96,9 @@ public AsyncSignedHttpRequest signAsync(AsyncHttpSignRequest requ assertEquals(IDENTITY, request.identity()); return AsyncSignedHttpRequest.builder() - .request(request.request()) - .payload(request.payload().orElse(null)) - .build(); + .request(request.request()) + .payload(request.payload().orElse(null)) + .build(); } } } From a6b7f64d800706bdd4d552865c038eab423ff888 Mon Sep 17 00:00:00 2001 From: Jaykumar Gosar Date: Fri, 19 May 2023 23:24:24 -0700 Subject: [PATCH 13/18] Make protected properties Map an unmodifiableMap --- .../awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java index 5cd6fedf6ba1..33fecf9d7776 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java @@ -15,6 +15,7 @@ package software.amazon.awssdk.http.auth.spi.internal; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Optional; @@ -37,7 +38,7 @@ protected DefaultHttpSignRequest(BuilderImpl builder) { this.request = Validate.paramNotNull(builder.request, "request"); this.payload = builder.payload; this.identity = Validate.paramNotNull(builder.identity, "identity"); - this.properties = new HashMap<>(builder.properties); + this.properties = Collections.unmodifiableMap(builder.properties); } @Override From de704e738dbb15530a83ee86f95c9606ccd3cb39 Mon Sep 17 00:00:00 2001 From: Jaykumar Gosar Date: Sat, 20 May 2023 00:32:28 -0700 Subject: [PATCH 14/18] Remove overriding in HttpSignRequest.Builder sub-interfaces --- .../http/auth/spi/AsyncHttpSignRequest.java | 17 +++-------------- .../awssdk/http/auth/spi/HttpSignRequest.java | 10 +++++----- .../http/auth/spi/SyncHttpSignRequest.java | 17 +++-------------- .../internal/DefaultAsyncHttpSignRequest.java | 2 +- .../spi/internal/DefaultHttpSignRequest.java | 4 ++-- .../internal/DefaultSyncHttpSignRequest.java | 2 +- 6 files changed, 15 insertions(+), 37 deletions(-) diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncHttpSignRequest.java index 8d9b953a5925..58c14d445161 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncHttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncHttpSignRequest.java @@ -20,7 +20,6 @@ import software.amazon.awssdk.annotations.Immutable; import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.annotations.ThreadSafe; -import software.amazon.awssdk.http.SdkHttpRequest; import software.amazon.awssdk.http.auth.spi.internal.DefaultAsyncHttpSignRequest; import software.amazon.awssdk.identity.spi.Identity; import software.amazon.awssdk.utils.builder.SdkBuilder; @@ -44,18 +43,8 @@ static Builder builder(IdentityT identit /** * A builder for a {@link AsyncHttpSignRequest}. */ - interface Builder extends HttpSignRequest.Builder, IdentityT>, - SdkBuilder, AsyncHttpSignRequest> { - @Override - Builder request(SdkHttpRequest request); - - @Override - Builder payload(Publisher payload); - - @Override - Builder identity(IdentityT identity); - - @Override - Builder putProperty(SignerProperty key, T value); + interface Builder + extends HttpSignRequest.Builder, Publisher, IdentityT>, + SdkBuilder, AsyncHttpSignRequest> { } } diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java index bccef1c4e37c..ae4b86653311 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java @@ -59,26 +59,26 @@ public interface HttpSignRequest { /** * A builder for a {@link HttpSignRequest}. */ - interface Builder { + interface Builder, PayloadT, IdentityT extends Identity> { /** * Set the HTTP request object, without the request body payload. */ - Builder request(SdkHttpRequest request); + B request(SdkHttpRequest request); /** * Set the body payload of the request. A payload is optional. By default, the payload will be empty. */ - Builder payload(PayloadT payload); + B payload(PayloadT payload); /** * Set the identity of the request. */ - Builder identity(IdentityT identity); + B identity(IdentityT identity); /** * Set a property that the {@link HttpSigner} can use during signing. */ - Builder putProperty(SignerProperty key, T value); + B putProperty(SignerProperty key, T value); } } diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncHttpSignRequest.java index e3a99fb595e3..f220a5a7e89d 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncHttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncHttpSignRequest.java @@ -19,7 +19,6 @@ import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.annotations.ThreadSafe; import software.amazon.awssdk.http.ContentStreamProvider; -import software.amazon.awssdk.http.SdkHttpRequest; import software.amazon.awssdk.http.auth.spi.internal.DefaultSyncHttpSignRequest; import software.amazon.awssdk.identity.spi.Identity; import software.amazon.awssdk.utils.builder.SdkBuilder; @@ -43,18 +42,8 @@ static Builder builder(IdentityT identit /** * A builder for a {@link SyncHttpSignRequest}. */ - interface Builder extends HttpSignRequest.Builder, - SdkBuilder, SyncHttpSignRequest> { - @Override - Builder request(SdkHttpRequest request); - - @Override - Builder payload(ContentStreamProvider payload); - - @Override - Builder identity(IdentityT identity); - - @Override - Builder putProperty(SignerProperty key, T value); + interface Builder + extends HttpSignRequest.Builder, ContentStreamProvider, IdentityT>, + SdkBuilder, SyncHttpSignRequest> { } } diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncHttpSignRequest.java index 970c29099463..8edbcadbac4b 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncHttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncHttpSignRequest.java @@ -41,7 +41,7 @@ public String toString() { @SdkInternalApi public static final class BuilderImpl - extends DefaultHttpSignRequest.BuilderImpl, Publisher, IdentityT> + extends DefaultHttpSignRequest.BuilderImpl, Publisher, IdentityT> implements AsyncHttpSignRequest.Builder { // Used to enable consumer builder pattern in HttpSigner.signAsync() diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java index 33fecf9d7776..fd7f18676f71 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultHttpSignRequest.java @@ -62,8 +62,8 @@ public T property(SignerProperty property) { } @SdkInternalApi - protected static class BuilderImpl, PayloadT, IdentityT extends Identity> - implements Builder { + protected abstract static class BuilderImpl, PayloadT, + IdentityT extends Identity> implements Builder { private SdkHttpRequest request; private PayloadT payload; private IdentityT identity; diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncHttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncHttpSignRequest.java index 5c7419a96fa6..3d6a952e93e5 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncHttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncHttpSignRequest.java @@ -40,7 +40,7 @@ public String toString() { @SdkInternalApi public static final class BuilderImpl - extends DefaultHttpSignRequest.BuilderImpl, ContentStreamProvider, IdentityT> + extends DefaultHttpSignRequest.BuilderImpl, ContentStreamProvider, IdentityT> implements SyncHttpSignRequest.Builder { // Used to enable consumer builder pattern in HttpSigner.sign() From 3e24cc490fcc665f60e9a735e7d2d4a8dcff6ba9 Mon Sep 17 00:00:00 2001 From: Jaykumar Gosar Date: Sat, 20 May 2023 00:44:14 -0700 Subject: [PATCH 15/18] Remove overriding in SignedHttpRequest.Builder sub-interfaces --- .../awssdk/http/auth/spi/AsyncSignedHttpRequest.java | 10 ++-------- .../amazon/awssdk/http/auth/spi/SignedHttpRequest.java | 6 +++--- .../awssdk/http/auth/spi/SyncSignedHttpRequest.java | 10 ++-------- .../spi/internal/DefaultAsyncSignedHttpRequest.java | 2 +- .../auth/spi/internal/DefaultSignedHttpRequest.java | 2 +- .../spi/internal/DefaultSyncSignedHttpRequest.java | 2 +- 6 files changed, 10 insertions(+), 22 deletions(-) diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncSignedHttpRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncSignedHttpRequest.java index ca5c66bcf98f..ed66105313be 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncSignedHttpRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/AsyncSignedHttpRequest.java @@ -20,7 +20,6 @@ import software.amazon.awssdk.annotations.Immutable; import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.annotations.ThreadSafe; -import software.amazon.awssdk.http.SdkHttpRequest; import software.amazon.awssdk.http.auth.spi.internal.DefaultAsyncSignedHttpRequest; import software.amazon.awssdk.utils.builder.SdkBuilder; @@ -42,12 +41,7 @@ static Builder builder() { /** * A builder for a {@link AsyncSignedHttpRequest}. */ - interface Builder extends SignedHttpRequest.Builder>, SdkBuilder { - - @Override - Builder request(SdkHttpRequest request); - - @Override - Builder payload(Publisher payload); + interface Builder extends SignedHttpRequest.Builder>, + SdkBuilder { } } diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SignedHttpRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SignedHttpRequest.java index 58fb1c37b34b..87ecdf5cff49 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SignedHttpRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SignedHttpRequest.java @@ -44,16 +44,16 @@ public interface SignedHttpRequest { /** * A builder for a {@link SignedHttpRequest}. */ - interface Builder { + interface Builder, PayloadT> { /** * Set the HTTP request object, without the request body payload. */ - Builder request(SdkHttpRequest request); + B request(SdkHttpRequest request); /** * Set the body payload of the request. A payload is optional. By default, the payload will be empty. */ - Builder payload(PayloadT payload); + B payload(PayloadT payload); } } diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncSignedHttpRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncSignedHttpRequest.java index ef583e5aa9fa..b0cedff2429e 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncSignedHttpRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/SyncSignedHttpRequest.java @@ -19,7 +19,6 @@ import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.annotations.ThreadSafe; import software.amazon.awssdk.http.ContentStreamProvider; -import software.amazon.awssdk.http.SdkHttpRequest; import software.amazon.awssdk.http.auth.spi.internal.DefaultSyncSignedHttpRequest; import software.amazon.awssdk.utils.builder.SdkBuilder; @@ -41,12 +40,7 @@ static Builder builder() { /** * A builder for a {@link SyncSignedHttpRequest}. */ - interface Builder extends SignedHttpRequest.Builder, SdkBuilder { - - @Override - Builder request(SdkHttpRequest request); - - @Override - Builder payload(ContentStreamProvider payload); + interface Builder extends SignedHttpRequest.Builder, + SdkBuilder { } } diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncSignedHttpRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncSignedHttpRequest.java index 0334f128e603..bcec4ff9066d 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncSignedHttpRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultAsyncSignedHttpRequest.java @@ -38,7 +38,7 @@ public String toString() { @SdkInternalApi public static final class BuilderImpl - extends DefaultSignedHttpRequest.BuilderImpl> + extends DefaultSignedHttpRequest.BuilderImpl> implements AsyncSignedHttpRequest.Builder { @Override diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSignedHttpRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSignedHttpRequest.java index 2965d53b4ff1..0465ec4a5d8c 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSignedHttpRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSignedHttpRequest.java @@ -42,7 +42,7 @@ public Optional payload() { return payload == null ? Optional.empty() : Optional.of(payload); } - protected static class BuilderImpl, PayloadT> implements Builder { + protected abstract static class BuilderImpl, PayloadT> implements Builder { private SdkHttpRequest request; private PayloadT payload; diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncSignedHttpRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncSignedHttpRequest.java index 13ca68934804..f08a562ea7a3 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncSignedHttpRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/internal/DefaultSyncSignedHttpRequest.java @@ -37,7 +37,7 @@ public String toString() { @SdkInternalApi public static final class BuilderImpl - extends DefaultSignedHttpRequest.BuilderImpl + extends DefaultSignedHttpRequest.BuilderImpl implements SyncSignedHttpRequest.Builder { @Override From 8d5ee7e8e7811a8a65734b2af0b15c62ec8a5dd7 Mon Sep 17 00:00:00 2001 From: Jaykumar Gosar Date: Mon, 22 May 2023 16:04:12 -0700 Subject: [PATCH 16/18] Allow sign methods take request with subtype of the IdentityT --- .../awssdk/http/auth/spi/HttpSigner.java | 4 ++-- .../awssdk/http/auth/spi/HttpSignerTest.java | 19 +++++++++++++------ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java index af2b01888706..7cc8ac5d4784 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSigner.java @@ -36,7 +36,7 @@ public interface HttpSigner { * @param request The inputs to sign a request. * @return A signed version of the request. */ - SyncSignedHttpRequest sign(SyncHttpSignRequest request); + SyncSignedHttpRequest sign(SyncHttpSignRequest request); /** * Method that takes in inputs to sign a request with sync payload and returns a signed version of the request. @@ -58,7 +58,7 @@ default SyncSignedHttpRequest sign(Consumer request); + AsyncSignedHttpRequest signAsync(AsyncHttpSignRequest request); /** * Method that takes in inputs to sign a request with async payload and returns a signed version of the request. diff --git a/core/http-auth-spi/src/test/java/software/amazon/awssdk/http/auth/spi/HttpSignerTest.java b/core/http-auth-spi/src/test/java/software/amazon/awssdk/http/auth/spi/HttpSignerTest.java index 938c26ea2cdf..1df17a72f011 100644 --- a/core/http-auth-spi/src/test/java/software/amazon/awssdk/http/auth/spi/HttpSignerTest.java +++ b/core/http-auth-spi/src/test/java/software/amazon/awssdk/http/auth/spi/HttpSignerTest.java @@ -29,7 +29,7 @@ public class HttpSignerTest { private static final SignerProperty KEY = SignerProperty.create(String.class, "key"); private static final String VALUE = "value"; - private TokenIdentity IDENTITY = TokenIdentity.create("token"); + private static final TokenIdentity IDENTITY = TokenIdentity.create("token"); final HttpSigner signer = new TestSigner(); @@ -77,28 +77,35 @@ public void signAsync_usingRequest_works() { /** * NoOp Signer that asserts that the input created via builder or Consumer builder pattern are set up correctly. + * This is similar to what a bearerTokenSigner would look like - which would insert the identity in a Header. + */ - private class TestSigner implements HttpSigner { + private static class TestSigner implements HttpSigner { @Override - public SyncSignedHttpRequest sign(SyncHttpSignRequest request) { + public SyncSignedHttpRequest sign(SyncHttpSignRequest request) { assertEquals(VALUE, request.property(KEY)); assertEquals(IDENTITY, request.identity()); return SyncSignedHttpRequest.builder() - .request(request.request()) + .request(addTokenHeader(request)) .payload(request.payload().orElse(null)) .build(); } @Override - public AsyncSignedHttpRequest signAsync(AsyncHttpSignRequest request) { + public AsyncSignedHttpRequest signAsync(AsyncHttpSignRequest request) { assertEquals(VALUE, request.property(KEY)); assertEquals(IDENTITY, request.identity()); return AsyncSignedHttpRequest.builder() - .request(request.request()) + .request(addTokenHeader(request)) .payload(request.payload().orElse(null)) .build(); } + + private SdkHttpRequest addTokenHeader(HttpSignRequest input) { + // return input.request().copy(b -> b.putHeader("Token-Header", input.identity().token())); + return input.request(); + } } } From a8ef98f4acd4d8591fa2685729124c8de4eb5677 Mon Sep 17 00:00:00 2001 From: Jaykumar Gosar Date: Mon, 22 May 2023 16:37:31 -0700 Subject: [PATCH 17/18] Make HttpSignRequest @SdkProtectedApi --- .../amazon/awssdk/http/auth/spi/HttpSignRequest.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java index ae4b86653311..2c46fabd8e6b 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java @@ -17,7 +17,7 @@ import java.util.Optional; import software.amazon.awssdk.annotations.Immutable; -import software.amazon.awssdk.annotations.SdkPublicApi; +import software.amazon.awssdk.annotations.SdkProtectedApi; import software.amazon.awssdk.annotations.ThreadSafe; import software.amazon.awssdk.http.SdkHttpRequest; import software.amazon.awssdk.identity.spi.Identity; @@ -28,10 +28,7 @@ * @param The type of payload of the request. * @param The type of the identity. */ -// TODO: Code Reviewer Note: Seems like this could be package-private/SdkProtectedApi, since there are 2 sub-interfaces that -// HttpSigner uses, however for implementation of HttpSigner that don't care about Sync v/s Async, they can share their -// implementation by using this type with generic PayloadT. Should this be public but SdkProtectedApi? -@SdkPublicApi +@SdkProtectedApi @Immutable @ThreadSafe public interface HttpSignRequest { From 6f9d3d107ffa3d68eee1a579c23c56bee2f3b546 Mon Sep 17 00:00:00 2001 From: Jaykumar Gosar Date: Wed, 24 May 2023 10:36:38 -0700 Subject: [PATCH 18/18] Make HttpSignRequest @SdkPublicApi --- .../software/amazon/awssdk/http/auth/spi/HttpSignRequest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java index 2c46fabd8e6b..261a28c00cc4 100644 --- a/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java +++ b/core/http-auth-spi/src/main/java/software/amazon/awssdk/http/auth/spi/HttpSignRequest.java @@ -17,7 +17,7 @@ import java.util.Optional; import software.amazon.awssdk.annotations.Immutable; -import software.amazon.awssdk.annotations.SdkProtectedApi; +import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.annotations.ThreadSafe; import software.amazon.awssdk.http.SdkHttpRequest; import software.amazon.awssdk.identity.spi.Identity; @@ -28,7 +28,7 @@ * @param The type of payload of the request. * @param The type of the identity. */ -@SdkProtectedApi +@SdkPublicApi @Immutable @ThreadSafe public interface HttpSignRequest {