Exemple #1
0
def create_request_from_raw_request(raw_request):
    raw_request = raw_request.replace('http/1.1', 'HTTP/1.1')
    request = AWSRequest()
    raw = RawHTTPRequest(raw_request)
    if raw.error_code is not None:
        raise Exception(raw.error_message)
    request.method = raw.command
    datetime_now = datetime.datetime(2011, 9, 9, 23, 36)
    request.context['timestamp'] = datetime_now.strftime('%Y%m%dT%H%M%SZ')
    for key, val in raw.headers.items():
        request.headers[key] = val
    request.data = raw.rfile.read()
    host = raw.headers.get('host', '')
    # For whatever reason, the BaseHTTPRequestHandler encodes
    # the first line of the response as 'iso-8859-1',
    # so we need decode this into utf-8.
    if isinstance(raw.path, six.text_type):
        raw.path = raw.path.encode('iso-8859-1').decode('utf-8')
    url = 'https://%s%s' % (host, raw.path)
    if '?' in url:
        split_url = urlsplit(url)
        params = dict(parse_qsl(split_url.query))
        request.url = split_url.path
        request.params = params
    else:
        request.url = url
    return request
Exemple #2
0
def create_request_from_raw_request(raw_request):
    raw_request = raw_request.replace('http/1.1', 'HTTP/1.1')
    request = AWSRequest()
    raw = RawHTTPRequest(raw_request)
    if raw.error_code is not None:
        raise Exception(raw.error_message)
    request.method = raw.command
    datetime_now = datetime.datetime(2011, 9, 9, 23, 36)
    request.context['timestamp'] = datetime_now.strftime('%Y%m%dT%H%M%SZ')
    for key, val in raw.headers.items():
        request.headers[key] = val
    request.data = raw.rfile.read()
    host = raw.headers.get('host', '')
    # For whatever reason, the BaseHTTPRequestHandler encodes
    # the first line of the response as 'iso-8859-1',
    # so we need decode this into utf-8.
    if isinstance(raw.path, six.text_type):
        raw.path = raw.path.encode('iso-8859-1').decode('utf-8')
    url = 'https://%s%s' % (host, raw.path)
    if '?' in url:
        split_url = urlsplit(url)
        params = dict(parse_qsl(split_url.query))
        request.url = split_url.path
        request.params = params
    else:
        request.url = url
    return request
Exemple #3
0
 def test_presign_with_spaces_in_param(self):
     request = AWSRequest()
     request.url = 'https://ec2.us-east-1.amazonaws.com/'
     request.data = {'Action': 'MyOperation', 'Description': 'With Spaces'}
     self.auth.add_auth(request)
     # Verify we encode spaces as '%20, and we don't use '+'.
     self.assertIn('Description=With%20Spaces', request.url)
Exemple #4
0
 def test_presign_with_spaces_in_param(self):
     request = AWSRequest()
     request.url = 'https://ec2.us-east-1.amazonaws.com/'
     request.data = {'Action': 'MyOperation', 'Description': 'With Spaces'}
     self.auth.add_auth(request)
     # Verify we encode spaces as '%20, and we don't use '+'.
     self.assertIn('Description=With%20Spaces', request.url)
Exemple #5
0
 def test_payload_is_bytes_type(self):
     request = AWSRequest()
     request.data = u'\u2713'.encode('utf-8')
     auth = self.create_signer()
     payload = auth.payload(request)
     self.assertEqual(
         payload,
         '1dabba21cdad44541f6b15796f8d22978fc7ea10c46aeceeeeb66c23b3ac7604')
Exemple #6
0
 def test_operation_params_before_auth_params_in_body(self):
     request = AWSRequest()
     request.url = 'https://ec2.us-east-1.amazonaws.com/'
     request.data = {'Action': 'MyOperation'}
     self.auth.add_auth(request)
     # Same situation, the params from request.data come before the auth
     # params in the query string.
     self.assertIn('?Action=MyOperation&X-Amz', request.url)
 def test_payload_not_signed_if_disabled_in_context(self):
     request = AWSRequest()
     request.data = u'\u2713'.encode('utf-8')
     request.url = 'https://amazonaws.com'
     request.context['payload_signing_enabled'] = False
     auth = self.create_signer()
     payload = auth.payload(request)
     self.assertEqual(payload, 'UNSIGNED-PAYLOAD')
Exemple #8
0
 def test_payload_is_bytes_type(self):
     request = AWSRequest()
     request.data = u'\u2713'.encode('utf-8')
     auth = self.create_signer()
     payload = auth.payload(request)
     self.assertEqual(
         payload,
         '1dabba21cdad44541f6b15796f8d22978fc7ea10c46aeceeeeb66c23b3ac7604')
 def test_switch_host_with_param(self):
     request = AWSRequest()
     url = 'https://machinelearning.us-east-1.amazonaws.com'
     new_endpoint = 'https://my-custom-endpoint.amazonaws.com'
     data = '{"PredictEndpoint":"%s"}' % new_endpoint
     request.data = data.encode('utf-8')
     request.url = url
     handlers.switch_host_with_param(request, 'PredictEndpoint')
     self.assertEqual(request.url, new_endpoint)
 def test_payload_is_binary_file(self):
     request = AWSRequest()
     request.data = six.BytesIO(u'\u2713'.encode('utf-8'))
     request.url = 'https://amazonaws.com'
     auth = self.create_signer()
     payload = auth.payload(request)
     self.assertEqual(
         payload,
         '1dabba21cdad44541f6b15796f8d22978fc7ea10c46aeceeeeb66c23b3ac7604')
