Skip to content

Structural Refactoring of AwsChunkedEncodingInputStream to abstract AwsSignedChunkedEncodingInputStream #2780

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 24, 2021
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 @@ -23,11 +23,11 @@
import software.amazon.awssdk.auth.credentials.CredentialUtils;
import software.amazon.awssdk.auth.signer.AwsSignerExecutionAttribute;
import software.amazon.awssdk.auth.signer.S3SignerExecutionAttribute;
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsChunkedEncodingConfig;
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsChunkedEncodingInputStream;
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsSignedChunkedEncodingInputStream;
import software.amazon.awssdk.authcrt.signer.AwsCrtS3V4aSigner;
import software.amazon.awssdk.authcrt.signer.internal.chunkedencoding.AwsS3V4aChunkSigner;
import software.amazon.awssdk.core.interceptor.ExecutionAttributes;
import software.amazon.awssdk.core.internal.chunked.AwsChunkedEncodingConfig;
import software.amazon.awssdk.crt.auth.signing.AwsSigningConfig;
import software.amazon.awssdk.http.ContentStreamProvider;
import software.amazon.awssdk.http.SdkHttpFullRequest;
Expand Down Expand Up @@ -94,9 +94,9 @@ private void setHeaderContentLength(SdkHttpFullRequest.Builder mutableRequest) {
long originalContentLength = calculateRequestContentLength(mutableRequest);
mutableRequest.putHeader("x-amz-decoded-content-length", Long.toString(originalContentLength));
mutableRequest.putHeader(CONTENT_LENGTH, Long.toString(
AwsChunkedEncodingInputStream.calculateStreamContentLength(originalContentLength,
AwsS3V4aChunkSigner.getSignatureLength(),
AwsChunkedEncodingConfig.create())));
AwsSignedChunkedEncodingInputStream.calculateStreamContentLength(originalContentLength,
AwsS3V4aChunkSigner.getSignatureLength(),
AwsChunkedEncodingConfig.create())));
}

