Example #1
0
 async def __anext__(self):
     internal_response = self.response.internal_response
     try:
         chunk = await internal_response.content.read(self.block_size)
         if not chunk:
             raise _ResponseStopIteration()
         if not self._decompress:
             return chunk
         enc = internal_response.headers.get('Content-Encoding')
         if not enc:
             return chunk
         enc = enc.lower()
         if enc in ("gzip", "deflate"):
             if not self._decompressor:
                 import zlib
                 zlib_mode = 16 + zlib.MAX_WBITS if enc == "gzip" else zlib.MAX_WBITS
                 self._decompressor = zlib.decompressobj(wbits=zlib_mode)
             chunk = self._decompressor.decompress(chunk)
         return chunk
     except _ResponseStopIteration:
         internal_response.close()
         raise StopAsyncIteration()
     except aiohttp.client_exceptions.ClientPayloadError as err:
         # This is the case that server closes connection before we finish the reading. aiohttp library
         # raises ClientPayloadError.
         _LOGGER.warning("Incomplete download: %s", err)
         internal_response.close()
         raise IncompleteReadError(err, error=err)
     except Exception as err:
         _LOGGER.warning("Unable to stream download: %s", err)
         internal_response.close()
         raise
 async def __anext__(self):
     internal_response = self.response.internal_response
     try:
         try:
             chunk = await trio.to_thread.run_sync(
                 _iterate_response_content,
                 self.iter_content_func,
             )
         except AttributeError:  # trio < 0.12.1
             chunk = await trio.run_sync_in_worker_thread(  # pylint: disable=no-member
                 _iterate_response_content,
                 self.iter_content_func,
             )
         if not chunk:
             raise _ResponseStopIteration()
         return chunk
     except _ResponseStopIteration:
         internal_response.close()
         raise StopAsyncIteration()
     except requests.exceptions.StreamConsumedError:
         raise
     except requests.exceptions.ChunkedEncodingError as err:
         msg = err.__str__()
         if 'IncompleteRead' in msg:
             _LOGGER.warning("Incomplete download: %s", err)
             internal_response.close()
             raise IncompleteReadError(err, error=err)
         _LOGGER.warning("Unable to stream download: %s", err)
         internal_response.close()
         raise HttpResponseError(err, error=err)
     except Exception as err:
         _LOGGER.warning("Unable to stream download: %s", err)
         internal_response.close()
         raise
 def __next__(self):
     internal_response = self.response.internal_response
     try:
         chunk = next(self.iter_content_func)
         if not chunk:
             raise StopIteration()
         return chunk
     except StopIteration:
         internal_response.close()
         raise StopIteration()
     except requests.exceptions.StreamConsumedError:
         raise
     except requests.exceptions.ContentDecodingError as err:
         raise DecodeError(err, error=err)
     except requests.exceptions.ChunkedEncodingError as err:
         msg = err.__str__()
         if 'IncompleteRead' in msg:
             _LOGGER.warning("Incomplete download: %s", err)
             internal_response.close()
             raise IncompleteReadError(err, error=err)
         _LOGGER.warning("Unable to stream download: %s", err)
         internal_response.close()
         raise HttpResponseError(err, error=err)
     except Exception as err:
         _LOGGER.warning("Unable to stream download: %s", err)
         internal_response.close()
         raise
 async def __anext__(self):
     loop = _get_running_loop()
     internal_response = self.response.internal_response
     try:
         chunk = await loop.run_in_executor(
             None,
             _iterate_response_content,
             self.iter_content_func,
         )
         if not chunk:
             raise _ResponseStopIteration()
         return chunk
     except _ResponseStopIteration:
         internal_response.close()
         raise StopAsyncIteration()
     except requests.exceptions.StreamConsumedError:
         raise
     except requests.exceptions.ChunkedEncodingError as err:
         msg = err.__str__()
         if 'IncompleteRead' in msg:
             _LOGGER.warning("Incomplete download: %s", err)
             internal_response.close()
             raise IncompleteReadError(err, error=err)
         _LOGGER.warning("Unable to stream download: %s", err)
         internal_response.close()
         raise HttpResponseError(err, error=err)
     except Exception as err:
         _LOGGER.warning("Unable to stream download: %s", err)
         internal_response.close()
         raise
