2121from pulp_glue .common .exceptions import (
2222 OpenAPIError ,
2323 PulpAuthenticationFailed ,
24- PulpException ,
2524 PulpHTTPError ,
2625 PulpNotAutorized ,
2726 UnsafeCallError ,
4140
4241@dataclass
4342class _Request :
43+ operation_id : str
4444 method : str
45+ url : str
4546 headers : MutableMultiMapping [str ] | CIMultiDictProxy [str ] | t .MutableMapping [str , str ]
46- body : bytes | None
47+ params : dict [str , str ]
48+ data : dict [str , t .Any ] | str | None
49+ files : list [tuple [str , tuple [str , UploadType , str ]]] | None
50+ security : list [dict [str , list [str ]]] | None
4751
4852
4953@dataclass
@@ -515,7 +519,7 @@ def _render_request_body(
515519
516520 return content_type , data , files
517521
518- async def _send_request (
522+ def _render_request (
519523 self ,
520524 path_spec : dict [str , t .Any ],
521525 method : str ,
@@ -524,11 +528,11 @@ async def _send_request(
524528 headers : dict [str , str ],
525529 body : dict [str , t .Any ] | None = None ,
526530 validate_body : bool = True ,
527- ) -> _Response :
531+ ) -> _Request :
528532 method_spec = path_spec [method ]
529533 _headers = CIMultiDict (self ._headers )
530534 _headers .update (headers )
531- content_type , data , files = self . _render_request_body ( method_spec , body , validate_body )
535+
532536 security : list [dict [str , list [str ]]] | None
533537 if self ._auth_provider and "Authorization" not in self ._headers :
534538 security = method_spec .get ("security" , self .api_spec .get ("security" ))
@@ -538,34 +542,60 @@ async def _send_request(
538542 # Authorization header present? You wanted it that way...
539543 security = None
540544
545+ content_type , data , files = self ._render_request_body (method_spec , body , validate_body )
541546 # For we encode the json on our side.
542547 # Somehow this does not work properly for multipart...
543548 if content_type is not None and content_type .startswith ("application/json" ):
544549 _headers ["Content-Type" ] = content_type
545550
546- for key , value in headers .items ():
547- self ._debug_callback (2 , f" { key } : { value } " )
548- if data is not None :
549- self ._debug_callback (3 , f"{ data !r} " )
551+ return _Request (
552+ operation_id = method_spec ["operationId" ],
553+ method = method ,
554+ url = url ,
555+ headers = _headers ,
556+ params = params ,
557+ data = data ,
558+ files = files ,
559+ security = security ,
560+ )
550561
551- if self ._dry_run and method .upper () not in SAFE_METHODS :
552- raise UnsafeCallError (_ ("Call aborted due to safe mode" ))
562+ def _log_request (self , request : _Request ) -> None :
563+ if request .params :
564+ qs = urlencode (request .params )
565+ log_msg = f"{ request .operation_id } : { request .method } { request .url } ?{ qs } "
566+ else :
567+ log_msg = f"{ request .operation_id } : { request .method } { request .url } "
568+ self ._debug_callback (1 , log_msg )
569+ self ._debug_callback (
570+ 2 , "\n " .join ([f" { key } =={ value } " for key , value in request .params .items ()])
571+ )
572+ for key , value in request .headers .items ():
573+ self ._debug_callback (2 , f" { key } : { value } " )
574+ if request .data is not None :
575+ self ._debug_callback (3 , f"{ request .data !r} " )
553576
577+ async def _send_request (
578+ self ,
579+ request : _Request ,
580+ ) -> _Response :
554581 try :
555582 async with aiohttp .ClientSession () as session :
556583 async with session .request (
557- method ,
558- url ,
559- params = params ,
560- headers = _headers ,
561- data = data ,
562- # files=files,
584+ request . method ,
585+ request . url ,
586+ params = request . params ,
587+ headers = request . headers ,
588+ data = request . data ,
589+ # files=request. files,
563590 ssl = self .ssl_context ,
564591 max_redirects = 0 ,
565- middlewares = [_Middleware (self , security )],
566- ) as response :
592+ middlewares = [_Middleware (self , request . security )],
593+ ) as r :
567594 # response.raise_for_status()
568- response_body = await response .read ()
595+ response_body = await r .read ()
596+ response = _Response (
597+ status_code = r .status , headers = r .headers , body = response_body
598+ )
569599 except aiohttp .TooManyRedirects as e :
570600 # We could handle that in the middleware...
571601 assert e .history [- 1 ] is not None
@@ -577,25 +607,25 @@ async def _send_request(
577607 except aiohttp .ClientResponseError as e :
578608 raise OpenAPIError (str (e ))
579609
580- self ._debug_callback (1 , _ ("Response: {status_code}" ).format (status_code = response .status ))
610+ return response
611+
612+ def _log_response (self , response : _Response ) -> None :
613+ self ._debug_callback (
614+ 1 , _ ("Response: {status_code}" ).format (status_code = response .status_code )
615+ )
581616 for key , value in response .headers .items ():
582617 self ._debug_callback (2 , f" { key } : { value } " )
583- if response_body :
584- self ._debug_callback (3 , f"{ response_body !r} " )
618+ if response . body :
619+ self ._debug_callback (3 , f"{ response . body !r} " )
585620
586- if response .status == 401 :
621+ def _parse_response (self , method_spec : dict [str , t .Any ], response : _Response ) -> t .Any :
622+ if response .status_code == 401 :
587623 raise PulpAuthenticationFailed (method_spec ["operationId" ])
588- if response .status == 403 :
624+ elif response .status_code == 403 :
589625 raise PulpNotAutorized (method_spec ["operationId" ])
590- try :
591- response .raise_for_status ()
592- except aiohttp .ClientResponseError as e :
593- raise PulpHTTPError (str (e ), e .status )
594- except aiohttp .ClientError as e :
595- raise PulpException (str (e ))
596- return _Response (status_code = response .status , headers = response .headers , body = response_body )
626+ elif response .status_code >= 300 :
627+ raise PulpHTTPError (response .body .decode (), response .status_code )
597628
598- def _parse_response (self , method_spec : dict [str , t .Any ], response : _Response ) -> t .Any :
599629 if response .status_code == 204 :
600630 return {}
601631
@@ -668,26 +698,21 @@ def call(
668698 )
669699 url = urljoin (self ._base_url , path )
670700
671- if query_params :
672- qs = urlencode ( query_params )
673- log_msg = f" { operation_id } : { method } { url } ? { qs } "
674- else :
675- log_msg = f" { operation_id } : { method } { url } "
676- self . _debug_callback ( 1 , log_msg )
677- self . _debug_callback (
678- 2 , " \n " . join ([ f" { key } == { value } " for key , value in query_params . items ()])
701+ request = self . _render_request (
702+ path_spec ,
703+ method ,
704+ url ,
705+ query_params ,
706+ headers ,
707+ body ,
708+ validate_body = validate_body ,
679709 )
710+ self ._log_request (request )
680711
681- response = asyncio .run (
682- self ._send_request (
683- path_spec ,
684- method ,
685- url ,
686- query_params ,
687- headers ,
688- body ,
689- validate_body = validate_body ,
690- )
691- )
712+ if self ._dry_run and request .method .upper () not in SAFE_METHODS :
713+ raise UnsafeCallError (_ ("Call aborted due to safe mode" ))
714+
715+ response = asyncio .run (self ._send_request (request ))
692716
717+ self ._log_response (response )
693718 return self ._parse_response (method_spec , response )
0 commit comments