diff --git a/http/http-api/src/main/java/software/amazon/smithy/java/http/api/AbstractArrayHttpHeaders.java b/http/http-api/src/main/java/software/amazon/smithy/java/http/api/AbstractArrayHttpHeaders.java index 8ddbcd455d..0474c1e745 100644 --- a/http/http-api/src/main/java/software/amazon/smithy/java/http/api/AbstractArrayHttpHeaders.java +++ b/http/http-api/src/main/java/software/amazon/smithy/java/http/api/AbstractArrayHttpHeaders.java @@ -232,6 +232,13 @@ public void forEachEntry(BiConsumer consumer) { } } + @Override + public void forEachEntry(C contextValue, HeaderWithValueConsumer consumer) { + for (int i = 0; i < size * 2; i += 2) { + consumer.accept(contextValue, array[i], array[i + 1]); + } + } + /** * Create a new ArrayHttpHeaders by copying raw array data. */ diff --git a/http/http-api/src/main/java/software/amazon/smithy/java/http/api/ArrayHttpHeaders.java b/http/http-api/src/main/java/software/amazon/smithy/java/http/api/ArrayHttpHeaders.java index 0a67b275df..3960233618 100644 --- a/http/http-api/src/main/java/software/amazon/smithy/java/http/api/ArrayHttpHeaders.java +++ b/http/http-api/src/main/java/software/amazon/smithy/java/http/api/ArrayHttpHeaders.java @@ -34,7 +34,8 @@ final class ArrayHttpHeaders extends AbstractArrayHttpHeaders implements Modifia * @param key pre-interned header name (must be from HeaderNameRegistry) * @param value header value */ - void addHeaderCanonical(String key, String value) { + @Override + public void addHeaderCanonical(String key, String value) { ensureCapacity(); int idx = size * 2; array[idx] = key; @@ -44,9 +45,14 @@ void addHeaderCanonical(String key, String value) { @Override public void addHeaderTrusted(HeaderName name, String value) { + addHeaderTrusted(name.name(), value); + } + + @Override + public void addHeaderTrusted(String name, String value) { ensureCapacity(); int idx = size * 2; - array[idx] = name.name(); + array[idx] = name; array[idx + 1] = value; size++; } diff --git a/http/http-api/src/main/java/software/amazon/smithy/java/http/api/HeaderName.java b/http/http-api/src/main/java/software/amazon/smithy/java/http/api/HeaderName.java index 561996e88a..feed036f44 100644 --- a/http/http-api/src/main/java/software/amazon/smithy/java/http/api/HeaderName.java +++ b/http/http-api/src/main/java/software/amazon/smithy/java/http/api/HeaderName.java @@ -90,6 +90,11 @@ public final class HeaderName { public static final HeaderName AMZ_SDK_REQUEST = HeaderName.builtin("amz-sdk-request"); public static final HeaderName X_AMZN_REQUESTID = HeaderName.builtin("x-amzn-requestid"); public static final HeaderName X_AMZN_TRACE_ID = HeaderName.builtin("x-amzn-trace-id"); + public static final HeaderName X_AMZ_CHECKSUM_CRC32 = HeaderName.builtin("x-amz-checksum-crc32"); + public static final HeaderName X_AMZ_CHECKSUM_CRC32C = HeaderName.builtin("x-amz-checksum-crc32c"); + public static final HeaderName X_AMZ_CHECKSUM_CRC64NVME = HeaderName.builtin("x-amz-checksum-crc64nvme"); + public static final HeaderName X_AMZ_CHECKSUM_SHA1 = HeaderName.builtin("x-amz-checksum-sha1"); + public static final HeaderName X_AMZ_CHECKSUM_SHA256 = HeaderName.builtin("x-amz-checksum-sha256"); public static final HeaderName X_AMZ_CONTENT_SHA256 = HeaderName.builtin("x-amz-content-sha256"); public static final HeaderName X_AMZ_DATE = HeaderName.builtin("x-amz-date"); public static final HeaderName X_AMZ_REQUEST_ID = HeaderName.builtin("x-amz-request-id"); diff --git a/http/http-api/src/main/java/software/amazon/smithy/java/http/api/ModifiableHttpHeaders.java b/http/http-api/src/main/java/software/amazon/smithy/java/http/api/ModifiableHttpHeaders.java index ef41d730a1..48166b8cc7 100644 --- a/http/http-api/src/main/java/software/amazon/smithy/java/http/api/ModifiableHttpHeaders.java +++ b/http/http-api/src/main/java/software/amazon/smithy/java/http/api/ModifiableHttpHeaders.java @@ -68,6 +68,16 @@ default void addHeader(HeaderName name, List values) { addHeader(name.name(), values); } + /** + * Add a header with a pre-canonicalized name. + * + *

Use this when {@code name} is already canonical lowercase. The value is + * still normalized and validated. + */ + default void addHeaderCanonical(String name, String value) { + addHeader(name, value); + } + /** * Adds the given {@code headers}, similarly to if {@link #addHeader(String, List)} were to be called for each * entry in the given map. @@ -181,6 +191,17 @@ default void addHeaderTrusted(HeaderName name, String value) { addHeader(name, value); } + /** + * Add a header with a pre-canonicalized name and pre-validated value, bypassing + * name canonicalization and value normalization when supported. + * + *

Use this only when {@code name} is already canonical lowercase and + * {@code value} is known to be valid. + */ + default void addHeaderTrusted(String name, String value) { + addHeader(name, value); + } + /** * Remove a header and its values by name. *