def test_generate_simple_multipart_data(self): with open(__file__) as test_file: params = { 'key1': 'value1', 'key2': 'value2', 'key3': test_file, } generator = MultipartDataGenerator() generator.add_params(params) post_data = generator.get_post_data() byte_array = bytearray(post_data) http_body = byte_array.decode('utf-8') self.assertTrue( re.search(r'Content-Disposition: form-data; name=\"key1\"', http_body)) self.assertTrue( re.search(r'Content-Disposition: form-data; name=\"key2\"', http_body)) self.assertTrue( re.search( r'Content-Disposition: form-data; name=\"key3\"; filename=\".+\"', http_body)) self.assertTrue( re.search(r'Content-Type: application/octet-stream', http_body)) test_file.seek(0) file_contents = test_file.read() self.assertNotEqual(-1, http_body.find(file_contents))
def test_generate_simple_multipart_data(self): with open(__file__) as test_file: params = { 'key1': 'value1', 'key2': 'value2', 'key3': test_file, } generator = MultipartDataGenerator() generator.add_params(params) post_data = generator.get_post_data() byte_array = bytearray(post_data) http_body = byte_array.decode('utf-8') self.assertTrue(re.search(r'Content-Disposition: form-data; name=\"key1\"', http_body)) self.assertTrue(re.search(r'Content-Disposition: form-data; name=\"key2\"', http_body)) self.assertTrue(re.search(r'Content-Disposition: form-data; name=\"key3\"; filename=\".+\"', http_body)) self.assertTrue(re.search(r'Content-Type: application/octet-stream', http_body)) test_file.seek(0) file_contents = test_file.read() self.assertNotEqual(-1, http_body.find(file_contents))
async def request_raw(self, method, url, params=None, supplied_headers=None): """ Mechanism for issuing an API call """ from aiostripe import api_version if self.api_key: my_api_key = self.api_key else: from aiostripe import api_key my_api_key = api_key if my_api_key is None: raise error.AuthenticationError('No API key provided. (HINT: set your API key using ' '"aiostripe.api_key = <API-KEY>"). You can generate API keys from the Stripe ' 'web interface. See https://stripe.com/api for details, or email ' '[email protected] if you have any questions.') abs_url = '%s%s' % (self.api_base, url) encoded_params = urllib.parse.urlencode(list(_api_encode(params or {}))) if method == 'get' or method == 'delete': if params: abs_url = _build_api_url(abs_url, encoded_params) post_data = None elif method == 'post': if supplied_headers is not None and supplied_headers.get('Content-Type') == 'multipart/form-data': generator = MultipartDataGenerator() generator.add_params(params or {}) post_data = generator.get_post_data() supplied_headers['Content-Type'] = 'multipart/form-data; boundary=%s' % generator.boundary else: post_data = encoded_params else: raise error.APIConnectionError('Unrecognized HTTP method %r. This may indicate a bug in the Stripe ' 'bindings. Please contact [email protected] for assistance.' % method) ua = { 'bindings_version': version.VERSION, 'lang': 'python', 'publisher': 'stripe', 'httplib': self._client.name, } for attr, func in [['lang_version', platform.python_version], ['platform', platform.platform], ['uname', lambda: ' '.join(platform.uname())]]: try: val = func() except Exception as e: val = '!! %s' % e ua[attr] = val headers = { 'X-Stripe-Client-User-Agent': json.dumps(ua), 'User-Agent': 'Stripe/v1 PythonBindings/%s' % version.VERSION, 'Authorization': 'Bearer %s' % my_api_key, } if self.stripe_account: headers['Stripe-Account'] = self.stripe_account if method == 'post': headers['Content-Type'] = 'application/x-www-form-urlencoded' if api_version is not None: headers['Stripe-Version'] = api_version if supplied_headers is not None: for key, value in supplied_headers.items(): headers[key] = value rbody, rcode, rheaders = await self._client.request(method, abs_url, headers, post_data) logger.info('%s %s %d', method.upper(), abs_url, rcode) logger.debug('API request to %s returned (response code, response body) of (%d, %r)', abs_url, rcode, rbody) return rbody, rcode, rheaders, my_api_key