Skip to content

Commit df41964

Browse files
authored
Structural Refactoring of AwsChunkedEncodingInputStream to abstract out chunk encoding to core librarry. (#2780)
1 parent 1ab8130 commit df41964

File tree

15 files changed

+493
-203
lines changed

15 files changed

+493
-203
lines changed

core/auth-crt/src/main/java/software/amazon/awssdk/authcrt/signer/internal/DefaultAwsCrtS3V4aSigner.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@
2323
import software.amazon.awssdk.auth.credentials.CredentialUtils;
2424
import software.amazon.awssdk.auth.signer.AwsSignerExecutionAttribute;
2525
import software.amazon.awssdk.auth.signer.S3SignerExecutionAttribute;
26-
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsChunkedEncodingConfig;
27-
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsChunkedEncodingInputStream;
26+
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsSignedChunkedEncodingInputStream;
2827
import software.amazon.awssdk.authcrt.signer.AwsCrtS3V4aSigner;
2928
import software.amazon.awssdk.authcrt.signer.internal.chunkedencoding.AwsS3V4aChunkSigner;
3029
import software.amazon.awssdk.core.interceptor.ExecutionAttributes;
30+
import software.amazon.awssdk.core.internal.chunked.AwsChunkedEncodingConfig;
3131
import software.amazon.awssdk.crt.auth.signing.AwsSigningConfig;
3232
import software.amazon.awssdk.http.ContentStreamProvider;
3333
import software.amazon.awssdk.http.SdkHttpFullRequest;
@@ -94,9 +94,9 @@ private void setHeaderContentLength(SdkHttpFullRequest.Builder mutableRequest) {
9494
long originalContentLength = calculateRequestContentLength(mutableRequest);
9595
mutableRequest.putHeader("x-amz-decoded-content-length", Long.toString(originalContentLength));
9696
mutableRequest.putHeader(CONTENT_LENGTH, Long.toString(
97-
AwsChunkedEncodingInputStream.calculateStreamContentLength(originalContentLength,
98-
AwsS3V4aChunkSigner.getSignatureLength(),
99-
AwsChunkedEncodingConfig.create())));
97+
AwsSignedChunkedEncodingInputStream.calculateStreamContentLength(originalContentLength,
98+
AwsS3V4aChunkSigner.getSignatureLength(),
99+
AwsChunkedEncodingConfig.create())));
100100
}
101101

102102
private SdkHttpFullRequest enablePayloadSigning(SdkSigningResult signingResult, AwsSigningConfig chunkConfig) {
@@ -105,11 +105,15 @@ private SdkHttpFullRequest enablePayloadSigning(SdkSigningResult signingResult,
105105
SdkHttpFullRequest.Builder mutableSignedRequest = signedRequest.toBuilder();
106106
ContentStreamProvider streamProvider = mutableSignedRequest.contentStreamProvider();
107107
AwsS3V4aChunkSigner chunkSigner = new AwsS3V4aChunkSigner(signerAdapter, chunkConfig);
108+
108109
mutableSignedRequest.contentStreamProvider(
109-
() -> new AwsChunkedEncodingInputStream(streamProvider.newStream(),
110-
new String(signature, StandardCharsets.UTF_8),
111-
chunkSigner,
112-
AwsChunkedEncodingConfig.create()));
110+
() -> AwsSignedChunkedEncodingInputStream.builder()
111+
.inputStream(streamProvider.newStream())
112+
.awsChunkSigner(chunkSigner)
113+
.headerSignature(new String(signature, StandardCharsets.UTF_8))
114+
.awsChunkedEncodingConfig(AwsChunkedEncodingConfig.create())
115+
.build());
116+
113117
return mutableSignedRequest.build();
114118
}
115119

core/auth-crt/src/test/java/software/amazon/awssdk/authcrt/signer/AwsCrtS3V4aSignerTest.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,11 @@
2424
import org.junit.Test;
2525
import org.junit.runner.RunWith;
2626
import org.mockito.runners.MockitoJUnitRunner;
27-
import software.amazon.awssdk.auth.signer.AwsSignerExecutionAttribute;
28-
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsChunkedEncodingInputStream;
29-
import software.amazon.awssdk.authcrt.signer.internal.DefaultAwsCrtV4aSigner;
27+
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsSignedChunkedEncodingInputStream;
3028
import software.amazon.awssdk.authcrt.signer.internal.SigningConfigProvider;
3129
import software.amazon.awssdk.core.interceptor.ExecutionAttributes;
32-
import software.amazon.awssdk.crt.auth.signing.AwsSigningConfig;
3330
import software.amazon.awssdk.http.SdkHttpFullRequest;
3431
import software.amazon.awssdk.regions.Region;
35-
import software.amazon.awssdk.regions.internal.util.RegionScope;
3632

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

