+
    }n jô  ã                   óŽ   € ^ RI t ^ RIt^ RIt^ RIt^ RIHtHtHt ^ RIH	t	 ^ RI
HtHtHtHtHt  ! R R] P                   R7      tR# )é    N)ÚAnyÚDictÚOptional)Ú	urlencode)ÚconfigÚhttpÚsystemÚutilÚversionc                   ó¸   a € ] tR t^t o ^tRt]]P                  V 3R lR l4       4       t	RV 3R lR llt
R tRV 3R lR lltV 3R	 lR
 ltV 3R lR ltRtV tR# )ÚUAServiceClientNc                ó    <€ V ^8„  d   QhRS[ /# )é   Úreturn©Ústr)ÚformatÚ__classdict__s   "€Ú=/usr/lib/python3/dist-packages/uaclient/http/serviceclient.pyÚ__annotate__ÚUAServiceClient.__annotate__   s   ø€ ÷ ñ ¡3ñ ó    c                ó   € R# )z@String in subclasses, the UAConfig attribute containing base urlN© ©Úselfs   &r   Úcfg_url_base_attrÚ!UAServiceClient.cfg_url_base_attr   s   € ñ 	r   c                óH   <€ V ^8„  d   QhRS[ S[P                  ,          RR/# )r   Úcfgr   N)r   r   ÚUAConfig)r   r   s   "€r   r   r      s$   ø€ ÷ ñ ™H¡V§_¡_Õ5ð Àñ r   c                óZ   € V'       g   \         P                  ! 4       V n        R # Wn        R # ©N)r   r!   r    )r   r    s   &&r   Ú__init__ÚUAServiceClient.__init__   s   € ßÜ—’Ó(ˆDŽHàŽHr   c                óV   € R RP                  \        P                  ! 4       4      RRRR/# )z
