def request(method, url, **kwargs): """same as requests/requests/api.py request(...)""" global THREADLOCAL time_before_request = default_timer() # timeout (httpx) if 'timeout' in kwargs: timeout = kwargs['timeout'] else: timeout = getattr(THREADLOCAL, 'timeout', None) if timeout is not None: kwargs['timeout'] = timeout # 2 minutes timeout for the requests without timeout timeout = timeout or 120 # ajdust actual timeout timeout += 0.2 # overhead start_time = getattr(THREADLOCAL, 'start_time', time_before_request) if start_time: timeout -= default_timer() - start_time # raise_for_error check_for_httperror = True if 'raise_for_httperror' in kwargs: check_for_httperror = kwargs['raise_for_httperror'] del kwargs['raise_for_httperror'] # requests compatibility if isinstance(url, bytes): url = url.decode() # network network = get_context_network() # do request future = asyncio.run_coroutine_threadsafe( network.request(method, url, **kwargs), get_loop()) try: response = future.result(timeout) except concurrent.futures.TimeoutError as e: raise httpx.TimeoutException('Timeout', request=None) from e # requests compatibility # see also https://www.python-httpx.org/compatibility/#checking-for-4xx5xx-responses response.ok = not response.is_error # update total_time. # See get_time_for_thread() and reset_time_for_thread() if hasattr(THREADLOCAL, 'total_time'): time_after_request = default_timer() THREADLOCAL.total_time += time_after_request - time_before_request # raise an exception if check_for_httperror: raise_for_httperror(response) return response
async def test_request_catches_TimeoutException(method, mock_cache, mocker): exc = httpx.TimeoutException( message='Some error', request='mock request', ) mocker.patch.object(http._client, 'send', AsyncMock(side_effect=exc)) url = 'http://localhost:12345/foo/bar/baz' with pytest.raises(errors.RequestError, match=rf'^{url}: Timeout$') as excinfo: await http._request(method=method, url=url) assert excinfo.value.status_code is None assert excinfo.value.headers == {}
def app2(request: httpx.Request) -> httpx.Response: if request.url.path == "/v1/public/entities/profile/pharmacie-oceane-paris": return httpx.Response( 200, json=json.loads(Path("tests/fixtures/ordoclic/fetchslot-profile.json").read_text()) ) if request.url.path == "/v1/solar/entities/03674d71-b200-4682-8e0a-3ab9687b2b59/reasons": return httpx.Response( 200, json=json.loads(Path("tests/fixtures/ordoclic/fetchslot-reasons.json").read_text()) ) if request.url.path == "/v1/solar/slots/availableSlots": raise httpx.TimeoutException(message="Timeout", request=request) return httpx.Response(403, json={})
def _handle_request( self, method: bytes, url: URL, headers: Headers = None, stream: Union[httpcore.SyncByteStream, httpcore.AsyncByteStream] = None, extensions: dict = None, ) -> Response: request = to_request(method, url, headers, stream) self._requests.append(request) response = self._get_response(request) if response: return response callback = self._get_callback(request) if callback: return callback(request=request, extensions=extensions) raise httpx.TimeoutException( self._explain_that_no_response_was_found(request), request=request )
def raise_exception(request, *args, **kwargs): raise httpx.TimeoutException("description", request=request)
def app2(request: httpx.Request) -> httpx.Response: raise httpx.TimeoutException(message="Timeout", request=request)
def sleep_and_raise(*args, **kwargs): time.sleep(0.51) raise httpx.TimeoutException('timeout')