7369
assertThat(signedRequest.firstMatchingHeader("Authorization")).isPresent();
7470
assertThat(signedRequest.contentStreamProvider()).isPresent();
75-
assertThat(signedRequest.contentStreamProvider().get().newStream()).isInstanceOf(AwsChunkedEncodingInputStream.class);
71+
assertThat(signedRequest.contentStreamProvider().get().newStream()).isInstanceOf(AwsSignedChunkedEncodingInputStream.class);
7672
}
7773

7874
@Test

core/auth-crt/src/test/java/software/amazon/awssdk/authcrt/signer/internal/AwsChunkedEncodingInputStreamTest.java

Lines changed: 44 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@
3535
import org.mockito.Mock;
3636
import org.mockito.Mockito;
3737
import org.mockito.runners.MockitoJUnitRunner;
38-
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsChunkedEncodingConfig;
39-
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsChunkedEncodingInputStream;
38+
import software.amazon.awssdk.core.internal.chunked.AwsChunkedEncodingConfig;
39+
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsSignedChunkedEncodingInputStream;
4040
import software.amazon.awssdk.authcrt.signer.internal.chunkedencoding.AwsS3V4aChunkSigner;
4141

4242
/**
@@ -87,9 +87,9 @@ public class AwsChunkedEncodingInputStreamTest {
8787
@Test
8888
public void streamContentLength_smallObject_calculatedCorrectly() {
8989
long streamContentLength =
90-
AwsChunkedEncodingInputStream.calculateStreamContentLength(10,
91-
AwsS3V4aChunkSigner.getSignatureLength(),
92-
AwsChunkedEncodingConfig.create());
90+
AwsSignedChunkedEncodingInputStream.calculateStreamContentLength(10,
91+
AwsS3V4aChunkSigner.getSignatureLength(),
92+
AwsChunkedEncodingConfig.create());
9393
assertThat(streamContentLength).isEqualTo(342);
9494
}
9595

@@ -103,9 +103,9 @@ public void streamContentLength_smallObject_calculatedCorrectly() {
103103
@Test
104104
public void streamContentLength_largeObject_calculatedCorrectly() {
105105
long streamContentLength =
106-
AwsChunkedEncodingInputStream.calculateStreamContentLength(DEFAULT_CHUNK_SIZE + 10,
107-
AwsS3V4aChunkSigner.getSignatureLength(),
108-
AwsChunkedEncodingConfig.create());
106+
AwsSignedChunkedEncodingInputStream.calculateStreamContentLength(DEFAULT_CHUNK_SIZE + 10,
107+
AwsS3V4aChunkSigner.getSignatureLength(),
108+
AwsChunkedEncodingConfig.create());
109109
assertThat(streamContentLength).isEqualTo(131584);
110110
}
111111

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

116116
AwsChunkedEncodingConfig chunkConfig = AwsChunkedEncodingConfig.builder().chunkSize(chunkSize).build();
117117
long streamContentLength =
118-
AwsChunkedEncodingInputStream.calculateStreamContentLength(chunkSize + 10,
119-
AwsS3V4aChunkSigner.getSignatureLength(),
120-
chunkConfig);
118+
AwsSignedChunkedEncodingInputStream.calculateStreamContentLength(chunkSize + 10,
119+
AwsS3V4aChunkSigner.getSignatureLength(),
120+
chunkConfig);
121121
assertThat(streamContentLength).isEqualTo(66048);
122122
}
123123

124124
@Test(expected = IllegalArgumentException.class)
125125
public void streamContentLength_negative_throwsException() {
126-
AwsChunkedEncodingInputStream.calculateStreamContentLength(-1,
127-
AwsS3V4aChunkSigner.getSignatureLength(),
128-
AwsChunkedEncodingConfig.create());
126+
AwsSignedChunkedEncodingInputStream.calculateStreamContentLength(-1,
127+
AwsS3V4aChunkSigner.getSignatureLength(),
128+
AwsChunkedEncodingConfig.create());
129129
}
130130

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

138138
ByteArrayInputStream input = new ByteArrayInputStream(chunkData.getBytes());
139-
AwsChunkedEncodingInputStream stream = new AwsChunkedEncodingInputStream(input,
140-
REQUEST_SIGNATURE,
141-
chunkSigner,
142-
AwsChunkedEncodingConfig.create());
139+
140+
AwsSignedChunkedEncodingInputStream stream = AwsSignedChunkedEncodingInputStream.builder()
141+
.inputStream(input)
142+
.headerSignature(REQUEST_SIGNATURE)
143+
.awsChunkSigner(chunkSigner)
144+
.awsChunkedEncodingConfig(AwsChunkedEncodingConfig.create())
145+
.build();
143146
int expectedChunks = 2;
144147
consumeAndVerify(stream, expectedChunks);
145148
Mockito.verify(chunkSigner, times(1)).signChunk(chunkData.getBytes(StandardCharsets.UTF_8), REQUEST_SIGNATURE);
@@ -155,10 +158,13 @@ public void chunkedEncodingStream_largeObject_createsCorrectChunks() throws IOEx
155158
String chunk1Data = StringUtils.repeat("a", DEFAULT_CHUNK_SIZE);
156159
String chunk2Data = "a";
157160
ByteArrayInputStream input = new ByteArrayInputStream(chunk1Data.concat(chunk2Data).getBytes());
158-
AwsChunkedEncodingInputStream stream = new AwsChunkedEncodingInputStream(input,
159-
REQUEST_SIGNATURE,
160-
chunkSigner,
161-
AwsChunkedEncodingConfig.create());
161+
162+
AwsSignedChunkedEncodingInputStream stream = AwsSignedChunkedEncodingInputStream.builder()
163+
.inputStream(input)
164+
.headerSignature(REQUEST_SIGNATURE)
165+
.awsChunkSigner(chunkSigner)
166+
.awsChunkedEncodingConfig(AwsChunkedEncodingConfig.create())
167+
.build();
162168
int expectedChunks = 3;
163169
consumeAndVerify(stream, expectedChunks);
164170
Mockito.verify(chunkSigner, times(1)).signChunk(chunk1Data.getBytes(StandardCharsets.UTF_8), REQUEST_SIGNATURE);
@@ -177,10 +183,14 @@ public void chunkedEncodingStream_differentChunkSize_createsCorrectChunks() thro
177183
String chunk1Data = StringUtils.repeat("a", chunkSize);
178184
String chunk2Data = "a";
179185
ByteArrayInputStream input = new ByteArrayInputStream(chunk1Data.concat(chunk2Data).getBytes());
180-
AwsChunkedEncodingInputStream stream = new AwsChunkedEncodingInputStream(input,
181-
REQUEST_SIGNATURE,
182-
chunkSigner,
183-
chunkConfig);
186+
187+
188+
AwsSignedChunkedEncodingInputStream stream = AwsSignedChunkedEncodingInputStream.builder()
189+
.inputStream(input)
190+
.headerSignature(REQUEST_SIGNATURE)
191+
.awsChunkSigner(chunkSigner)
192+
.awsChunkedEncodingConfig(chunkConfig)
193+
.build();
184194
int expectedChunks = 3;
185195
consumeAndVerify(stream, expectedChunks);
186196
Mockito.verify(chunkSigner, times(1)).signChunk(chunk1Data.getBytes(StandardCharsets.UTF_8), REQUEST_SIGNATURE);
@@ -195,16 +205,19 @@ public void chunkedEncodingStream_emptyString_createsCorrectChunks() throws IOEx
195205
String chunkData = EMPTY_STRING;
196206

197207
ByteArrayInputStream input = new ByteArrayInputStream(chunkData.getBytes());
198-
AwsChunkedEncodingInputStream stream = new AwsChunkedEncodingInputStream(input,
199-
REQUEST_SIGNATURE,
200-
chunkSigner,
201-
AwsChunkedEncodingConfig.create());
208+
209+
AwsSignedChunkedEncodingInputStream stream = AwsSignedChunkedEncodingInputStream.builder()
210+
.inputStream(input)
211+
.headerSignature(REQUEST_SIGNATURE)
212+
.awsChunkSigner(chunkSigner)
213+
.awsChunkedEncodingConfig(AwsChunkedEncodingConfig.create())
214+
.build();
202215
int expectedChunks = 1;
203216
consumeAndVerify(stream, expectedChunks);
204217
Mockito.verify(chunkSigner, times(1)).signChunk(chunkData.getBytes(StandardCharsets.UTF_8), REQUEST_SIGNATURE);
205218
}
206219

207-
private void consumeAndVerify(AwsChunkedEncodingInputStream stream, int numChunks) throws IOException {
220+
private void consumeAndVerify(AwsSignedChunkedEncodingInputStream stream, int numChunks) throws IOException {
208221
ByteArrayOutputStream output = new ByteArrayOutputStream();
209222
IOUtils.copy(stream, output);
210223
String result = new String(output.toByteArray(), StandardCharsets.UTF_8);

core/auth-crt/src/test/java/software/amazon/awssdk/authcrt/signer/internal/AwsCrt4aSigningAdapterTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
import java.util.List;
1212
import org.junit.Before;
1313
import org.junit.Test;
14-
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsChunkedEncodingConfig;
15-
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsChunkedEncodingInputStream;
14+
import software.amazon.awssdk.core.internal.chunked.AwsChunkedEncodingConfig;
15+
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsSignedChunkedEncodingInputStream;
1616
import software.amazon.awssdk.authcrt.signer.SignerTestUtils;
1717
import software.amazon.awssdk.authcrt.signer.SigningTestCase;
1818
import software.amazon.awssdk.authcrt.signer.internal.chunkedencoding.AwsS3V4aChunkSigner;
@@ -68,7 +68,7 @@ public void sign_forChunkedHeader_works() {
6868
SdkHttpFullRequest.Builder requestBuilder = testCase.requestBuilder;
6969
long originalContentLength = calculateRequestContentLength(requestBuilder);
7070
requestBuilder.putHeader("x-amz-decoded-content-length", Long.toString(originalContentLength));
71-
requestBuilder.putHeader(CONTENT_LENGTH, Long.toString(AwsChunkedEncodingInputStream.calculateStreamContentLength(
71+
requestBuilder.putHeader(CONTENT_LENGTH, Long.toString(AwsSignedChunkedEncodingInputStream.calculateStreamContentLength(
7272
originalContentLength, AwsS3V4aChunkSigner.getSignatureLength(), AwsChunkedEncodingConfig.create())));
7373
SdkHttpFullRequest request = requestBuilder.build();
7474

core/auth-crt/src/test/java/software/amazon/awssdk/authcrt/signer/internal/ChunkedEncodingFunctionalTest.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@
4444
import org.mockito.runners.MockitoJUnitRunner;
4545
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
4646
import software.amazon.awssdk.auth.signer.AwsSignerExecutionAttribute;
47-
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsChunkedEncodingConfig;
48-
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsChunkedEncodingInputStream;
47+
import software.amazon.awssdk.core.internal.chunked.AwsChunkedEncodingConfig;
48+
import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsSignedChunkedEncodingInputStream;
4949
import software.amazon.awssdk.authcrt.signer.internal.chunkedencoding.AwsS3V4aChunkSigner;
5050
import software.amazon.awssdk.core.interceptor.ExecutionAttributes;
5151
import software.amazon.awssdk.crt.auth.signing.AwsSigningConfig;
@@ -168,11 +168,15 @@ public void using_a_request_stream_creates_correct_signatures() throws Exception
168168
AwsChunkedEncodingConfig chunkedEncodingConfig = AwsChunkedEncodingConfig.builder()
169169
.chunkSize(STREAM_CHUNK_SIZE)
170170
.build();
171-
AwsChunkedEncodingInputStream stream =
172-
new AwsChunkedEncodingInputStream(request.contentStreamProvider().get().newStream(),
173-
new String(requestSignature, StandardCharsets.UTF_8),
174-
chunkSigner,
175-
chunkedEncodingConfig);
171+
172+
AwsSignedChunkedEncodingInputStream stream =
173+
174+
AwsSignedChunkedEncodingInputStream.builder()
175+
.inputStream(request.contentStreamProvider().get().newStream())
176+
.awsChunkSigner(chunkSigner)
177+
.awsChunkedEncodingConfig(chunkedEncodingConfig)
178+
.headerSignature(new String(requestSignature, StandardCharsets.UTF_8))
179+
.build();
176180

177181
ByteArrayOutputStream output = new ByteArrayOutputStream();
178182
IOUtils.copy(stream, output);

0 commit comments

Comments
 (0)