Ë
    GKÕiê  ã                   óŒ   — d dl Z d dlZd dlZd dlZd dlmZmZmZ d dlm	Z	 d dl
mZmZmZmZmZ  G d„ de j                   ¬«      Zy)é    N)ÚAnyÚDictÚOptional)Ú	urlencode)ÚconfigÚhttpÚsystemÚutilÚversionc                   óì   — e Zd ZdZdZeej                  defd„«       «       Z	dde
ej                     ddfd„Zd„ Z	 	 	 	 	 	 dded	e
e   dej$                  fd
„Zdefd„Zdede
ej$                     fd„Zy)ÚUAServiceClienté   NÚreturnc                  ó   — y)z@String in subclasses, the UAConfig attribute containing base urlN© ©Úselfs    ú=/usr/lib/python3/dist-packages/uaclient/http/serviceclient.pyÚcfg_url_base_attrz!UAServiceClient.cfg_url_base_attr   s   € ð 	ó    Úcfgc                 óJ   — |st        j                  «       | _        y || _        y ©N)r   ÚUAConfigr   )r   r   s     r   Ú__init__zUAServiceClient.__init__   s   € ÙÜ—‘Ó(ˆD�HàˆD�Hr   c                 óP   — dj                  t        j                  «       «      dddœS )NzUA-Client/{}úapplication/json)z
user-agentÚacceptúcontent-type)Úformatr   Úget_versionr   s    r   ÚheaderszUAServiceClient.headers   s)   € à(×/Ñ/´×0CÑ0CÓ0EÓFØ(Ø.ñ
ð 	
r   Úlog_response_bodyÚtimeoutc                 óT  — |j                  d«      }|s| j                  «       }|j                  d«      dk(  r6|r4t        j                  |t
        j                  ¬«      j                  d«      }t        j                  t        | j                  | j                  «      |«      }| j                  |«      }	|	r|	S |r@t        |j                  «       «      D �
�ci c]  \  }
}|€Œ	|
|“Œ }}
}|dt!        |«      z   z  }|�|n| j"                  }t%        j&                  ||||||¬«      S c c}}
w )Nú/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   Úpathr*   r"   r+   Úquery_paramsr#   r$   r)   Úfake_responseÚkÚvÚfiltered_paramsÚtimeout_to_uses                 r   Úrequest_urlz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ˆÙØ Ð áô "(¨×(:Ñ(:Ó(<Ó!=÷Ù˜˜AÀÁ��1‘ðˆOñ ð �3œ ?Ó3Ñ3Ñ3ˆCØ$+Ð$7™¸T×=MÑ=Mˆä�|‰|ØØØØØ"Ø/ô
ð 	
ùós   Ã
D$Ã D$r)   c                 ó�  — | j                   �| j                   j                  |g «      S | j                  j                  j                  d«      }|si | _         nTt        j
                  j                  |«      si | _         n-t        j                  t        j                  |«      «      | _         | j                   j                  |g «      S )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Úosr:   Úexistsr.   Úloadsr	   Ú	load_file)r   r)   Úresponse_overlay_paths      r   Ú_get_response_overlayz%UAServiceClient._get_response_overlayM   s¨   € ð$ ×!Ñ!Ð-à×)Ñ)×-Ñ-¨c°2Ó6Ð6Ø $§¡× 1Ñ 1× 5Ñ 5Ø)ó!
Ðñ %Ø%'ˆDÕ"Ü—‘—‘Ð 5Ô6Ø%'ˆDÕ"ä%)§Z¡ZÜ× Ñ Ð!6Ó7ó&ˆDÔ"ð ×%Ñ%×)Ñ)¨#¨rÓ2Ð2r   c                 óZ  — | j                  |«      }|syt        |«      dk(  r|d   }n|j                  d«      }i }g }|d   }t        |t        «      r|}nt        |t
        «      r|}t        j                  |d   |j                  di «      t        j                  |d   d¬«      ||¬	«      S )
z7Return response if faked for this URL in uaclient.conf.Né   r   ÚresponseÚcoder"   T)Ú	sort_keys)rO   r"   ÚbodyÚ	json_dictÚ	json_list)rK   ÚlenÚpopÚ
isinstanceÚdictÚlistr   ÚHTTPResponser-   r.   r/   )r   r)   Ú	responsesrN   rR   rS   Úresps          r   r5   z#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   r   )NNNNTN)Ú__name__Ú
__module__Ú__qualname__r8   rD   ÚpropertyÚabcÚabstractmethodÚstrr   r   r   r   r   r"   ÚboolÚintr   rY   rA   rK   r5   r   r   r   r   r      sÄ   „ à€Kð ÐàØ×Ñð 3ò ó ó ðñ˜H V§_¡_Ñ5ð Àó ò
ð ØØØØ"&Ø!%ñ&
ð  ð&
ð ˜#‘ð&
ð 
×	Ñ	ó&
ðP 3¨ó  3ðD
 sð 
¨x¸×8IÑ8IÑ/Jô 
r   r   )Ú	metaclass)r`   r.   rF   r2   Útypingr   r   r   Úurllib.parser   Úuaclientr   r   r	   r
   r   ÚABCMetar   r   r   r   ú<module>rj      s2   ðÛ 
Û Û 	Û ß &Ñ &Ý "ç 8Õ 8ô
 §¡ö 
r   