user-agentzUA-Client/{}Úacceptúapplication/jsonúcontent-type)r   r   Úget_versionr   s   &r   ÚheadersÚUAServiceClient.headers   s1   € à˜.×/Ñ/´×0CÒ0CÓ0EÓFØÐ(ØÐ.ð
ð 	
r   c                óP   <€ V ^8„  d   QhRS[ RS[S[,          RS[P                  /# )r   Úlog_response_bodyÚtimeoutr   )Úboolr   Úintr   ÚHTTPResponse)r   r   s   "€r   r   r   %   s5   ø€ ÷ &
ñ &
ñ  ð&
ñ ™#•ð&
ñ 
×	Ñ	ñ&
r   c           	     ó¨  € VP                  R 4      pV'       g   V P                  4       pVP                  R4      R8X  d>   V'       d6   \        P                  ! V\
        P                  R7      P                  R4      p\        P                  ! \        V P                  V P                  4      V4      pV P                  V4      p	V	'       d   V	# V'       dL   \        VP                  4       4       U
Uu/ uF  w  r«Vf   K  W«bK  	  pp
pVR\!        V4      ,           ,          pVe   TMV P"                  p\$        P&                  ! VVVVVVR7      # u upp
i )Ú/r)   r(   )Úclszutf-8Ú?)ÚurlÚdatar+   Úmethodr/   r.   )Úlstripr+   ÚgetÚjsonÚdumpsr
   ÚDatetimeAwareJSONEncoderÚencodeÚ	posixpathÚjoinÚgetattrr    r   Ú_get_fake_responsesÚsortedÚitemsr   Úurl_timeoutr   Úreadurl)r   Úpathr8   r+   r9   Úquery_paramsr.   r/   r7   Úfake_responseÚkÚvÚfiltered_paramsÚtimeout_to_uses   &&&&&&&&      r   Úrequest_urlÚUAServiceClient.request_url%   s  € ð �{‰{˜3ÓˆßØ—l‘l“nˆGØ�;‰;�~Ó&Ð*<Ô<ÇÜ—:’:˜d¬×(EÑ(EÔF×MÑMØóˆDô �nŠnœW T§X¡X¨t×/EÑ/EÓFÈÓMˆà×0Ñ0°Ó5ˆßØ Ð çô "(¨×(:Ñ(:Ó(<Ô!=ôÙ!=™˜À”�’Ñ!=ð ñ ð �3œ ?Ó3Õ3Õ3ˆCØ$+Ò$7™¸T×=MÑ=Mˆä�|Š|ØØØØØ"Ø/ô
ð 	
ùós   Ã1EÃ>Ec                ó    <€ V ^8„  d   QhRS[ /# )r   r7   r   )r   r   s   "€r   r   r   M   s   ø€ ÷  3ñ  3©ñ  3r   c                ó°  € V P                   e   V P                   P                  V. 4      # V P                  P                  P                  R4      pV'       g	   / V n         M\\        P
                  P                  V4      '       g	   / V n         M/\        P                  ! \        P                  ! V4      4      V n         V P                   P                  V. 4      # )aÎ  Return a list of fake response dicts for a given URL.

serviceclient_url_responses in uaclient.conf should be a path
to a json file which contains a dictionary keyed by full URL path.
Each value will be a list of dicts representing each faked response
for the given URL.

    The response dict item will have a code: <HTTP_STATUS_CODE> and
       response: "some string of content".
    The JSON string below fakes the available_resources URL on the
    contract server:
    '{"https://contracts.canonical.com/v1/resources":                [{"code": 200, "response": {"key": "val1", "key2": "val2"}}]}'

:return: List of dicts for each faked response matching the url, or
   and empty list when no matching url found.
Úserviceclient_url_responses)Ú_response_overlayr;   r    ÚfeaturesÚosrH   Úexistsr<   Úloadsr	   Ú	load_file)r   r7   Úresponse_overlay_paths   && r   Ú_get_response_overlayÚ%UAServiceClient._get_response_overlayM   s«   € ð$ ×!Ñ!Ò-à×)Ñ)×-Ñ-¨c°2Ó6Ð6Ø $§¡× 1Ñ 1× 5Ñ 5Ø)ó!
Ð÷ %Ø%'ˆDÕ"Ü—‘—‘Ð 5×6Ò6Ø%'ˆDÕ"ä%)§Z¢ZÜ× Ò Ð!6Ó7ó&ˆDÔ"ð ×%Ñ%×)Ñ)¨#¨rÓ2Ð2r   c                óJ   <€ V ^8„  d   QhRS[ RS[S[P                  ,          /# )r   r7   r   )r   r   r   r2   )r   r   s   "€r   r   r   o   s&   ø€ ÷ 
ñ 
¡sð 
©x¹×8IÑ8IÕ/Jñ 
r   c           	     ó¨  € V P                  V4      pV'       g   R# \        V4      ^8X  d   V^ ,          pMVP                  ^ 4      p/ p. pVR,          p\        V\        4      '       d   TpM\        V\
        4      '       d   Tp\        P                  ! VR,          VP                  R/ 4      \        P                  ! VR,          RR7      VVR7      # )z7Return response if faked for this URL in uaclient.conf.NÚresponseÚcoder+   T)Ú	sort_keys)r`   r+   ÚbodyÚ	json_dictÚ	json_list)r[   ÚlenÚpopÚ
isinstanceÚdictÚlistr   r2   r;   r<   r=   )r   r7   Ú	responsesr_   rc   rd   Úresps   &&     r   rC   Ú#UAServiceClient._get_fake_responseso   s·   € à×.Ñ.¨sÓ3ˆ	ßÙäˆy‹>˜QÔà  •|‰Hð !—}‘} QÓ'ˆHàˆ	Øˆ	Ø˜
Õ#ˆÜ�dœD×!Ò!Ø‰IÜ˜œd×#Ò#ØˆIä× Ò Ø˜&Õ!Ø—L‘L ¨BÓ/Ü—’˜H ZÕ0¸DÔAØØô
ð 	
r   )rT   r    r#   )NNNNTN)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rF   rT   ÚpropertyÚabcÚabstractmethodr   r$   r+   rO   r[   rC   Ú__static_attributes__Ú__classdictcell__)r   s   @r   r   r      sa   ø‡ € à€Kð ÐàØ×Ñ÷ó ó ð÷ò ò
÷&
ò &
÷P 3ð  3÷D
ö 
r   r   )Ú	metaclass)rr   r<   rV   r@   Útypingr   r   r   Úurllib.parser   Úuaclientr   r   r	   r
   r   ÚABCMetar   r   r   r   Ú<module>r{      s2   ðÛ 
Û Û 	Û ß &Ñ &Ý "ç 8Õ 8ô
 §¡÷ 
r   