def _test_signed_request(self): from faws.sign.v4 import ( signed_request, SignedRequestInfo, ) from faws.service import get_service from faws.sign.v4 import DATETIME_F from faws.creds import Creds # GET request method = 'GET' url = 'https://iam.amazonaws.com/' action = 'ListUsers' params = { 'Version' : '2010-05-08', } expected = SignedRequestInfo( headers = { 'content-type': 'application/json', 'host' : 'iam.amazonaws.com', }, url = 'https://iam.amazonaws.com/?Action=ListUsers&Version=2010-05-08&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE/20110909/us-east-1/iam/aws4_request&X-Amz-Date=20110909T233600Z&X-Amz-Signature=525d1a96c69b5549dd78dbbec8efe264102288b83ba87b7d58d4b76b71f59fd2&X-Amz-SignedHeaders=content-type;host', data = None, ) creds = Creds('AKIDEXAMPLE', 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY', 'us-east-1') when = datetime.datetime.strptime('20110909T233600Z', DATETIME_F) actual = signed_request(method, get_service('iam', None), action, params, creds, when) self.assertSequenceEqual(sorted(expected.headers.keys()), sorted(actual.headers.keys())) for key in sorted(expected.headers.keys()): self.assertSequenceEqual(expected.headers[key], actual.headers[key], key) self.assertSequenceEqual(expected.url, actual.url) self.assertEqual(expected.data, actual.data)
def callf(self, action, params=None, service_name='ec2', now=None): from faws.futures import Future import requests import datetime from faws.service import get_service from faws.sign.v2 import signed_request if params is None: params = {} if now is None: now = datetime.datetime.utcnow() service = get_service(service_name, self.creds.region) expires = now + datetime.timedelta(days=5) params.update({ 'Action' : action, }) assert service.method in {'GET', 'POST'}, service.name # do_request will be one of requests.get or requests.post if 'GET' == service.method: do_request = requests.get else: do_request = requests.put sr = signed_request(service, params, self.creds, now) def do_call(): return do_request( sr.url, data = sr.payload, headers = sr.headers, ) return Future(self.executor.submit(do_call))
def callf_v4(self, action, params=None, service_name='ec2', now=None): from faws.sign.common import DATETIME_ISO8601_F import requests import datetime from faws.service import get_service from faws.sign.v4 import ( datefmt, signed_request, ) if params is None: params = {} if now is None: now = datetime.datetime.now() service = get_service(service_name, self.creds.region) expires = now + datetime.timedelta(minutes=5) params.update({ 'Action' : action, 'Version' : service.version, 'AWSAccessKeyId' : self.creds.access_key, 'Timestamp' : now.strftime(DATETIME_ISO8601_F), 'Expires' : expires.strftime(DATETIME_ISO8601_F), }) assert service.method in {'GET', 'POST'}, service.name # do_request will be one of requests.get or requests.post if 'GET' == service.method: do_request = requests.get else: do_request = requests.put sr = signed_request(service, params, self.creds, when=now) def do_call(): return do_request( sr.url, data = sr.payload, headers = sr.headers, ) return self.executor.submit(do_call)