@@ -86,30 +86,23 @@ public struct AWSSignatureV4 {
86
86
}
87
87
88
88
func getCanonicalRequest(
89
- payload : Payload ,
89
+ payloadHash : String ,
90
90
method: Method ,
91
91
path: String ,
92
92
query: String ,
93
- headers: [ String : String ] = [ : ]
93
+ canonicalHeaders: String ,
94
+ signedHeaders: String
94
95
) throws -> String {
95
96
let path = try path. percentEncode ( allowing: Byte . awsPathAllowed)
96
97
let query = try query. percentEncode ( allowing: Byte . awsQueryAllowed)
97
- let payloadHash = try payload. hashed ( )
98
-
99
- var headers = headers
100
- generateHeadersToSign ( headers: & headers, host: host, hash: payloadHash)
101
-
102
- let sortedHeaders = alphabetize ( headers)
103
- let canonicalHeaders = createCanonicalHeaders ( sortedHeaders)
104
- let headersToSign = sortedHeaders. map { $0. key. lowercased ( ) } . joined ( separator: " ; " )
105
98
106
99
return [
107
100
method. rawValue,
108
101
path,
109
102
query,
110
103
canonicalHeaders,
111
104
" " ,
112
- headersToSign ,
105
+ signedHeaders ,
113
106
payloadHash
114
107
] . joined ( separator: " \n " )
115
108
}
@@ -146,26 +139,13 @@ extension AWSSignatureV4 {
146
139
} . joined ( separator: " \n " )
147
140
}
148
141
149
- func signPayload(
150
- _ payload: Payload ,
151
- mime: String ? ,
152
- headers: inout [ HeaderKey : String ]
153
- ) throws {
154
- /*let contentLength: Int
155
-
156
- switch payload {
157
- case .bytes(let bytes):
158
- contentLength = bytes.count
159
- default:
160
- contentLength = 0
161
- }
162
-
163
- headers["Content-Length"] = "\(contentLength)"
164
- if let mime = mime {
165
- headers["Content-Type"] = mime
166
- }
167
-
168
- headers["x-amz-content-sha256"] = try payload.hashed()*/
142
+ func createAuthorizationHeader(
143
+ algorithm: String ,
144
+ credentialScope: String ,
145
+ signature: String ,
146
+ signedHeaders: String
147
+ ) -> String {
148
+ return " \( algorithm) Credential= \( accessKey) / \( credentialScope) , SignedHeaders= \( signedHeaders) , Signature= \( signature) "
169
149
}
170
150
}
171
151
@@ -179,12 +159,22 @@ extension AWSSignatureV4 {
179
159
) throws -> [ HeaderKey : String ] {
180
160
let algorithm = " AWS4-HMAC-SHA256 "
181
161
let credentialScope = getCredentialScope ( )
162
+ let payloadHash = try payload. hashed ( )
163
+
164
+ var headers = headers
165
+ generateHeadersToSign ( headers: & headers, host: host, hash: payloadHash)
166
+
167
+ let sortedHeaders = alphabetize ( headers)
168
+ let signedHeaders = sortedHeaders. map { $0. key. lowercased ( ) } . joined ( separator: " ; " )
169
+ let canonicalHeaders = createCanonicalHeaders ( sortedHeaders)
182
170
183
171
let canonicalRequest = try getCanonicalRequest (
184
- payload : payload ,
172
+ payloadHash : payloadHash ,
185
173
method: method,
186
174
path: path,
187
- query: query ?? " "
175
+ query: query ?? " " ,
176
+ canonicalHeaders: canonicalHeaders,
177
+ signedHeaders: signedHeaders
188
178
)
189
179
190
180
let canonicalHash = try Hash . make ( . sha256, canonicalRequest) . hexString
@@ -198,11 +188,16 @@ extension AWSSignatureV4 {
198
188
199
189
let signature = try getSignature ( stringToSign)
200
190
201
- let authorizationHeader = " \( algorithm) Credential= \( accessKey) / \( credentialScope) , SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature= \( signature) "
191
+ let authorizationHeader = createAuthorizationHeader (
192
+ algorithm: algorithm,
193
+ credentialScope: credentialScope,
194
+ signature: signature,
195
+ signedHeaders: signedHeaders
196
+ )
202
197
203
198
return [
204
199
" X-Amz-Date " : amzDate,
205
- " x-amz-content-sha256 " : try payload . hashed ( ) ,
200
+ " x-amz-content-sha256 " : payloadHash ,
206
201
" Authorization " : authorizationHeader
207
202
]
208
203
}
0 commit comments