def test_retry_seekable_stream(): class MockTransport(HttpTransport): def __init__(self): self._first = True def __exit__(self, exc_type, exc_val, exc_tb): pass def close(self): pass def open(self): pass def send(self, request, **kwargs): # type: (PipelineRequest, Any) -> PipelineResponse if self._first: self._first = False request.body.seek(0,2) raise AzureError('fail on first') position = request.body.tell() assert position == 0 response = HttpResponse(request, None) response.status_code = 400 return response data = BytesIO(b"Lots of dataaaa") http_request = HttpRequest('GET', 'http://127.0.0.1/') http_request.set_streamed_data_body(data) http_retry = RetryPolicy(retry_total = 1) pipeline = Pipeline(MockTransport(), [http_retry]) pipeline.run(http_request)
def build_response(body, content_type=None): class MockResponse(HttpResponse): def __init__(self): super(MockResponse, self).__init__(None, None) self._body = 'test' def body(self): return self._body data = BytesIO(b"Lots of dataaaa") universal_request = HttpRequest('GET', 'http://127.0.0.1/', data=data) universal_request.set_streamed_data_body(data) return PipelineResponse(universal_request, MockResponse(), PipelineContext(None, stream=True))
def _set_content_body(content: ContentType, internal_request: _PipelineTransportHttpRequest) -> None: headers = internal_request.headers content_type = headers.get("Content-Type") if _is_stream_or_str_bytes(content): # stream will be bytes / str, or iterator of bytes / str internal_request.set_streamed_data_body(content) if isinstance(content, str) and content: _set_content_length_header("Content-Length", str(len(internal_request.data)), internal_request) _set_content_type_header("text/plain", internal_request) elif isinstance(content, bytes) and content: _set_content_length_header("Content-Length", str(len(internal_request.data)), internal_request) _set_content_type_header("application/octet-stream", internal_request) elif isinstance(content, (Iterable, AsyncIterable)): _set_content_length_header("Transfer-Encoding", "chunked", internal_request) _set_content_type_header("application/octet-stream", internal_request) elif isinstance(content, ET.Element): # XML body internal_request.set_xml_body(content) _set_content_type_header("application/xml", internal_request) _set_content_length_header("Content-Length", str(len(internal_request.data)), internal_request) elif content_type and content_type.startswith("text/"): # Text body internal_request.set_text_body(content) _set_content_length_header("Content-Length", str(len(internal_request.data)), internal_request) else: # Other body internal_request.data = content internal_request.headers = headers
def test_request_stream(self): request = HttpRequest("GET", "/") data = b"Lots of dataaaa" request.set_streamed_data_body(data) self.assertEqual(request.data, data) def data_gen(): for i in range(10): yield i data = data_gen() request.set_streamed_data_body(data) self.assertEqual(request.data, data) data = BytesIO(b"Lots of dataaaa") request.set_streamed_data_body(data) self.assertEqual(request.data, data)
def test_request_stream(): request = HttpRequest("GET", "/") data = b"Lots of dataaaa" request.set_streamed_data_body(data) assert request.data == data def data_gen(): for i in range(10): yield i data = data_gen() request.set_streamed_data_body(data) assert request.data == data data = BytesIO(b"Lots of dataaaa") request.set_streamed_data_body(data) assert request.data == data