Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -128,12 +128,12 @@ private static HttpRequest parsePostRequest(
queryParameters.forEach(queryBuilder::add);
uriString += "?" + queryBuilder;
}
return HttpRequest.builder()
.method("POST")
.httpVersion(HttpVersion.HTTP_1_1)
.uri(SmithyUri.of(uriString))
.headers(httpHeaders)
.body(body != null ? DataStream.ofBytes(body.getBytes(StandardCharsets.UTF_8)) : null)
.build();
return HttpRequest.create()
.setMethod("POST")
.setHttpVersion(HttpVersion.HTTP_1_1)
.setUri(SmithyUri.of(uriString))
.setHeaders(httpHeaders)
.setBody(body != null ? DataStream.ofBytes(body.getBytes(StandardCharsets.UTF_8)) : null)
.toUnmodifiable();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import software.amazon.smithy.java.auth.api.Signer;
import software.amazon.smithy.java.aws.auth.api.identity.AwsCredentialsIdentity;
import software.amazon.smithy.java.context.Context;
import software.amazon.smithy.java.http.api.HeaderNames;
import software.amazon.smithy.java.http.api.HttpHeaders;
import software.amazon.smithy.java.http.api.HttpRequest;
import software.amazon.smithy.java.io.datastream.DataStream;
Expand All @@ -39,11 +40,11 @@ final class SigV4Signer implements Signer<HttpRequest, AwsCredentialsIdentity> {

private static final InternalLogger LOGGER = InternalLogger.getLogger(SigV4Signer.class);
private static final List<String> HEADERS_TO_IGNORE_IN_LOWER_CASE = List.of(
"connection",
"content-length",
"x-amzn-trace-id",
"user-agent",
"expect");
HeaderNames.CONNECTION,
HeaderNames.CONTENT_LENGTH,
HeaderNames.X_AMZN_TRACE_ID,
HeaderNames.USER_AGENT,
HeaderNames.EXPECT);

private static final String ALGORITHM = "AWS4-HMAC-SHA256";
private static final String TERMINATOR = "aws4_request";
Expand Down Expand Up @@ -91,8 +92,9 @@ public SignResult<HttpRequest> sign(HttpRequest request, AwsCredentialsIdentity
identity.sessionToken(),
!request.body().hasKnownLength());
var signedHeaders = signatureAndSignedHeaders.right;
return new SignResult<>(request.toBuilder().headers(HttpHeaders.of(signedHeaders)).build(),
signatureAndSignedHeaders.left);
var mod = request.toModifiable();
mod.setHeaders(signedHeaders);
return new SignResult<>(mod, signatureAndSignedHeaders.left);
}

private String getPayloadHash(DataStream dataStream) {
Expand Down Expand Up @@ -123,16 +125,16 @@ private Pair<String, Map<String, List<String>>> createSignedHeaders(

// AWS4 requires a number of headers to be set before signing including 'Host' and 'X-Amz-Date'
var hostHeader = uriUsingStandardPort(uri) ? uri.getHost() + ':' + uri.getPort() : uri.getHost();
headers.put("host", List.of(hostHeader));
headers.put(HeaderNames.HOST, List.of(hostHeader));

var sb = signingResources.sb;
var signingDate = signingTimestamp.atOffset(ZoneOffset.UTC).toLocalDateTime();
var dateStamp = formatDate(signingDate, sb);
var requestTime = formatRfc3339(signingDate, dateStamp, sb);
headers.put("x-amz-date", List.of(requestTime));
headers.put(HeaderNames.X_AMZ_DATE, List.of(requestTime));

if (sessionToken != null) {
headers.put("x-amz-security-token", List.of(sessionToken));
headers.put(HeaderNames.X_AMZ_SECURITY_TOKEN, List.of(sessionToken));
}

// Determine sorted list of headers to sign
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,13 +147,13 @@ private static HttpRequest parseRequest(String fileName) {
}
}

return HttpRequest.builder()
.method(method)
.httpVersion(HttpVersion.HTTP_1_1)
.uri(URI.create("http://" + Objects.requireNonNull(hostValue) + path))
.headers(HttpHeaders.of(headers))
.body(body != null ? DataStream.ofBytes(body.toString().getBytes()) : null)
.build();
return HttpRequest.create()
.setMethod(method)
.setHttpVersion(HttpVersion.HTTP_1_1)
.setUri(URI.create("http://" + Objects.requireNonNull(hostValue) + path))
.setHeaders(HttpHeaders.of(headers))
.setBody(body != null ? DataStream.ofBytes(body.toString().getBytes()) : null)
.toUnmodifiable();
}

