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 @@ -24,7 +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.HeaderName;
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 @@ -40,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(
HeaderNames.CONNECTION,
HeaderNames.CONTENT_LENGTH,
HeaderNames.X_AMZN_TRACE_ID,
HeaderNames.USER_AGENT,
HeaderNames.EXPECT);
HeaderName.CONNECTION.name(),
HeaderName.CONTENT_LENGTH.name(),
HeaderName.X_AMZN_TRACE_ID.name(),
HeaderName.USER_AGENT.name(),
HeaderName.EXPECT.name());

private static final String ALGORITHM = "AWS4-HMAC-SHA256";
private static final String TERMINATOR = "aws4_request";
Expand Down Expand Up @@ -125,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(HeaderNames.HOST, List.of(hostHeader));
headers.put(HeaderName.HOST.name(), 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(HeaderNames.X_AMZ_DATE, List.of(requestTime));
headers.put(HeaderName.X_AMZ_DATE.name(), List.of(requestTime));

if (sessionToken != null) {
headers.put(HeaderNames.X_AMZ_SECURITY_TOKEN, List.of(sessionToken));
headers.put(HeaderName.X_AMZ_SECURITY_TOKEN.name(), List.of(sessionToken));
}

// Determine sorted list of headers to sign
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +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.HeaderName;
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 @@ -86,13 +86,13 @@ public <I extends SerializableStruct, O extends SerializableStruct> HttpRequest
// Event streaming
var encoderFactory = getEventEncoderFactory(operation);
var body = RpcEventStreamsUtil.bodyForEventStreaming(encoderFactory, input);
builder.addHeader(HeaderNames.X_AMZ_TARGET, target)
.addHeader(HeaderNames.CONTENT_TYPE, "application/vnd.amazon.eventstream")
.addHeader(HeaderNames.ACCEPT, contentType())
builder.addHeader(HeaderName.X_AMZ_TARGET, target)
.addHeader(HeaderName.CONTENT_TYPE, "application/vnd.amazon.eventstream")
.addHeader(HeaderName.ACCEPT, contentType())
.setBody(body);
} else {
builder.addHeader(HeaderNames.X_AMZ_TARGET, target)
.addHeader(HeaderNames.CONTENT_TYPE, contentType());
builder.addHeader(HeaderName.X_AMZ_TARGET, target)
.addHeader(HeaderName.CONTENT_TYPE, contentType());
}
return builder.setBody(DataStream.ofByteBuffer(codec.serialize(input), contentType()));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

