@@ -286,6 +286,7 @@ def _request(
286286 json : Optional [Any ] = None ,
287287 headers : Optional [HeaderTypes ] = None ,
288288 cookies : Optional [CookieTypes ] = None ,
289+ stream : bool = False ,
289290 ) -> httpx .Response :
290291 with self .get_sync_client () as client :
291292 request = client .build_request (
@@ -301,7 +302,7 @@ def _request(
301302 )
302303 with self .config .throttler .acquire (request ):
303304 try :
304- return client .send (request )
305+ return client .send (request , stream = stream )
305306 except httpx .TimeoutException as e :
306307 raise RequestTimeout (e ) from e
307308 except Exception as e :
@@ -320,6 +321,7 @@ async def _arequest(
320321 json : Optional [Any ] = None ,
321322 headers : Optional [HeaderTypes ] = None ,
322323 cookies : Optional [CookieTypes ] = None ,
324+ stream : bool = False ,
323325 ) -> httpx .Response :
324326 async with (
325327 self .get_async_client () as client ,
@@ -337,7 +339,7 @@ async def _arequest(
337339 )
338340 async with self .config .throttler .async_acquire (request ):
339341 try :
340- return await client .send (request )
342+ return await client .send (request , stream = stream )
341343 except httpx .TimeoutException as e :
342344 raise RequestTimeout (e ) from e
343345 except Exception as e :
@@ -360,13 +362,17 @@ def _check(
360362 error_models : Optional [Mapping [str , type ]] = None ,
361363 ) -> Response [Any ]: ...
362364
365+ def _check_is_error (self , response : httpx .Response ) -> bool :
366+ """Check if the response is an error."""
367+ return response .is_error
368+
363369 def _check (
364370 self ,
365371 response : httpx .Response ,
366372 response_model : Union [type [T ], UnsetType ] = UNSET ,
367373 error_models : Optional [Mapping [str , type ]] = None ,
368374 ) -> Union [Response [T ], Response [Any ]]:
369- if response . is_error :
375+ if self . _check_is_error ( response ) :
370376 error_models = error_models or {}
371377 status_code = str (response .status_code )
372378
@@ -386,7 +392,7 @@ def _check(
386392 if response .status_code in (403 , 429 ):
387393 self ._check_rate_limit (resp )
388394
389- if response . is_error :
395+ if self . _check_is_error ( response ) :
390396 raise RequestFailed (resp )
391397 return resp
392398
@@ -453,6 +459,7 @@ def request(
453459 json : Optional [Any ] = None ,
454460 headers : Optional [HeaderTypes ] = None ,
455461 cookies : Optional [CookieTypes ] = None ,
462+ stream : bool = False ,
456463 response_model : type [T ],
457464 error_models : Optional [Mapping [str , type ]] = None ,
458465 ) -> Response [T ]: ...
@@ -470,6 +477,7 @@ def request(
470477 json : Optional [Any ] = None ,
471478 headers : Optional [HeaderTypes ] = None ,
472479 cookies : Optional [CookieTypes ] = None ,
480+ stream : bool = False ,
473481 response_model : UnsetType = UNSET ,
474482 error_models : Optional [Mapping [str , type ]] = None ,
475483 ) -> Response [Any ]: ...
@@ -486,6 +494,7 @@ def request(
486494 json : Optional [Any ] = None ,
487495 headers : Optional [HeaderTypes ] = None ,
488496 cookies : Optional [CookieTypes ] = None ,
497+ stream : bool = False ,
489498 response_model : Union [type [T ], UnsetType ] = UNSET ,
490499 error_models : Optional [Mapping [str , type ]] = None ,
491500 ) -> Union [Response [T ], Response [Any ]]:
@@ -507,7 +516,12 @@ def request(
507516 json = json ,
508517 headers = headers ,
509518 cookies = cookies ,
519+ stream = stream ,
510520 )
521+ if self ._check_is_error (raw_resp ) and stream :
522+ # if the response is an error and stream is True,
523+ # we need to read the response first
524+ raw_resp .read ()
511525 return self ._check (raw_resp , response_model , error_models )
512526 except GitHubException as e :
513527 if self .config .auto_retry is None :
@@ -535,6 +549,7 @@ async def arequest(
535549 json : Optional [Any ] = None ,
536550 headers : Optional [HeaderTypes ] = None ,
537551 cookies : Optional [CookieTypes ] = None ,
552+ stream : bool = False ,
538553 response_model : type [T ],
539554 error_models : Optional [Mapping [str , type ]] = None ,
540555 ) -> Response [T ]: ...
@@ -552,6 +567,7 @@ async def arequest(
552567 json : Optional [Any ] = None ,
553568 headers : Optional [HeaderTypes ] = None ,
554569 cookies : Optional [CookieTypes ] = None ,
570+ stream : bool = False ,
555571 response_model : UnsetType = UNSET ,
556572 error_models : Optional [Mapping [str , type ]] = None ,
557573 ) -> Response [Any ]: ...
@@ -568,6 +584,7 @@ async def arequest(
568584 json : Optional [Any ] = None ,
569585 headers : Optional [HeaderTypes ] = None ,
570586 cookies : Optional [CookieTypes ] = None ,
587+ stream : bool = False ,
571588 response_model : Union [type [T ], UnsetType ] = UNSET ,
572589 error_models : Optional [Mapping [str , type ]] = None ,
573590 ) -> Union [Response [T ], Response [Any ]]:
@@ -589,7 +606,12 @@ async def arequest(
589606 json = json ,
590607 headers = headers ,
591608 cookies = cookies ,
609+ stream = stream ,
592610 )
611+ if self ._check_is_error (raw_resp ) and stream :
612+ # if the response is an error and stream is True,
613+ # we need to read the response first
614+ await raw_resp .aread ()
593615 return self ._check (raw_resp , response_model , error_models )
594616 except GitHubException as e :
595617 if self .config .auto_retry is None :
0 commit comments