private SdkHttpFullRequest enablePayloadSigning(SdkSigningResult signingResult, AwsSigningConfig chunkConfig) {
Expand All @@ -105,11 +105,15 @@ private SdkHttpFullRequest enablePayloadSigning(SdkSigningResult signingResult,
SdkHttpFullRequest.Builder mutableSignedRequest = signedRequest.toBuilder();
ContentStreamProvider streamProvider = mutableSignedRequest.contentStreamProvider();
AwsS3V4aChunkSigner chunkSigner = new AwsS3V4aChunkSigner(signerAdapter, chunkConfig);

mutableSignedRequest.contentStreamProvider(
() -> new AwsChunkedEncodingInputStream(streamProvider.newStream(),
new String(signature, StandardCharsets.UTF_8),
chunkSigner,
AwsChunkedEncodingConfig.create()));
() -> AwsSignedChunkedEncodingInputStream.builder()
.inputStream(streamProvider.newStream())
.awsChunkSigner(chunkSigner)
.headerSignature(new String(signature, StandardCharsets.UTF_8))
.awsChunkedEncodingConfig(AwsChunkedEncodingConfig.create())
.build());

return mutableSignedRequest.build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,11 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
import software.amazon.awssdk.auth.signer.AwsSignerExecutionAttribute;
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsChunkedEncodingInputStream;
import software.amazon.awssdk.authcrt.signer.internal.DefaultAwsCrtV4aSigner;
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsSignedChunkedEncodingInputStream;
import software.amazon.awssdk.authcrt.signer.internal.SigningConfigProvider;
import software.amazon.awssdk.core.interceptor.ExecutionAttributes;
import software.amazon.awssdk.crt.auth.signing.AwsSigningConfig;
import software.amazon.awssdk.http.SdkHttpFullRequest;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.regions.internal.util.RegionScope;

/**
* Functional tests for the S3 specific Sigv4a signer. These tests call the CRT native signer code.
Expand Down Expand Up @@ -72,7 +68,7 @@ public void testS3ChunkedSigning() {

assertThat(signedRequest.firstMatchingHeader("Authorization")).isPresent();
assertThat(signedRequest.contentStreamProvider()).isPresent();
assertThat(signedRequest.contentStreamProvider().get().newStream()).isInstanceOf(AwsChunkedEncodingInputStream.class);
assertThat(signedRequest.contentStreamProvider().get().newStream()).isInstanceOf(AwsSignedChunkedEncodingInputStream.class);
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsChunkedEncodingConfig;
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsChunkedEncodingInputStream;
import software.amazon.awssdk.core.internal.chunked.AwsChunkedEncodingConfig;
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsSignedChunkedEncodingInputStream;
import software.amazon.awssdk.authcrt.signer.internal.chunkedencoding.AwsS3V4aChunkSigner;

/**
Expand Down Expand Up @@ -87,9 +87,9 @@ public class AwsChunkedEncodingInputStreamTest {
@Test
public void streamContentLength_smallObject_calculatedCorrectly() {
long streamContentLength =
AwsChunkedEncodingInputStream.calculateStreamContentLength(10,
AwsS3V4aChunkSigner.getSignatureLength(),
AwsChunkedEncodingConfig.create());
AwsSignedChunkedEncodingInputStream.calculateStreamContentLength(10,
AwsS3V4aChunkSigner.getSignatureLength(),
AwsChunkedEncodingConfig.create());
assertThat(streamContentLength).isEqualTo(342);
}

Expand All @@ -103,9 +103,9 @@ public void streamContentLength_smallObject_calculatedCorrectly() {
@Test
public void streamContentLength_largeObject_calculatedCorrectly() {
long streamContentLength =
AwsChunkedEncodingInputStream.calculateStreamContentLength(DEFAULT_CHUNK_SIZE + 10,
AwsS3V4aChunkSigner.getSignatureLength(),
AwsChunkedEncodingConfig.create());
AwsSignedChunkedEncodingInputStream.calculateStreamContentLength(DEFAULT_CHUNK_SIZE + 10,
AwsS3V4aChunkSigner.getSignatureLength(),
AwsChunkedEncodingConfig.create());
assertThat(streamContentLength).isEqualTo(131584);
}

Expand All @@ -115,17 +115,17 @@ public void streamContentLength_differentChunkSize_calculatedCorrectly() {

AwsChunkedEncodingConfig chunkConfig = AwsChunkedEncodingConfig.builder().chunkSize(chunkSize).build();
long streamContentLength =
AwsChunkedEncodingInputStream.calculateStreamContentLength(chunkSize + 10,
AwsS3V4aChunkSigner.getSignatureLength(),
chunkConfig);
AwsSignedChunkedEncodingInputStream.calculateStreamContentLength(chunkSize + 10,
AwsS3V4aChunkSigner.getSignatureLength(),
chunkConfig);
assertThat(streamContentLength).isEqualTo(66048);
}

@Test(expected = IllegalArgumentException.class)
public void streamContentLength_negative_throwsException() {
AwsChunkedEncodingInputStream.calculateStreamContentLength(-1,
AwsS3V4aChunkSigner.getSignatureLength(),
AwsChunkedEncodingConfig.create());
AwsSignedChunkedEncodingInputStream.calculateStreamContentLength(-1,
AwsS3V4aChunkSigner.getSignatureLength(),
AwsChunkedEncodingConfig.create());
}

@Test
Expand All @@ -136,10 +136,13 @@ public void chunkedEncodingStream_smallObject_createsCorrectChunks() throws IOEx
String chunkData = "helloworld";

ByteArrayInputStream input = new ByteArrayInputStream(chunkData.getBytes());
AwsChunkedEncodingInputStream stream = new AwsChunkedEncodingInputStream(input,
REQUEST_SIGNATURE,
chunkSigner,
AwsChunkedEncodingConfig.create());

AwsSignedChunkedEncodingInputStream stream = AwsSignedChunkedEncodingInputStream.builder()
.inputStream(input)
.headerSignature(REQUEST_SIGNATURE)
.awsChunkSigner(chunkSigner)
.awsChunkedEncodingConfig(AwsChunkedEncodingConfig.create())
.build();
int expectedChunks = 2;
consumeAndVerify(stream, expectedChunks);
Mockito.verify(chunkSigner, times(1)).signChunk(chunkData.getBytes(StandardCharsets.UTF_8), REQUEST_SIGNATURE);
Expand All @@ -155,10 +158,13 @@ public void chunkedEncodingStream_largeObject_createsCorrectChunks() throws IOEx
String chunk1Data = StringUtils.repeat("a", DEFAULT_CHUNK_SIZE);
String chunk2Data = "a";
ByteArrayInputStream input = new ByteArrayInputStream(chunk1Data.concat(chunk2Data).getBytes());
AwsChunkedEncodingInputStream stream = new AwsChunkedEncodingInputStream(input,
REQUEST_SIGNATURE,
chunkSigner,
AwsChunkedEncodingConfig.create());

AwsSignedChunkedEncodingInputStream stream = AwsSignedChunkedEncodingInputStream.builder()
.inputStream(input)
.headerSignature(REQUEST_SIGNATURE)
.awsChunkSigner(chunkSigner)
.awsChunkedEncodingConfig(AwsChunkedEncodingConfig.create())
.build();
int expectedChunks = 3;
consumeAndVerify(stream, expectedChunks);
Mockito.verify(chunkSigner, times(1)).signChunk(chunk1Data.getBytes(StandardCharsets.UTF_8), REQUEST_SIGNATURE);
Expand All @@ -177,10 +183,14 @@ public void chunkedEncodingStream_differentChunkSize_createsCorrectChunks() thro
String chunk1Data = StringUtils.repeat("a", chunkSize);
String chunk2Data = "a";
ByteArrayInputStream input = new ByteArrayInputStream(chunk1Data.concat(chunk2Data).getBytes());
AwsChunkedEncodingInputStream stream = new AwsChunkedEncodingInputStream(input,
REQUEST_SIGNATURE,
chunkSigner,
chunkConfig);


AwsSignedChunkedEncodingInputStream stream = AwsSignedChunkedEncodingInputStream.builder()
.inputStream(input)
.headerSignature(REQUEST_SIGNATURE)
.awsChunkSigner(chunkSigner)
.awsChunkedEncodingConfig(chunkConfig)
.build();
int expectedChunks = 3;
consumeAndVerify(stream, expectedChunks);
Mockito.verify(chunkSigner, times(1)).signChunk(chunk1Data.getBytes(StandardCharsets.UTF_8), REQUEST_SIGNATURE);
Expand All @@ -195,16 +205,19 @@ public void chunkedEncodingStream_emptyString_createsCorrectChunks() throws IOEx
String chunkData = EMPTY_STRING;

ByteArrayInputStream input = new ByteArrayInputStream(chunkData.getBytes());
AwsChunkedEncodingInputStream stream = new AwsChunkedEncodingInputStream(input,
REQUEST_SIGNATURE,
chunkSigner,
AwsChunkedEncodingConfig.create());

AwsSignedChunkedEncodingInputStream stream = AwsSignedChunkedEncodingInputStream.builder()
.inputStream(input)
.headerSignature(REQUEST_SIGNATURE)
.awsChunkSigner(chunkSigner)
.awsChunkedEncodingConfig(AwsChunkedEncodingConfig.create())
.build();
int expectedChunks = 1;
consumeAndVerify(stream, expectedChunks);
Mockito.verify(chunkSigner, times(1)).signChunk(chunkData.getBytes(StandardCharsets.UTF_8), REQUEST_SIGNATURE);
}

private void consumeAndVerify(AwsChunkedEncodingInputStream stream, int numChunks) throws IOException {
private void consumeAndVerify(AwsSignedChunkedEncodingInputStream stream, int numChunks) throws IOException {
ByteArrayOutputStream output = new ByteArrayOutputStream();
IOUtils.copy(stream, output);
String result = new String(output.toByteArray(), StandardCharsets.UTF_8);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsChunkedEncodingConfig;
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsChunkedEncodingInputStream;
import software.amazon.awssdk.core.internal.chunked.AwsChunkedEncodingConfig;
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsSignedChunkedEncodingInputStream;
import software.amazon.awssdk.authcrt.signer.SignerTestUtils;
import software.amazon.awssdk.authcrt.signer.SigningTestCase;
import software.amazon.awssdk.authcrt.signer.internal.chunkedencoding.AwsS3V4aChunkSigner;
Expand Down Expand Up @@ -68,7 +68,7 @@ public void sign_forChunkedHeader_works() {
SdkHttpFullRequest.Builder requestBuilder = testCase.requestBuilder;
long originalContentLength = calculateRequestContentLength(requestBuilder);
requestBuilder.putHeader("x-amz-decoded-content-length", Long.toString(originalContentLength));
requestBuilder.putHeader(CONTENT_LENGTH, Long.toString(AwsChunkedEncodingInputStream.calculateStreamContentLength(
requestBuilder.putHeader(CONTENT_LENGTH, Long.toString(AwsSignedChunkedEncodingInputStream.calculateStreamContentLength(
originalContentLength, AwsS3V4aChunkSigner.getSignatureLength(), AwsChunkedEncodingConfig.create())));
SdkHttpFullRequest request = requestBuilder.build();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@
import org.mockito.runners.MockitoJUnitRunner;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.signer.AwsSignerExecutionAttribute;
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsChunkedEncodingConfig;
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsChunkedEncodingInputStream;
import software.amazon.awssdk.core.internal.chunked.AwsChunkedEncodingConfig;
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsSignedChunkedEncodingInputStream;
import software.amazon.awssdk.authcrt.signer.internal.chunkedencoding.AwsS3V4aChunkSigner;
import software.amazon.awssdk.core.interceptor.ExecutionAttributes;
import software.amazon.awssdk.crt.auth.signing.AwsSigningConfig;
Expand Down Expand Up @@ -168,11 +168,15 @@ public void using_a_request_stream_creates_correct_signatures() throws Exception
AwsChunkedEncodingConfig chunkedEncodingConfig = AwsChunkedEncodingConfig.builder()
.chunkSize(STREAM_CHUNK_SIZE)
.build();
AwsChunkedEncodingInputStream stream =
new AwsChunkedEncodingInputStream(request.contentStreamProvider().get().newStream(),
new String(requestSignature, StandardCharsets.UTF_8),
chunkSigner,
chunkedEncodingConfig);

AwsSignedChunkedEncodingInputStream stream =

AwsSignedChunkedEncodingInputStream.builder()
.inputStream(request.contentStreamProvider().get().newStream())
.awsChunkSigner(chunkSigner)
.awsChunkedEncodingConfig(chunkedEncodingConfig)
.headerSignature(new String(requestSignature, StandardCharsets.UTF_8))
.build();

ByteArrayOutputStream output = new ByteArrayOutputStream();
IOUtils.copy(stream, output);
Expand Down
Loading