def test_generator(self): upload_bstr = b'test binary data' upload_file = BytesIO() upload_file.write(upload_bstr) upload_file.seek(0) upload_data = InMemoryUploadedFile(upload_file, 'file', 'test_file.dat', 'application/octet-stream', len(upload_bstr), None, content_type_extra={}) data = QueryDict(mutable=True) data['file'] = upload_data files = {'file': upload_data} boundary = 'ddd37654bd80490fa3c58987954aa380' streamingMultiPart = StreamingMultipart(data, files, boundary) generator = streamingMultiPart.generator() data_mpheader = next(generator) expected_data_mpheader = b'--ddd37654bd80490fa3c58987954aa380\r\nContent-Disposition: form-data; name="file"\r\n\r\n' self.assertEqual(data_mpheader, expected_data_mpheader) data_body = next(generator) expected_data_body = b'test_file.dat\r\n' self.assertEqual(data_body, expected_data_body) file_mpheader = next(generator) content_type = mimetypes.guess_type( 'test_file.dat')[0] or 'application/octet-stream' expected_file_mpheader = ( '--ddd37654bd80490fa3c58987954aa380\r\nContent-Disposition: form-data; name="file"; filename="test_file.dat"\r\nContent-Type: %s\r\n\r\n' % content_type).encode('utf-8') self.assertEqual(file_mpheader, expected_file_mpheader) file_body = next(generator) expected_file_body = b'test binary data' self.assertEqual(file_body, expected_file_body) self.assertEqual(next(generator), b'\r\n') mpfooter = next(generator) expected_mpfooter = b'--ddd37654bd80490fa3c58987954aa380--\r\n' self.assertEqual(mpfooter, expected_mpfooter) try: v = next(generator) self.fail('Unexpected iteration - %r' % v) except StopIteration: pass
def test_generator(self): upload_bstr = b'test binary data' upload_file = BytesIO() upload_file.write(upload_bstr) upload_file.seek(0) upload_data = InMemoryUploadedFile(upload_file, 'file', 'test_file.dat', 'application/octet-stream', len(upload_bstr), None, content_type_extra={}) data = QueryDict(mutable=True) data['file'] = upload_data files = {'file': upload_data} boundary = 'ddd37654bd80490fa3c58987954aa380' streamingMultiPart = StreamingMultipart(data, files, boundary) generator = streamingMultiPart.generator() data_mpheader = next(generator) expected_data_mpheader = b'--ddd37654bd80490fa3c58987954aa380\r\nContent-Disposition: form-data; name="file"\r\n\r\n' self.assertEqual(data_mpheader, expected_data_mpheader) data_body = next(generator) expected_data_body = b'test_file.dat\r\n' self.assertEqual(data_body, expected_data_body) file_mpheader = next(generator) content_type = mimetypes.guess_type('test_file.dat')[0] or 'application/octet-stream' expected_file_mpheader = ('--ddd37654bd80490fa3c58987954aa380\r\nContent-Disposition: form-data; name="file"; filename="test_file.dat"\r\nContent-Type: %s\r\n\r\n' % content_type).encode('utf-8') self.assertEqual(file_mpheader, expected_file_mpheader) file_body = next(generator) expected_file_body = b'test binary data' self.assertEqual(file_body, expected_file_body) self.assertEqual(next(generator), b'\r\n') mpfooter = next(generator) expected_mpfooter = b'--ddd37654bd80490fa3c58987954aa380--\r\n' self.assertEqual(mpfooter, expected_mpfooter) try: v = next(generator) self.fail('Unexpected iteration - %r' % v) except StopIteration: pass
def proxy(self, request): url = self.get_request_url(request) params = self.get_request_params(request) data = self.get_request_data(request) files = self.get_request_files(request) headers = self.get_headers(request) try: if files: """ By default requests library uses chunked upload for files but it is much more easier for servers to handle streamed uploads. This new implementation is also lightweight as files are not read entirely into memory. """ boundary = generate_boundary() headers[ 'Content-Type'] = 'multipart/form-data; boundary=%s' % boundary body = StreamingMultipart(data, files, boundary) session = sessions.Session() session.mount('http://', StreamingHTTPAdapter()) session.mount('https://', StreamingHTTPAdapter()) response = session.request(request.method, url, params=params, data=body, headers=headers, timeout=self.proxy_settings.TIMEOUT) else: response = requests.request( request.method, url, params=params, data=data, files=files, headers=headers, timeout=self.proxy_settings.TIMEOUT) except (ConnectionError, SSLError): status = requests.status_codes.codes.bad_gateway return self.create_error_response( { 'code': status, 'error': 'Bad gateway', }, status) except (Timeout): status = requests.status_codes.codes.gateway_timeout return self.create_error_response( { 'code': status, 'error': 'Gateway timed out', }, status) return self.create_response(response)