@@ -147,15 +147,6 @@ def _set_datestamp(self):
147147 self .date = date .strftime ('%Y%m%dT%H%M%SZ' )
148148 self .datestamp = date .strftime ('%Y%m%d' )
149149
150- def sign (self , key , msg ):
151- return hmac .new (key , msg .encode ('utf-8' ), hashlib .sha256 ).digest ()
152-
153- def get_signature_key (self , key , timestamp , region_name , service_name ):
154- key_date = self .sign ((self .SIG_TYPE + key ).encode ('utf-8' ), timestamp )
155- key_region = self .sign (key_date , region_name )
156- key_service = self .sign (key_region , service_name )
157- return self .sign (key_service , self .REQUEST_TYPE )
158-
159150 def get_url (self , call , request_params = None ):
160151 value = self .endpoint
161152 if self .method == 'GET' :
@@ -165,9 +156,10 @@ def get_url(self, call, request_params=None):
165156 def get_canonical_uri (self , call ):
166157 return CANONICAL_URI
167158
168- def get_authorization_header (
169- self , amz_date , credential_scope , canonical_request , signed_headers , timestamp
170- ):
159+ def get_authorization_header (self , canonical_request , signed_headers ):
160+ credentials = [self .datestamp , self .region , self .API_NAME ,
161+ self .REQUEST_TYPE ]
162+ credential_scope = '/' .join (credentials )
171163 string_to_sign = '\n ' .join (
172164 [
173165 self .SIG_ALGORITHM ,
@@ -176,14 +168,20 @@ def get_authorization_header(
176168 hashlib .sha256 (canonical_request .encode ('utf-8' )).hexdigest (),
177169 ]
178170 )
179- signing_key = self .get_signature_key (
180- self .secret_key , timestamp , self .region , self .API_NAME
181- )
182- signature = hmac .new (
183- signing_key , (string_to_sign ).encode ('utf-8' ), hashlib .sha256
184- ).hexdigest ()
185- return '{} Credential={}/{}, SignedHeaders={}, Signature={}' .format (
186- self .SIG_ALGORITHM , self .access_key , credential_scope , signed_headers , signature
171+ key = (self .SIG_TYPE + self .secret_key ).encode ('utf-8' )
172+ for msg in credentials :
173+ key = hmac .new (key , msg .encode ('utf-8' ), hashlib .sha256 ).digest ()
174+ signature = hmac .new (key ,
175+ string_to_sign .encode ('utf-8' ),
176+ hashlib .sha256 ).hexdigest ()
177+
178+ return (
179+ '{} Credential={}/{}, SignedHeaders={}, Signature={}' .format (
180+ self .SIG_ALGORITHM ,
181+ self .access_key ,
182+ credential_scope ,
183+ signed_headers ,
184+ signature )
187185 )
188186
189187 def get_response (self , request ):
@@ -222,80 +220,62 @@ def make_request(self, call, *args, **kwargs):
222220 # Calculate URL before request_params value is modified
223221 url = self .get_url (call , request_params )
224222
225- credential_scope = '/' .join (
226- [self .datestamp , self .region , self .API_NAME , self .REQUEST_TYPE ]
227- )
228-
229223 if self .method == 'GET' :
230- canonical_headers = ' \n ' . join (
231- [ 'host:' + self .host , 'x-amz-date:' + self . date , '' ]
232- )
233- signed_headers = 'host;x-amz-date'
224+ headers = {
225+ 'host' : self .host ,
226+ 'x-amz-date' : self . date ,
227+ }
234228 payload_hash = hashlib .sha256 ('' .encode ('utf-8' )).hexdigest ()
235- canonical_request = '\n ' .join (
236- [
237- self .method ,
238- self .get_canonical_uri (call ),
239- request_params ,
240- canonical_headers ,
241- signed_headers ,
242- payload_hash ,
243- ]
244- )
229+ canonical_params = request_params
245230 request_params = None
246231 else :
247- amz_target = '{}_{}.{}' .format (
248- self .API_NAME , datetime .date .today ().strftime ("%Y%m%d" ), call
249- )
250- canonical_headers = (
251- 'content-type:{}\n '
252- 'host:{}\n '
253- 'x-amz-date:{}\n '
254- 'x-amz-target:{}\n ' .format (
255- self .CONTENT_TYPE , self .host , self .date , amz_target
256- )
257- )
258- signed_headers = 'content-type;host;x-amz-date;x-amz-target'
259-
260- payload_hash = hashlib .sha256 (
261- request_params .encode ('utf-8' )
262- ).hexdigest ()
263- canonical_request = '\n ' .join (
264- [
265- self .method ,
266- self .get_canonical_uri (call ),
267- '' ,
268- canonical_headers ,
269- signed_headers ,
270- payload_hash ,
271- ]
232+ headers = {
233+ 'content-type' : self .CONTENT_TYPE ,
234+ 'host' : self .host ,
235+ 'x-amz-date' : self .date ,
236+ 'x-amz-target' :
237+ '{}_{}.{}' .format (self .API_NAME ,
238+ datetime .date .today ().strftime ('%Y%m%d' ),
239+ call ),
240+ }
241+
242+ payload_hash = (
243+ hashlib .sha256 (request_params .encode ('utf-8' )).hexdigest ()
272244 )
245+ canonical_params = ''
246+
247+ canonical_headers = '' .join ('{}:{}\n ' .format (k , v )
248+ for k , v in headers .items ())
249+ signed_headers = ';' .join (headers )
250+ canonical_request = '\n ' .join (
251+ [
252+ self .method ,
253+ self .get_canonical_uri (call ),
254+ canonical_params ,
255+ canonical_headers ,
256+ signed_headers ,
257+ payload_hash ,
258+ ]
259+ )
273260
274261 authorization_header = self .get_authorization_header (
275- self .date ,
276- credential_scope ,
277262 canonical_request ,
278263 signed_headers ,
279- self .datestamp ,
280264 )
281265
282- headers = {
266+ headers . update ( {
283267 'Authorization' : authorization_header ,
284- 'x-amz-date' : self .date ,
285268 'User-agent' : USER_AGENT ,
286- }
287- if self .method == 'POST' :
288- headers ['content-type' ] = self .CONTENT_TYPE
289- headers ['x-amz-target' ] = amz_target
290-
291- self .response = self .get_response (
292- requests .request (
293- method = self .method ,
294- url = url ,
295- data = request_params ,
296- headers = headers ,
297- verify = self .ssl_verify ,
298- )
269+ })
270+
271+ self .response = (
272+ self .get_response (
273+ requests .request (
274+ data = request_params ,
275+ headers = headers ,
276+ method = self .method ,
277+ url = url ,
278+ verify = self .ssl_verify ))
299279 )
300280
301281
@@ -375,10 +355,6 @@ def make_request(self, call, *args, **kwargs):
375355 request_params = self .get_parameters (kwargs , call )
376356 json_params = json .dumps (request_params )
377357
378- credential_scope = '/' .join (
379- [self .datestamp , self .region , self .API_NAME , self .REQUEST_TYPE ]
380- )
381-
382358 target = '.' .join ([self .SERVICE , call ])
383359
384360 signed_headers , canonical_headers , headers = self .build_headers (
@@ -400,11 +376,8 @@ def make_request(self, call, *args, **kwargs):
400376 or request_params ['AuthenticationMethod' ] == 'accesskey'
401377 ):
402378 headers ['Authorization' ] = self .get_authorization_header (
403- self .date ,
404- credential_scope ,
405379 canonical_request ,
406380 signed_headers ,
407- self .datestamp ,
408381 )
409382
410383 self .response = self .get_response (
0 commit comments