Result createResult(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import software.amazon.smithy.java.core.serde.event.EventDecoderFactory;
import software.amazon.smithy.java.core.serde.event.EventEncoderFactory;
import software.amazon.smithy.java.core.serde.event.EventStreamingException;
import software.amazon.smithy.java.http.api.HeaderNames;
import software.amazon.smithy.java.http.api.HttpRequest;
import software.amazon.smithy.java.http.api.HttpResponse;
import software.amazon.smithy.java.io.datastream.DataStream;
Expand Down Expand Up @@ -78,22 +79,22 @@ public <I extends SerializableStruct, O extends SerializableStruct> HttpRequest
SmithyUri endpoint
) {
var target = service.getName() + "." + operation.schema().id().getName();
var builder = HttpRequest.builder();
builder.method("POST");
builder.uri(endpoint);
var builder = HttpRequest.create();
builder.setMethod("POST");
builder.setUri(endpoint);
if (operation.inputEventBuilderSupplier() != null) {
// Event streaming
var encoderFactory = getEventEncoderFactory(operation);
var body = RpcEventStreamsUtil.bodyForEventStreaming(encoderFactory, input);
builder.withAddedHeader("x-amz-target", target)
.withAddedHeader("content-type", "application/vnd.amazon.eventstream")
.withAddedHeader("accept", contentType())
.body(body);
builder.addHeader(HeaderNames.X_AMZ_TARGET, target)
.addHeader(HeaderNames.CONTENT_TYPE, "application/vnd.amazon.eventstream")
.addHeader(HeaderNames.ACCEPT, contentType())
.setBody(body);
} else {
builder.withAddedHeader("x-amz-target", target)
.withAddedHeader("content-type", contentType());
builder.addHeader(HeaderNames.X_AMZ_TARGET, target)
.addHeader(HeaderNames.CONTENT_TYPE, contentType());
}
return builder.body(DataStream.ofByteBuffer(codec.serialize(input), contentType())).build();
return builder.setBody(DataStream.ofByteBuffer(codec.serialize(input), contentType()));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,12 +80,11 @@ public <I extends SerializableStruct, O extends SerializableStruct> HttpRequest

ByteBuffer body = serializer.finish();

return HttpRequest.builder()
.method("POST")
.uri(endpoint)
.headers(CONTENT_TYPE_HEADERS)
.body(DataStream.ofByteBuffer(body, CONTENT_TYPE))
.build();
return HttpRequest.create()
.setMethod("POST")
.setUri(endpoint)
.setHeaders(CONTENT_TYPE_HEADERS)
.setBody(DataStream.ofByteBuffer(body, CONTENT_TYPE));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@

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

import java.util.List;
import software.amazon.smithy.java.client.core.CallContext;
import software.amazon.smithy.java.client.core.ClientConfig;
import software.amazon.smithy.java.client.core.ClientPlugin;
import software.amazon.smithy.java.client.core.interceptors.ClientInterceptor;
import software.amazon.smithy.java.client.core.interceptors.RequestHook;
import software.amazon.smithy.java.http.api.HeaderNames;
import software.amazon.smithy.java.http.api.HttpRequest;

/**
Expand Down Expand Up @@ -38,9 +38,8 @@ public <RequestT> RequestT modifyBeforeSigning(RequestHook<?, ?, RequestT> hook)
value.append("; max=").append(max);
}
return hook.asRequestType(
req.toBuilder()
.withReplacedHeader("amz-sdk-request", List.of(value.toString()))
.build());
req.toModifiable()
.setHeader(HeaderNames.AMZ_SDK_REQUEST, value.toString()));
}
}
return hook.request();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import software.amazon.smithy.java.client.core.ClientPlugin;
import software.amazon.smithy.java.client.core.interceptors.ClientInterceptor;
import software.amazon.smithy.java.client.core.interceptors.RequestHook;
import software.amazon.smithy.java.http.api.HeaderNames;
import software.amazon.smithy.java.http.api.HttpRequest;

/**
Expand Down Expand Up @@ -47,9 +48,9 @@ private record Interceptor(List<String> traceIdHeader) implements ClientIntercep
@Override
public <RequestT> RequestT modifyBeforeTransmit(RequestHook<?, ?, RequestT> hook) {
if (hook.request() instanceof HttpRequest req) {
if (!req.headers().hasHeader("x-amzn-trace-id")) {
if (!req.headers().hasHeader(HeaderNames.X_AMZN_TRACE_ID)) {
return hook.asRequestType(
req.toBuilder().withReplacedHeader("x-amzn-trace-id", traceIdHeader).build());
req.toModifiable().setHeader(HeaderNames.X_AMZN_TRACE_ID, traceIdHeader));
}
}
return hook.request();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,15 +74,15 @@ public Builder toBuilder() {
.build();

mockQueue.enqueue(
HttpResponse.builder()
.statusCode(429)
.body(DataStream.ofString("{\"__type\":\"InvalidSprocketId\"}"))
.build());
HttpResponse.create()
.setStatusCode(429)
.setBody(DataStream.ofString("{\"__type\":\"InvalidSprocketId\"}"))
.toUnmodifiable());
mockQueue.enqueue(
HttpResponse.builder()
.statusCode(200)
.body(DataStream.ofString("{\"id\":\"1\"}"))
.build());
HttpResponse.create()
.setStatusCode(200)
.setBody(DataStream.ofString("{\"id\":\"1\"}"))
.toUnmodifiable());

client.call("CreateSprocket");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.empty;

import java.util.List;
import org.junit.jupiter.api.Test;
import software.amazon.smithy.java.aws.client.awsjson.AwsJson1Protocol;
import software.amazon.smithy.java.client.core.ClientPlugin;
Expand Down Expand Up @@ -49,7 +48,10 @@ private HttpHeaders getSentHeaders(ClientPlugin recursionDetectionPlugin) {

private HttpHeaders getSentHeaders(ClientPlugin recursionDetectionPlugin, ClientInterceptor interceptor) {
var mockQueue = new MockQueue();
mockQueue.enqueue(HttpResponse.builder().statusCode(200).body(DataStream.ofString("{\"id\":\"1\"}")).build());
mockQueue.enqueue(HttpResponse.create()
.setStatusCode(200)
.setBody(DataStream.ofString("{\"id\":\"1\"}"))
.toUnmodifiable());
var mock = MockPlugin.builder().addQueue(mockQueue).build();

var builder = DynamicClient.builder()
Expand Down Expand Up @@ -80,7 +82,7 @@ public void doesNotReplaceExistingValue() {
public <RequestT> RequestT modifyBeforeSigning(RequestHook<?, ?, RequestT> hook) {
if (hook.request() instanceof HttpRequest req) {
return hook.asRequestType(
req.toBuilder().withReplacedHeader("x-amzn-trace-id", List.of("hi")).build());
req.toModifiableCopy().setHeader("x-amzn-trace-id", "hi"));
}
return hook.request();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,12 +138,11 @@ public CompletableFuture<Void> deserializeInput(Job job) {
.inputShapeBuilder(inputShapeBuilder)
.pathLabelValues(labelValues)
.request(
HttpRequest.builder()
.headers(headers)
.uri(httpJob.request().uri())
.method(httpJob.request().method())
.body(job.request().getDataStream())
.build())
HttpRequest.create()
.setHeaders(headers)
.setUri(httpJob.request().uri())
.setMethod(httpJob.request().method())
.setBody(job.request().getDataStream()))
.payloadCodec(codec)
.payloadMediaType("application/json");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public RequestHook<I, O, RequestT> withRequest(RequestT request) {
* <p>This is useful when modifying the request using {@code instanceof} pattern matching:
* {@snippet :
* if (hook.request() instanceof HttpRequest req) {
* return hook.asRequestType(req.toBuilder().withAddedHeader("X-Foo", "Bar").build());
* return hook.asRequestType(req.toModifiableCopy().addHeader("X-Foo", "Bar"));
* }
* return hook.request();
* }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,15 +137,15 @@ public void canRetryRequests() {

var mockQueue = new MockQueue()
.enqueue(
HttpResponse.builder()
.statusCode(429)
.body(DataStream.ofString("{\"__type\":\"InvalidSprocketId\"}"))
.build())
HttpResponse.create()
.setStatusCode(429)
.setBody(DataStream.ofString("{\"__type\":\"InvalidSprocketId\"}"))
.toUnmodifiable())
.enqueue(
HttpResponse.builder()
.statusCode(200)
.body(DataStream.ofString("{\"id\":\"1\"}"))
.build());
HttpResponse.create()
.setStatusCode(200)
.setBody(DataStream.ofString("{\"id\":\"1\"}"))
.toUnmodifiable());
var mock = MockPlugin.builder().addQueue(mockQueue).build();

var client = DynamicClient.builder()
Expand Down Expand Up @@ -228,10 +228,10 @@ public void endpointAuthSchemeOverridesAugmentSignerProperties() {
.build();

var mockQueue = new MockQueue()
.enqueue(HttpResponse.builder()
.statusCode(200)
.body(DataStream.ofString("{\"id\":\"1\"}"))
.build());
.enqueue(HttpResponse.create()
.setStatusCode(200)
.setBody(DataStream.ofString("{\"id\":\"1\"}"))
.toUnmodifiable());
var mock = MockPlugin.builder().addQueue(mockQueue).build();

var client = DynamicClient.builder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ public void correctlyWrapsTransportExceptions() throws URISyntaxException {
@Test
public void allowsInterceptorRequestOverrides() throws URISyntaxException {
var queue = new MockQueue();
queue.enqueue(HttpResponse.builder().statusCode(200).build());
queue.enqueue(HttpResponse.create().setStatusCode(200).toUnmodifiable());
var id = "abc";

DynamicClient c = DynamicClient.builder()
Expand Down Expand Up @@ -239,7 +239,7 @@ public void readBeforeExecution(InputHook<?, ?> hook) {
@Test
public void requestOverridesPerCallTakePrecedence() throws URISyntaxException {
var queue = new MockQueue();
queue.enqueue(HttpResponse.builder().statusCode(200).build());
queue.enqueue(HttpResponse.create().setStatusCode(200).toUnmodifiable());
var id = "abc";

DynamicClient c = DynamicClient.builder()
Expand Down Expand Up @@ -281,7 +281,7 @@ public void readBeforeExecution(InputHook<?, ?> hook) {
@Test
public void setsCustomEndpoint() {
var queue = new MockQueue();
queue.enqueue(HttpResponse.builder().statusCode(200).build());
queue.enqueue(HttpResponse.create().setStatusCode(200).toUnmodifiable());

DynamicClient c = DynamicClient.builder()
.model(MODEL)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,11 +82,11 @@ private String callAndGetToken(String operation, Document input) {
var mock = MockPlugin.builder()
.addMatcher(
request -> new MockedResult.Response(
HttpResponse.builder()
.statusCode(200)
.headers(HttpHeaders.of(Map.of("content-type", List.of("application/json"))))
.body(DataStream.ofString("{}"))
.build()))
HttpResponse.create()
.setStatusCode(200)
.setHeaders(HttpHeaders.of(Map.of("content-type", List.of("application/json"))))
.setBody(DataStream.ofString("{}"))
.toUnmodifiable()))
.build();

var client = DynamicClient.builder()
Expand Down
Loading
Loading