Skip to content

Commit 03962e2

Browse files
committed
Replace builders with modifiable request/response
1 parent ff3a1d9 commit 03962e2

23 files changed

Lines changed: 121 additions & 109 deletions

File tree

aws/aws-sigv4/src/main/java/software/amazon/smithy/java/aws/client/auth/scheme/sigv4/SigV4Signer.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,9 @@ public SignResult<HttpRequest> sign(HttpRequest request, AwsCredentialsIdentity
9191
identity.sessionToken(),
9292
!request.body().hasKnownLength());
9393
var signedHeaders = signatureAndSignedHeaders.right;
94-
return new SignResult<>(request.toBuilder().headers(HttpHeaders.of(signedHeaders)).build(),
95-
signatureAndSignedHeaders.left);
94+
var mod = request.toModifiableCopy();
95+
mod.setHeaders(HttpHeaders.of(signedHeaders).toModifiable());
96+
return new SignResult<>(mod, signatureAndSignedHeaders.left);
9697
}
9798

9899
private String getPayloadHash(DataStream dataStream) {

aws/client/aws-client-http/src/main/java/software/amazon/smithy/java/aws/client/http/AmzSdkRequestPlugin.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
package software.amazon.smithy.java.aws.client.http;
77

8-
import java.util.List;
98
import software.amazon.smithy.java.client.core.CallContext;
109
import software.amazon.smithy.java.client.core.ClientConfig;
1110
import software.amazon.smithy.java.client.core.ClientPlugin;
@@ -38,9 +37,7 @@ public <RequestT> RequestT modifyBeforeSigning(RequestHook<?, ?, RequestT> hook)
3837
value.append("; max=").append(max);
3938
}
4039
return hook.asRequestType(
41-
req.toBuilder()
42-
.withReplacedHeader("amz-sdk-request", List.of(value.toString()))
43-
.build());
40+
req.toModifiableCopy().setHeader("amz-sdk-request", value.toString()));
4441
}
4542
}
4643
return hook.request();