import java.nio.ByteBuffer;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import software.amazon.smithy.aws.traits.protocols.AwsQueryErrorTrait;
import software.amazon.smithy.aws.traits.protocols.AwsQueryTrait;
Expand All @@ -27,7 +26,7 @@
import software.amazon.smithy.java.core.serde.Codec;
import software.amazon.smithy.java.core.serde.TypeRegistry;
import software.amazon.smithy.java.core.serde.document.Document;
import software.amazon.smithy.java.http.api.HttpHeaders;
import software.amazon.smithy.java.http.api.HeaderName;
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 All @@ -39,8 +38,6 @@
public final class AwsQueryClientProtocol extends HttpClientProtocol {

private static final String CONTENT_TYPE = "application/x-www-form-urlencoded";
private static final List<String> CONTENT_TYPE_LIST = List.of(CONTENT_TYPE);
public static final HttpHeaders CONTENT_TYPE_HEADERS = HttpHeaders.of(Map.of("Content-Type", CONTENT_TYPE_LIST));

private final ShapeId service;
private final String version;
Expand Down Expand Up @@ -83,7 +80,7 @@ public <I extends SerializableStruct, O extends SerializableStruct> HttpRequest
return HttpRequest.create()
.setMethod("POST")
.setUri(endpoint)
.setHeaders(CONTENT_TYPE_HEADERS)
.setHeader(HeaderName.CONTENT_TYPE, CONTENT_TYPE)
.setBody(DataStream.ofByteBuffer(body, CONTENT_TYPE));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +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.HeaderName;
import software.amazon.smithy.java.http.api.HttpRequest;

/**
Expand Down Expand Up @@ -39,7 +39,7 @@ public <RequestT> RequestT modifyBeforeSigning(RequestHook<?, ?, RequestT> hook)
}
return hook.asRequestType(
req.toModifiable()
.setHeader(HeaderNames.AMZ_SDK_REQUEST, value.toString()));
.setHeader(HeaderName.AMZ_SDK_REQUEST, value.toString()));
}
}
return hook.request();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +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.HeaderName;
import software.amazon.smithy.java.http.api.HttpRequest;

/**
Expand Down Expand Up @@ -48,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(HeaderNames.X_AMZN_TRACE_ID)) {
if (!req.headers().hasHeader(HeaderName.X_AMZN_TRACE_ID)) {
return hook.asRequestType(
req.toModifiable().setHeader(HeaderNames.X_AMZN_TRACE_ID, traceIdHeader));
req.toModifiable().setHeader(HeaderName.X_AMZN_TRACE_ID, traceIdHeader));
}
}
return hook.request();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
import software.amazon.smithy.java.client.core.error.ConnectTimeoutException;
import software.amazon.smithy.java.context.Context;
import software.amazon.smithy.java.core.serde.document.Document;
import software.amazon.smithy.java.http.api.HeaderNames;
import software.amazon.smithy.java.http.api.HeaderName;
import software.amazon.smithy.java.http.api.HttpHeaders;
import software.amazon.smithy.java.http.api.HttpRequest;
import software.amazon.smithy.java.http.api.HttpResponse;
Expand Down Expand Up @@ -149,7 +149,7 @@ private java.net.http.HttpRequest createJavaRequest(Context context, HttpRequest
// Any explicitly set headers overwrite existing headers, they do not merge.
request.headers().forEachEntry(httpRequestBuilder, (b, name, value) -> {
// Skip restricted headers; Header names in HttpHeaders are always canonicalized, so check by reference.
if (name != HeaderNames.CONTENT_LENGTH) {
if (name != HeaderName.CONTENT_LENGTH.name()) {
b.setHeader(name, value);
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import software.amazon.smithy.java.auth.api.Signer;
import software.amazon.smithy.java.auth.api.identity.LoginIdentity;
import software.amazon.smithy.java.context.Context;
import software.amazon.smithy.java.http.api.HeaderNames;
import software.amazon.smithy.java.http.api.HeaderName;
import software.amazon.smithy.java.http.api.HttpRequest;
import software.amazon.smithy.java.logging.InternalLogger;

Expand All @@ -27,9 +27,9 @@ public SignResult<HttpRequest> sign(HttpRequest request, LoginIdentity identity,
var identityString = identity.username() + ":" + identity.password();
var base64Value = Base64.getEncoder().encodeToString(identityString.getBytes(StandardCharsets.UTF_8));
var mod = request.toModifiable();
if (mod.headers().hasHeader(HeaderNames.AUTHORIZATION)) {
if (mod.headers().hasHeader(HeaderName.AUTHORIZATION)) {
LOGGER.debug("Replaced existing Authorization header value.");
}
return new SignResult<>(mod.setHeader(HeaderNames.AUTHORIZATION, SCHEME + " " + base64Value));
return new SignResult<>(mod.setHeader(HeaderName.AUTHORIZATION, SCHEME + " " + base64Value));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import software.amazon.smithy.java.auth.api.Signer;
import software.amazon.smithy.java.auth.api.identity.TokenIdentity;
import software.amazon.smithy.java.context.Context;
import software.amazon.smithy.java.http.api.HeaderNames;
import software.amazon.smithy.java.http.api.HeaderName;
import software.amazon.smithy.java.http.api.HttpRequest;
import software.amazon.smithy.java.logging.InternalLogger;

Expand All @@ -23,9 +23,9 @@ private HttpBearerAuthSigner() {}
@Override
public SignResult<HttpRequest> sign(HttpRequest request, TokenIdentity identity, Context properties) {
var mod = request.toModifiable();
if (mod.headers().hasHeader(HeaderNames.AUTHORIZATION)) {
if (mod.headers().hasHeader(HeaderName.AUTHORIZATION)) {
LOGGER.debug("Replaced existing Authorization header value.");
}
return new SignResult<>(mod.setHeader(HeaderNames.AUTHORIZATION, SCHEME + " " + identity.token()));
return new SignResult<>(mod.setHeader(HeaderName.AUTHORIZATION, SCHEME + " " + identity.token()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import software.amazon.smithy.java.context.Context;
import software.amazon.smithy.java.core.error.CallException;
import software.amazon.smithy.java.core.schema.SerializableStruct;
import software.amazon.smithy.java.http.api.HeaderName;
import software.amazon.smithy.java.http.api.HttpResponse;
import software.amazon.smithy.java.retries.api.RetrySafety;
import software.amazon.smithy.utils.SmithyInternalApi;
Expand Down Expand Up @@ -86,7 +87,7 @@ private static boolean applyThrottlingStatusCodes(HttpResponse response, CallExc

// If there's a retry-after header, then the server is telling us it's retryable.
private static boolean applyRetryAfterHeader(HttpResponse response, CallException exception, Context context) {
var retryAfter = response.headers().firstValue("retry-after");
var retryAfter = response.headers().firstValue(HeaderName.RETRY_AFTER);
if (retryAfter != null) {
exception.isThrottle(true);
exception.isRetrySafe(RetrySafety.YES);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
import software.amazon.smithy.java.client.core.interceptors.RequestHook;
import software.amazon.smithy.java.client.http.HttpMessageExchange;
import software.amazon.smithy.java.core.schema.TraitKey;
import software.amazon.smithy.java.http.api.HeaderNames;
import software.amazon.smithy.java.http.api.HeaderName;
import software.amazon.smithy.java.http.api.HttpRequest;
import software.amazon.smithy.java.io.ByteBufferUtils;
import software.amazon.smithy.model.traits.HttpChecksumRequiredTrait;
Expand Down Expand Up @@ -56,7 +56,7 @@ static HttpRequest addContentMd5Header(HttpRequest request) {
byte[] hash = MessageDigest.getInstance("MD5").digest(bytes);
String base64Hash = Base64.getEncoder().encodeToString(hash);
var modifiable = request.toModifiable();
modifiable.headers().setHeader(HeaderNames.CONTENT_MD5, base64Hash);
modifiable.headers().setHeader(HeaderName.CONTENT_MD5, base64Hash);
return modifiable;
} catch (NoSuchAlgorithmException e) {
throw new IllegalStateException("Unable to fetch message digest instance for MD5", e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
import software.amazon.smithy.java.client.http.compression.CompressionAlgorithm;
import software.amazon.smithy.java.context.Context;
import software.amazon.smithy.java.core.schema.TraitKey;
import software.amazon.smithy.java.http.api.HeaderNames;
import software.amazon.smithy.java.http.api.HeaderName;
import software.amazon.smithy.java.http.api.HttpRequest;
import software.amazon.smithy.java.io.datastream.DataStream;
import software.amazon.smithy.model.traits.RequestCompressionTrait;
Expand Down Expand Up @@ -58,7 +58,7 @@ public <RequestT> RequestT modifyBeforeRetryLoop(RequestHook<?, ?, RequestT> hoo
return hook.asRequestType(
req.toModifiable()
.setBody(compressed)
.addHeader(HeaderNames.CONTENT_ENCODING, algorithmId));
.addHeader(HeaderName.CONTENT_ENCODING, algorithmId));
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import software.amazon.smithy.java.client.http.HttpMessageExchange;
import software.amazon.smithy.java.context.Context;
import software.amazon.smithy.java.core.Version;
import software.amazon.smithy.java.http.api.HeaderName;
import software.amazon.smithy.java.http.api.HttpRequest;
import software.amazon.smithy.utils.SmithyInternalApi;

Expand Down Expand Up @@ -76,9 +77,9 @@ static final class UserAgentInterceptor implements ClientInterceptor {

@Override
public <RequestT> RequestT modifyBeforeSigning(RequestHook<?, ?, RequestT> hook) {
if (hook.request() instanceof HttpRequest req && !req.headers().hasHeader("user-agent")) {
if (hook.request() instanceof HttpRequest req && !req.headers().hasHeader(HeaderName.USER_AGENT)) {
var updated = req.toModifiable();
updated.headers().setHeader("user-agent", createUa(hook.context()));
updated.headers().setHeader(HeaderName.USER_AGENT, createUa(hook.context()));
return hook.asRequestType(updated);
}
return hook.request();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@

package software.amazon.smithy.java.client.rpcv2;

import java.util.List;
import java.util.Map;
import java.util.Objects;
import software.amazon.smithy.java.aws.events.AwsEventDecoderFactory;
import software.amazon.smithy.java.aws.events.AwsEventEncoderFactory;
Expand All @@ -30,8 +28,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.HttpHeaders;
import software.amazon.smithy.java.http.api.HeaderName;
import software.amazon.smithy.java.http.api.HttpRequest;
import software.amazon.smithy.java.http.api.HttpResponse;
import software.amazon.smithy.java.http.api.HttpVersion;
Expand All @@ -47,8 +44,6 @@
public final class RpcV2CborProtocol extends HttpClientProtocol {
private static final Codec CBOR_CODEC = Rpcv2CborCodec.builder().build();
private static final String PAYLOAD_MEDIA_TYPE = "application/cbor";
private static final List<String> CONTENT_TYPE = List.of(PAYLOAD_MEDIA_TYPE);
private static final List<String> SMITHY_PROTOCOL = List.of("rpc-v2-cbor");

private final ShapeId service;
private final HttpErrorDeserializer errorDeserializer;
Expand Down Expand Up @@ -81,17 +76,22 @@ public <I extends SerializableStruct, O extends SerializableStruct> HttpRequest
builder.setHttpVersion(HttpVersion.HTTP_2);
if (operation.inputSchema().hasTrait(TraitKey.UNIT_TYPE_TRAIT)) {
// Top-level Unit types do not get serialized
builder.setHeaders(HttpHeaders.of(headersForEmptyBody()))
builder.addHeader(HeaderName.SMITHY_PROTOCOL, "rpc-v2-cbor")
.addHeader(HeaderName.ACCEPT, PAYLOAD_MEDIA_TYPE)
.setBody(DataStream.ofEmpty());
} else if (operation.inputEventBuilderSupplier() != null) {
// Event streaming
var encoderFactory = getEventEncoderFactory(operation);
var body = RpcEventStreamsUtil.bodyForEventStreaming(encoderFactory, input);
builder.setHeaders(HttpHeaders.of(headersForEventStreaming()))
builder.addHeader(HeaderName.SMITHY_PROTOCOL, "rpc-v2-cbor")
.addHeader(HeaderName.CONTENT_TYPE, "application/vnd.amazon.eventstream")
.addHeader(HeaderName.ACCEPT, PAYLOAD_MEDIA_TYPE)
.setBody(body);
} else {
// Regular request
builder.setHeaders(HttpHeaders.of(headers()))
builder.addHeader(HeaderName.SMITHY_PROTOCOL, "rpc-v2-cbor")
.addHeader(HeaderName.CONTENT_TYPE, PAYLOAD_MEDIA_TYPE)
.addHeader(HeaderName.ACCEPT, PAYLOAD_MEDIA_TYPE)
.setBody(getBody(input));
}
return builder.toUnmodifiable();
Expand Down Expand Up @@ -138,28 +138,6 @@ private DataStream getBody(SerializableStruct input) {
return DataStream.ofByteBuffer(sink.toByteBuffer(), PAYLOAD_MEDIA_TYPE);
}

private Map<String, List<String>> headers() {
return Map.of(HeaderNames.SMITHY_PROTOCOL,
SMITHY_PROTOCOL,
HeaderNames.CONTENT_TYPE,
CONTENT_TYPE,
HeaderNames.ACCEPT,
CONTENT_TYPE);
}

private Map<String, List<String>> headersForEmptyBody() {
return Map.of(HeaderNames.SMITHY_PROTOCOL, SMITHY_PROTOCOL, HeaderNames.ACCEPT, CONTENT_TYPE);
}

private Map<String, List<String>> headersForEventStreaming() {
return Map.of(HeaderNames.SMITHY_PROTOCOL,
SMITHY_PROTOCOL,
HeaderNames.CONTENT_TYPE,
List.of("application/vnd.amazon.eventstream"),
HeaderNames.ACCEPT,
CONTENT_TYPE);
}

private EventEncoderFactory<AwsEventFrame> getEventEncoderFactory(ApiOperation<?, ?> operation) {
return AwsEventEncoderFactory.forInputStream(operation,
payloadCodec(),
Expand Down
4 changes: 2 additions & 2 deletions config/spotbugs/filter.xml
Original file line number Diff line number Diff line change
Expand Up @@ -102,12 +102,12 @@

<!-- Intentional pointer comparison (==) for interned header names. -->
<Match>
<Class name="~software\.amazon\.smithy\.java\.http\.api\.(.*HttpHeaders|HeaderNames)" />
<Class name="~software\.amazon\.smithy\.java\.http\.api\.(.*HttpHeaders|HeaderName)" />
<Bug pattern="ES_COMPARING_STRINGS_WITH_EQ" />
</Match>

<Match>
<Class name="software.amazon.smithy.java.http.api.HeaderNames" />
<Class name="~software\.amazon\.smithy\.java\.http\.api\.(HeaderName|ArrayHttpHeaders)" />
<Bug pattern="ES_COMPARING_PARAMETER_STRING_WITH_EQ" />
</Match>

Expand Down
Loading
Loading