Example #5
0
 async def load_body(self) -> None:
     """Load in memory the body, so it could be accessible from sync methods."""
     try:
         self._content = await self.internal_response.read()
     except aiohttp.client_exceptions.ClientPayloadError as err:
         # This is the case that server closes connection before we finish the reading. aiohttp library
         # raises ClientPayloadError.
         raise IncompleteReadError(err, error=err)
    async def send(self, request, **kwargs: Any):  # pylint:disable=invalid-overridden-method
        """Send the request using this HTTP sender.

        :param request: The HttpRequest
        :type request: ~azure.core.pipeline.transport.HttpRequest
        :return: The AsyncHttpResponse
        :rtype: ~azure.core.pipeline.transport.AsyncHttpResponse

        :keyword requests.Session session: will override the driver session and use yours.
         Should NOT be done unless really required. Anything else is sent straight to requests.
        :keyword dict proxies: will define the proxy to use. Proxy is a dict (protocol, url)
        """
        self.open()
        trio_limiter = kwargs.get("trio_limiter", None)
        response = None
        error = None  # type: Optional[AzureErrorUnion]
        data_to_send = await self._retrieve_request_data(request)
        try:
            try:
                response = await trio.to_thread.run_sync(functools.partial(
                    self.session.request,
                    request.method,
                    request.url,
                    headers=request.headers,
                    data=data_to_send,
                    files=request.files,
                    verify=kwargs.pop('connection_verify',
                                      self.connection_config.verify),
                    timeout=kwargs.pop('connection_timeout',
                                       self.connection_config.timeout),
                    cert=kwargs.pop('connection_cert',
                                    self.connection_config.cert),
                    allow_redirects=False,
                    **kwargs),
                                                         limiter=trio_limiter)
            except AttributeError:  # trio < 0.12.1
                response = await trio.run_sync_in_worker_thread(  # pylint: disable=no-member
                    functools.partial(
                        self.session.request,
                        request.method,
                        request.url,
                        headers=request.headers,
                        data=request.data,
                        files=request.files,
                        verify=kwargs.pop('connection_verify',
                                          self.connection_config.verify),
                        timeout=kwargs.pop('connection_timeout',
                                           self.connection_config.timeout),
                        cert=kwargs.pop('connection_cert',
                                        self.connection_config.cert),
                        allow_redirects=False,
                        **kwargs),
                    limiter=trio_limiter)
            response.raw.enforce_content_length = True

        except urllib3.exceptions.NewConnectionError as err:
            error = ServiceRequestError(err, error=err)
        except requests.exceptions.ReadTimeout as err:
            error = ServiceResponseError(err, error=err)
        except requests.exceptions.ConnectionError as err:
            if err.args and isinstance(err.args[0],
                                       urllib3.exceptions.ProtocolError):
                error = ServiceResponseError(err, error=err)
            else:
                error = ServiceRequestError(err, error=err)
        except requests.exceptions.ChunkedEncodingError as err:
            msg = err.__str__()
            if 'IncompleteRead' in msg:
                _LOGGER.warning("Incomplete download: %s", err)
                error = IncompleteReadError(err, error=err)
            else:
                _LOGGER.warning("Unable to stream download: %s", err)
                error = HttpResponseError(err, error=err)
        except requests.RequestException as err:
            error = ServiceRequestError(err, error=err)

        if error:
            raise error
        if _is_rest(request):
            from azure.core.rest._requests_trio import RestTrioRequestsTransportResponse
            retval = RestTrioRequestsTransportResponse(
                request=request,
                internal_response=response,
                block_size=self.connection_config.data_block_size,
            )
            if not kwargs.get("stream"):
                await _handle_no_stream_rest_response(retval)
            return retval

        return TrioRequestsTransportResponse(
            request, response, self.connection_config.data_block_size)
    def send(self, request, **kwargs): # type: ignore
        """Send request object according to configuration.

        :param request: The request object to be sent.
        :type request: ~azure.core.pipeline.transport.HttpRequest
        :return: An HTTPResponse object.
        :rtype: ~azure.core.pipeline.transport.HttpResponse

        :keyword requests.Session session: will override the driver session and use yours.
         Should NOT be done unless really required. Anything else is sent straight to requests.
        :keyword dict proxies: will define the proxy to use. Proxy is a dict (protocol, url)
        """
        self.open()
        response = None
        error = None    # type: Optional[AzureErrorUnion]

        try:
            connection_timeout = kwargs.pop('connection_timeout', self.connection_config.timeout)

            if isinstance(connection_timeout, tuple):
                if 'read_timeout' in kwargs:
                    raise ValueError('Cannot set tuple connection_timeout and read_timeout together')
                _LOGGER.warning("Tuple timeout setting is deprecated")
                timeout = connection_timeout
            else:
                read_timeout = kwargs.pop('read_timeout', self.connection_config.read_timeout)
                timeout = (connection_timeout, read_timeout)
            response = self.session.request(  # type: ignore
                request.method,
                request.url,
                headers=request.headers,
                data=request.data,
                files=request.files,
                verify=kwargs.pop('connection_verify', self.connection_config.verify),
                timeout=timeout,
                cert=kwargs.pop('connection_cert', self.connection_config.cert),
                allow_redirects=False,
                **kwargs)
            response.raw.enforce_content_length = True

        except (urllib3.exceptions.NewConnectionError, urllib3.exceptions.ConnectTimeoutError) as err:
            error = ServiceRequestError(err, error=err)
        except requests.exceptions.ReadTimeout as err:
            error = ServiceResponseError(err, error=err)
        except requests.exceptions.ConnectionError as err:
            if err.args and isinstance(err.args[0], urllib3.exceptions.ProtocolError):
                error = ServiceResponseError(err, error=err)
            else:
                error = ServiceRequestError(err, error=err)
        except requests.exceptions.ChunkedEncodingError as err:
            msg = err.__str__()
            if 'IncompleteRead' in msg:
                _LOGGER.warning("Incomplete download: %s", err)
                error = IncompleteReadError(err, error=err)
            else:
                _LOGGER.warning("Unable to stream download: %s", err)
                error = HttpResponseError(err, error=err)
        except requests.RequestException as err:
            error = ServiceRequestError(err, error=err)

        if error:
            raise error
        if _is_rest(request):
            from azure.core.rest._requests_basic import RestRequestsTransportResponse
            retval = RestRequestsTransportResponse(
                request=request,
                internal_response=response,
                block_size=self.connection_config.data_block_size
            )
            if not kwargs.get('stream'):
                _handle_non_stream_rest_response(retval)
            return retval
        return RequestsTransportResponse(request, response, self.connection_config.data_block_size)