Exemple #11
0
 def test_operation_params_before_auth_params_in_body(self):
     request = AWSRequest()
     request.url = 'https://ec2.us-east-1.amazonaws.com/'
     request.data = {'Action': 'MyOperation'}
     self.auth.add_auth(request)
     # Same situation, the params from request.data come before the auth
     # params in the query string.
     self.assertIn(
         '?Action=MyOperation&X-Amz', request.url)
Exemple #12
0
 def test_switch_host_with_param(self):
     request = AWSRequest()
     url = 'https://machinelearning.us-east-1.amazonaws.com'
     new_endpoint = 'https://my-custom-endpoint.amazonaws.com'
     data = '{"PredictEndpoint":"%s"}' % new_endpoint
     request.data = data.encode('utf-8')
     request.url = url
     handlers.switch_host_with_param(request, 'PredictEndpoint')
     self.assertEqual(request.url, new_endpoint)
 def test_content_sha256_set_if_payload_signing_disabled(self):
     request = AWSRequest()
     request.data = six.BytesIO(u'\u2713'.encode('utf-8'))
     request.url = 'https://amazonaws.com'
     request.context['payload_signing_enabled'] = False
     request.method = 'PUT'
     auth = self.create_signer()
     auth.add_auth(request)
     sha_header = request.headers['X-Amz-Content-SHA256']
     self.assertEqual(sha_header, 'UNSIGNED-PAYLOAD')
Exemple #14
0
    def test_query_string_params_in_urls(self):
        request = AWSRequest()
        request.url = ('https://s3.amazonaws.com/bucket?'
                       'marker=%C3%A4%C3%B6%C3%BC-01.txt&prefix')
        request.data = {'Action': 'MyOperation'}
        request.method = 'GET'

        # Check that the canonical query string is correct formatting
        # by ensuring that query string paramters that are added to the
        # canonical query string are correctly formatted.
        cqs = self.auth.canonical_query_string(request)
        self.assertEqual('marker=%C3%A4%C3%B6%C3%BC-01.txt&prefix=', cqs)
 def test_fields(self):
     request = AWSRequest()
     request.url = '/'
     request.method = 'POST'
     request.data = {'Foo': u'\u2713'}
     self.signer.add_auth(request)
     self.assertEqual(request.data['AWSAccessKeyId'], 'foo')
     self.assertEqual(request.data['Foo'], u'\u2713')
     self.assertEqual(request.data['Timestamp'], '2014-06-20T08:40:23Z')
     self.assertEqual(request.data['Signature'],
                      u'Tiecw+t51tok4dTT8B4bg47zxHEM/KcD55f2/x6K22o=')
     self.assertEqual(request.data['SignatureMethod'], 'HmacSHA256')
     self.assertEqual(request.data['SignatureVersion'], '2')
Exemple #16
0
    def test_query_string_params_in_urls(self):
        request = AWSRequest()
        request.url = (
            'https://s3.amazonaws.com/bucket?'
            'marker=%C3%A4%C3%B6%C3%BC-01.txt&prefix'
        )
        request.data = {'Action': 'MyOperation'}
        request.method = 'GET'

        # Check that the canonical query string is correct formatting
        # by ensuring that query string paramters that are added to the
        # canonical query string are correctly formatted.
        cqs = self.auth.canonical_query_string(request)
        self.assertEqual('marker=%C3%A4%C3%B6%C3%BC-01.txt&prefix=', cqs)
Exemple #17
0
    def test_query_string_params_in_urls(self):
        if not hasattr(self.AuthClass, 'canonical_query_string'):
            raise unittest.SkipTest('%s does not expose interim steps' %
                                    self.AuthClass.__name__)

        request = AWSRequest()
        request.url = ('https://s3.amazonaws.com/bucket?'
                       'marker=%C3%A4%C3%B6%C3%BC-01.txt&prefix')
        request.data = {'Action': 'MyOperation'}
        request.method = 'GET'

        # Check that the canonical query string is correct formatting
        # by ensuring that query string paramters that are added to the
        # canonical query string are correctly formatted.
        cqs = self.auth.canonical_query_string(request)
        self.assertEqual('marker=%C3%A4%C3%B6%C3%BC-01.txt&prefix=', cqs)
 def test_presign_where_body_is_json_string(self):
     request = AWSRequest()
     request.method = 'GET'
     request.url = 'https://myservice.us-east-1.amazonaws.com/'
     request.data = '{"Param": "value"}'
     self.auth.add_auth(request)
     query_string = self.get_parsed_query_string(request)
     expected_query_string = {
         'X-Amz-Algorithm': 'AWS4-HMAC-SHA256',
         'X-Amz-Credential': (
             'access_key/20140101/myregion/myservice/aws4_request'),
         'X-Amz-Expires': '60',
         'X-Amz-Date': '20140101T000000Z',
         'X-Amz-Signature': (
             '8e1d372d168d532313ce6df8f64a7dc51d'
             'e6f312a9cfba6e5b345d8a771e839c'),
         'X-Amz-SignedHeaders': 'host',
         'Param': 'value'
     }
     self.assertEqual(query_string, expected_query_string)