aws/client/aws-client-http/src/main/java/software/amazon/smithy/java/aws/client/http/RecursionDetectionPlugin.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,9 @@ private record Interceptor(List<String> traceIdHeader) implements ClientIntercep
4848
public <RequestT> RequestT modifyBeforeTransmit(RequestHook<?, ?, RequestT> hook) {
4949
if (hook.request() instanceof HttpRequest req) {
5050
if (!req.headers().hasHeader("x-amzn-trace-id")) {
51-
return hook.asRequestType(
52-
req.toBuilder().withReplacedHeader("x-amzn-trace-id", traceIdHeader).build());
51+
var mod = req.toModifiableCopy();
52+
mod.headers().setHeader("x-amzn-trace-id", traceIdHeader);
53+
return hook.asRequestType(mod);
5354
}
5455
}
5556
return hook.request();

aws/client/aws-client-http/src/test/java/software/amazon/smithy/java/aws/client/http/RecursionDetectionPluginTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import static org.hamcrest.Matchers.contains;
1010
import static org.hamcrest.Matchers.empty;
1111

12-
import java.util.List;
1312
import org.junit.jupiter.api.Test;
1413
import software.amazon.smithy.java.aws.client.awsjson.AwsJson1Protocol;
1514
import software.amazon.smithy.java.client.core.ClientPlugin;
@@ -80,7 +79,7 @@ public void doesNotReplaceExistingValue() {
8079
public <RequestT> RequestT modifyBeforeSigning(RequestHook<?, ?, RequestT> hook) {
8180
if (hook.request() instanceof HttpRequest req) {
8281
return hook.asRequestType(
83-
req.toBuilder().withReplacedHeader("x-amzn-trace-id", List.of("hi")).build());
82+
req.toModifiableCopy().setHeader("x-amzn-trace-id", "hi"));
8483
}
8584
return hook.request();
8685
}

client/client-core/src/main/java/software/amazon/smithy/java/client/core/interceptors/RequestHook.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public RequestHook<I, O, RequestT> withRequest(RequestT request) {
5353
* <p>This is useful when modifying the request using {@code instanceof} pattern matching:
5454
* {@snippet :
5555
* if (hook.request() instanceof HttpRequest req) {
56-
* return hook.asRequestType(req.toBuilder().withAddedHeader("X-Foo", "Bar").build());
56+
* return hook.asRequestType(req.toModifiableCopy().addHeader("X-Foo", "Bar"));
5757
* }
5858
* return hook.request();
5959
* }

client/client-http/src/main/java/software/amazon/smithy/java/client/http/HttpErrorDeserializer.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -104,12 +104,9 @@ default ModeledException createErrorFromDocument(
104104
Document parsedDocument,
105105
ShapeBuilder<ModeledException> builder
106106
) {
107-
return createError(
108-
context,
109-
codec,
110-
// Make a new response that uses the previously read response payload.
111-
response.toBuilder().body(DataStream.ofByteBuffer(responsePayload)).build(),
112-
builder);
107+
var modResponse = response.toModifiableCopy();
108+
modResponse.setBody(DataStream.ofByteBuffer(responsePayload));
109+
return createError(context, codec, modResponse, builder);
113110
}
114111
}
115112

client/client-http/src/main/java/software/amazon/smithy/java/client/http/auth/HttpApiKeyAuthSigner.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,10 @@
55

66
package software.amazon.smithy.java.client.http.auth;
77

8-
import java.util.LinkedHashMap;
9-
import java.util.List;
108
import software.amazon.smithy.java.auth.api.SignResult;
119
import software.amazon.smithy.java.auth.api.Signer;
1210
import software.amazon.smithy.java.auth.api.identity.ApiKeyIdentity;
1311
import software.amazon.smithy.java.context.Context;
14-
import software.amazon.smithy.java.http.api.HttpHeaders;
1512
import software.amazon.smithy.java.http.api.HttpRequest;
1613
import software.amazon.smithy.java.io.uri.QueryStringBuilder;
1714
import software.amazon.smithy.java.logging.InternalLogger;
@@ -29,16 +26,14 @@ public SignResult<HttpRequest> sign(HttpRequest request, ApiKeyIdentity identity
2926
case HEADER -> {
3027
var schemeValue = properties.get(HttpApiKeyAuthScheme.SCHEME);
3128
var value = identity.apiKey();
32-
// If the scheme value is not null prefix with scheme
3329
if (schemeValue != null) {
3430
value = schemeValue + " " + value;
3531
}
36-
var updated = new LinkedHashMap<>(request.headers().map());
37-
var existing = updated.put(name, List.of(value));
38-
if (existing != null) {
32+
var mod = request.toModifiableCopy();
33+
if (mod.headers().hasHeader(name)) {
3934
LOGGER.debug("Replaced header value for {}", name);
4035
}
41-
yield new SignResult<>(request.toBuilder().headers(HttpHeaders.of(updated)).build());
36+
yield new SignResult<>(mod.setHeader(name, value));
4237
}
4338
case QUERY -> {
4439
var queryBuilder = new QueryStringBuilder();
@@ -47,8 +42,9 @@ public SignResult<HttpRequest> sign(HttpRequest request, ApiKeyIdentity identity
4742
var existingQuery = request.uri().getQuery();
4843
addExistingQueryParams(stringBuilder, existingQuery, name);
4944
queryBuilder.write(stringBuilder);
50-
yield new SignResult<>(
51-
request.toBuilder().uri(request.uri().withQuery(stringBuilder.toString())).build());
45+
var mod = request.toModifiableCopy();
46+
mod.setUri(request.uri().withQuery(stringBuilder.toString()));
47+
yield new SignResult<>(mod);
5248
}
5349
};
5450
}

client/client-http/src/main/java/software/amazon/smithy/java/client/http/auth/HttpBasicAuthSigner.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,10 @@
77

88
import java.nio.charset.StandardCharsets;
99
import java.util.Base64;
10-
import java.util.LinkedHashMap;
11-
import java.util.List;
1210
import software.amazon.smithy.java.auth.api.SignResult;
1311
import software.amazon.smithy.java.auth.api.Signer;
1412
import software.amazon.smithy.java.auth.api.identity.LoginIdentity;
1513
import software.amazon.smithy.java.context.Context;
16-
import software.amazon.smithy.java.http.api.HttpHeaders;
1714
import software.amazon.smithy.java.http.api.HttpRequest;
1815
import software.amazon.smithy.java.logging.InternalLogger;
1916

@@ -29,11 +26,10 @@ private HttpBasicAuthSigner() {}
2926
public SignResult<HttpRequest> sign(HttpRequest request, LoginIdentity identity, Context properties) {
3027
var identityString = identity.username() + ":" + identity.password();
3128
var base64Value = Base64.getEncoder().encodeToString(identityString.getBytes(StandardCharsets.UTF_8));
32-
var headers = new LinkedHashMap<>(request.headers().map());
33-
var existing = headers.put(AUTHORIZATION_HEADER, List.of(SCHEME + " " + base64Value));
34-
if (existing != null) {
29+
var mod = request.toModifiableCopy();
30+
if (mod.headers().hasHeader(AUTHORIZATION_HEADER)) {
3531
LOGGER.debug("Replaced existing Authorization header value.");
3632
}
37-
return new SignResult<>(request.toBuilder().headers(HttpHeaders.of(headers)).build());
33+
return new SignResult<>(mod.setHeader(AUTHORIZATION_HEADER, SCHEME + " " + base64Value));
3834
}
3935
}

client/client-http/src/main/java/software/amazon/smithy/java/client/http/auth/HttpBearerAuthSigner.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,10 @@
55

66
package software.amazon.smithy.java.client.http.auth;
77

8-
import java.util.LinkedHashMap;
9-
import java.util.List;
108
import software.amazon.smithy.java.auth.api.SignResult;
119
import software.amazon.smithy.java.auth.api.Signer;
1210
import software.amazon.smithy.java.auth.api.identity.TokenIdentity;
1311
import software.amazon.smithy.java.context.Context;
14-
import software.amazon.smithy.java.http.api.HttpHeaders;
1512
import software.amazon.smithy.java.http.api.HttpRequest;
1613
import software.amazon.smithy.java.logging.InternalLogger;
1714

@@ -25,11 +22,10 @@ private HttpBearerAuthSigner() {}
2522

2623
@Override
2724
public SignResult<HttpRequest> sign(HttpRequest request, TokenIdentity identity, Context properties) {
28-
var headers = new LinkedHashMap<>(request.headers().map());
29-
var existing = headers.put(AUTHORIZATION_HEADER, List.of(SCHEME + " " + identity.token()));
30-
if (existing != null) {
25+
var mod = request.toModifiableCopy();
26+
if (mod.headers().hasHeader(AUTHORIZATION_HEADER)) {
3127
LOGGER.debug("Replaced existing Authorization header value.");
3228
}
33-
return new SignResult<>(request.toBuilder().headers(HttpHeaders.of(headers)).build());
29+
return new SignResult<>(mod.setHeader(AUTHORIZATION_HEADER, SCHEME + " " + identity.token()));
3430
}
3531
}

client/client-http/src/main/java/software/amazon/smithy/java/client/http/plugins/HttpChecksumPlugin.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import software.amazon.smithy.java.http.api.HttpRequest;
1818
import software.amazon.smithy.java.io.ByteBufferUtils;
1919
import software.amazon.smithy.model.traits.HttpChecksumRequiredTrait;
20-
import software.amazon.smithy.utils.ListUtils;
2120
import software.amazon.smithy.utils.SmithyInternalApi;
2221

2322
/**
@@ -55,9 +54,9 @@ static HttpRequest addContentMd5Header(HttpRequest request) {
5554
try {
5655
byte[] hash = MessageDigest.getInstance("MD5").digest(bytes);
5756
String base64Hash = Base64.getEncoder().encodeToString(hash);
58-
return request.toBuilder()
59-
.withReplacedHeader("Content-MD5", ListUtils.of(base64Hash))
60-
.build();
57+
var modifiable = request.toModifiable();
58+
modifiable.headers().setHeader("content-md5", base64Hash);
59+
return modifiable;
6160
} catch (NoSuchAlgorithmException e) {
6261
throw new IllegalStateException("Unable to fetch message digest instance for MD5", e);
6362
}

0 commit comments

Comments
 (0)