Skip to content

Commit 8dded62

Browse files
Dillon Nysdnys1
authored andcommitted
fix(sigv4): Include Host header in signing
commit-id:5e8e08e7
1 parent 09baf84 commit 8dded62

File tree

3 files changed

+53
-2
lines changed

3 files changed

+53
-2
lines changed

packages/aws_signature_v4/lib/src/configuration/service_configuration.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,6 @@ class BaseServiceConfiguration extends ServiceConfiguration {
164164
required AWSCredentials credentials,
165165
}) {
166166
queryParameters.addAll({
167-
if (!request.headers.containsKey(AWSHeaders.host))
168-
AWSHeaders.host: request.host,
169167
AWSHeaders.date: credentialScope.dateTime.formatFull(),
170168
AWSHeaders.signedHeaders: signedHeaders.toString(),
171169
AWSHeaders.algorithm: algorithm.id,

packages/aws_signature_v4/lib/src/request/canonical_request/canonical_request.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,11 @@ class CanonicalRequest {
155155
const BaseServiceConfiguration(),
156156
}) {
157157
final headers = Map.of(request.headers);
158+
// Include header for signing since it will be included by the HTTP client
159+
// of the end user.
160+
if (!headers.containsKey(AWSHeaders.host)) {
161+
headers[AWSHeaders.host] = request.host;
162+
}
158163
final queryParameters = Map.of(request.queryParameters);
159164

160165
// Per https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import 'package:aws_common/aws_common.dart';
2+
import 'package:aws_signature_v4/aws_signature_v4.dart';
3+
import 'package:test/test.dart';
4+
5+
import 'common.dart';
6+
7+
void main() {
8+
group('CanonicalRequest', () {
9+
test('Host header is always signed', () {
10+
final uri = Uri.parse('https://example.com/path');
11+
final request = AWSHttpRequest.get(uri);
12+
13+
final signedRequest = CanonicalRequest(
14+
request: request,
15+
credentials: dummyCredentials,
16+
credentialScope: dummyCredentialScope,
17+
contentLength: 0,
18+
payloadHash: emptyPayloadHash,
19+
);
20+
expect(
21+
CaseInsensitiveMap(signedRequest.canonicalHeaders),
22+
contains(AWSHeaders.host),
23+
);
24+
expect(
25+
CaseInsensitiveSet(signedRequest.signedHeaders),
26+
contains(AWSHeaders.host),
27+
);
28+
29+
final presignedRequest = CanonicalRequest.presignedUrl(
30+
request: request,
31+
credentials: dummyCredentials,
32+
credentialScope: dummyCredentialScope,
33+
contentLength: 0,
34+
payloadHash: emptyPayloadHash,
35+
expiresIn: const Duration(seconds: 300),
36+
algorithm: AWSAlgorithm.hmacSha256,
37+
);
38+
expect(
39+
CaseInsensitiveMap(presignedRequest.canonicalHeaders),
40+
contains(AWSHeaders.host),
41+
);
42+
expect(
43+
CaseInsensitiveSet(presignedRequest.signedHeaders),
44+
contains(AWSHeaders.host),
45+
);
46+
});
47+
});
48+
}

0 commit comments

Comments
 (0)