@@ -478,6 +478,57 @@ def _request(
478478 stream_cls = stream_cls ,
479479 )
480480
481+ def _request_without_retry (self ,
482+ * ,
483+ cast_to : Type [ResponseT ],
484+ options : RequestOptions ,
485+ stream : bool ,
486+ stream_cls : type [_StreamT ] | None ,
487+ ) -> ResponseT | _StreamT :
488+ request = self ._build_request (options )
489+ req_id = request .headers .get (CLIENT_REQUEST_HEADER , "" )
490+ try :
491+ response = self ._client .send (
492+ request ,
493+ stream = stream or self ._should_stream_response_body (request = request ),
494+ )
495+ except httpx .TimeoutException as err :
496+ log .debug ("Raising timeout error" )
497+ raise ArkAPITimeoutError (request = request , request_id = req_id ) from err
498+ except Exception as err :
499+ log .debug ("Encountered Exception" , exc_info = True )
500+ log .debug ("Raising connection error" )
501+ raise ArkAPIConnectionError (request = request , request_id = req_id ) from err
502+
503+ log .debug (
504+ 'HTTP Request: %s %s "%i %s"' ,
505+ request .method ,
506+ request .url ,
507+ response .status_code ,
508+ response .reason_phrase ,
509+ )
510+
511+ try :
512+ response .raise_for_status ()
513+ except httpx .HTTPStatusError as err : # thrown on 4xx and 5xx status code
514+ log .debug ("Encountered httpx.HTTPStatusError" , exc_info = True )
515+ # If the response is streamed then we need to explicitly read the response
516+ # to completion before attempting to access the response text.
517+ if not err .response .is_closed :
518+ err .response .read ()
519+
520+ log .debug ("Re-raising status error" )
521+ raise self ._make_status_error_from_response (
522+ err .response , request_id = req_id
523+ ) from None
524+
525+ return self ._process_response (
526+ cast_to = cast_to ,
527+ response = response ,
528+ stream = stream ,
529+ stream_cls = stream_cls ,
530+ )
531+
481532 def _retry_request (
482533 self ,
483534 options : RequestOptions ,
@@ -595,6 +646,28 @@ def delete(
595646
596647 return cast (ResponseT , self .request (cast_to , opts ))
597648
649+ def post_without_retry (
650+ self ,
651+ path : str ,
652+ * ,
653+ cast_to : Type [ResponseT ],
654+ body : Dict | None = None ,
655+ options : ExtraRequestOptions = {},
656+ files : RequestFiles | None = None ,
657+ stream : bool = False ,
658+ stream_cls : type [_StreamT ] | None = None ,
659+ ) -> ResponseT | _StreamT :
660+ opts = RequestOptions .construct ( # type: ignore
661+ method = "post" ,
662+ url = path ,
663+ body = body ,
664+ ** options ,
665+ )
666+
667+ return cast (
668+ ResponseT , self .request_without_retry (cast_to , opts , stream = stream , stream_cls = stream_cls )
669+ )
670+
598671 def request (
599672 self ,
600673 cast_to : Type [ResponseT ],
@@ -612,6 +685,21 @@ def request(
612685 remaining_retries = remaining_retries ,
613686 )
614687
688+ def request_without_retry (
689+ self ,
690+ cast_to : Type [ResponseT ],
691+ options : RequestOptions ,
692+ * ,
693+ stream : bool = False ,
694+ stream_cls : type [_StreamT ] | None = None ,
695+ ) -> ResponseT | _StreamT :
696+ return self ._request_without_retry (
697+ cast_to = cast_to ,
698+ options = options ,
699+ stream = stream ,
700+ stream_cls = stream_cls ,
701+ )
702+
615703 def is_closed (self ) -> bool :
616704 return self ._client .is_closed
617705
@@ -755,6 +843,27 @@ async def delete(
755843
756844 return await self .request (cast_to , opts )
757845
846+
847+ async def post_without_retry (
848+ self ,
849+ path : str ,
850+ * ,
851+ cast_to : Type [ResponseT ],
852+ body : Dict | None = None ,
853+ options : ExtraRequestOptions = {},
854+ files : RequestFiles | None = None ,
855+ stream : bool = False ,
856+ stream_cls : type [_AsyncStreamT ] | None = None ,
857+ ) -> ResponseT | _AsyncStreamT :
858+ opts = RequestOptions .construct (
859+ method = "post" ,
860+ url = path ,
861+ body = body ,
862+ ** options ,
863+ )
864+
865+ return await self .request_without_retry (cast_to , opts , stream = stream , stream_cls = stream_cls )
866+
758867 async def request (
759868 self ,
760869 cast_to : Type [ResponseT ],
@@ -772,6 +881,21 @@ async def request(
772881 remaining_retries = remaining_retries ,
773882 )
774883
884+ async def request_without_retry (
885+ self ,
886+ cast_to : Type [ResponseT ],
887+ options : RequestOptions ,
888+ * ,
889+ stream : bool = False ,
890+ stream_cls : type [_StreamT ] | None = None ,
891+ ) -> ResponseT | _StreamT :
892+ return await self ._request_without_retry (
893+ cast_to = cast_to ,
894+ options = options ,
895+ stream = stream ,
896+ stream_cls = stream_cls ,
897+ )
898+
775899 async def _request (
776900 self ,
777901 * ,
@@ -859,6 +983,57 @@ async def _request(
859983 stream_cls = stream_cls ,
860984 )
861985
986+ async def _request_without_retry (
987+ self ,
988+ * ,
989+ cast_to : Type [ResponseT ],
990+ options : RequestOptions ,
991+ stream : bool ,
992+ stream_cls : type [_AsyncStreamT ] | None ,
993+ ) -> ResponseT | _AsyncStreamT :
994+ request = self ._build_request (options )
995+ req_id = request .headers .get (CLIENT_REQUEST_HEADER , "" )
996+ try :
997+ response = await self ._client .send (
998+ request ,
999+ stream = stream or self ._should_stream_response_body (request = request ),
1000+ )
1001+ except httpx .TimeoutException as err :
1002+ log .debug ("Raising timeout error" )
1003+ raise ArkAPITimeoutError (request = request , request_id = req_id ) from err
1004+ except Exception as err :
1005+ log .debug ("Encountered Exception" , exc_info = True )
1006+ log .debug ("Raising connection error" )
1007+ raise ArkAPIConnectionError (request = request , request_id = req_id ) from err
1008+ log .debug (
1009+ 'HTTP Request: %s %s "%i %s"' ,
1010+ request .method ,
1011+ request .url ,
1012+ response .status_code ,
1013+ response .reason_phrase ,
1014+ )
1015+ try :
1016+ response .raise_for_status ()
1017+ except httpx .HTTPStatusError as err : # thrown on 4xx and 5xx status code
1018+ log .debug ("Encountered httpx.HTTPStatusError" , exc_info = True )
1019+
1020+ # If the response is streamed then we need to explicitly read the response
1021+ # to completion before attempting to access the response text.
1022+ if not err .response .is_closed :
1023+ await err .response .aread ()
1024+
1025+ log .debug ("Re-raising status error" )
1026+ raise self ._make_status_error_from_response (
1027+ err .response , request_id = req_id
1028+ ) from None
1029+
1030+ return await self ._process_response (
1031+ cast_to = cast_to ,
1032+ response = response ,
1033+ stream = stream ,
1034+ stream_cls = stream_cls ,
1035+ )
1036+
8621037 async def _retry_request (
8631038 self ,
8641039 options : RequestOptions ,
0 commit comments