Exemple #1
0
    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)