
Ke                 @   s   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 Gd d   d d e  j Z d S)    N)AnyDictOptional)	urlencode)confighttpsystemutilversionc               @   s   e  Z d  Z d Z d Z e e j e d d d      Z	 d e
 e j d d d d   Z d	 d
   Z d d d d d d e e
 e e j d d d   Z e d d d    Z e e
 e j d d d    Z d S)UAServiceClient   N)returnc             C   s   d S)z@String in subclasses, the UAConfig attribute containing base urlN )selfr   r   =/usr/lib/python3/dist-packages/uaclient/http/serviceclient.pycfg_url_base_attr   s    z!UAServiceClient.cfg_url_base_attr)cfgr   c             C   s%   | s t  j   |  _ n	 | |  _ d  S)N)r   UAConfigr   )r   r   r   r   r   __init__   s    zUAServiceClient.__init__c             C   s%   d d j  t j    d d d d i S)Nz
user-agentzUA-Client/{}Zacceptzapplication/jsonzcontent-type)formatr
   Zget_version)r   r   r   r   headers   s    zUAServiceClient.headersT)log_response_bodytimeoutr   c             C   s  | j  d  } | s! |  j   } | j d  d k r] | r] t j | d t j j d  } t j	 t
 |  j |  j  |  } |  j |  }	 |	 r |	 S| r d d   t | j    D }
 | d t |
  7} | d  k	 r | n |  j } t j d	 | d
 | d | d | d | d |  S)N/zcontent-typezapplication/jsonclszutf-8c             S   s+   i  |  ]! \ } } | d  k	 r | |  q S)Nr   ).0kvr   r   r   
<dictcomp>>   s   	z/UAServiceClient.request_url.<locals>.<dictcomp>?urldatar   methodr   r   )lstripr   getjsondumpsr	   ZDatetimeAwareJSONEncoderencode	posixpathjoingetattrr   r   _get_fake_responsessorteditemsr   url_timeoutr   Zreadurl)r   pathr!   r   r"   Zquery_paramsr   r   r    Zfake_responseZfiltered_paramsZtimeout_to_user   r   r   request_url%   s,    
	!		zUAServiceClient.request_url)r    c             C   s   |  j  d k	 r" |  j  j | g   S|  j j j d  } | sI i  |  _  n9 t j j |  sg 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.
        NZserviceclient_url_responses)_response_overlayr$   r   Zfeaturesosr/   existsr%   loadsr   Z	load_file)r   r    Zresponse_overlay_pathr   r   r   _get_response_overlayM   s    	z%UAServiceClient._get_response_overlay)r    r   c             C   s   |  j  |  } | s d St |  d k r8 | d } n | j d  } i  } g  } | d } t | t  ru | } n t | t  r | } t j d | d d | j d i   d t	 j
 | d d d	 d
 | d |  S)z7Return response if faked for this URL in uaclient.conf.N   r   responsecoder   ZbodyZ	sort_keysT	json_dict	json_list)r5   lenpop
isinstancedictlistr   HTTPResponser$   r%   r&   )r   r    Z	responsesr7   r9   r:   Zrespr   r   r   r+   o   s&    
		
z#UAServiceClient._get_fake_responses)__name__
__module____qualname__r.   r1   propertyabcabstractmethodstrr   r   r   r   r   r   boolintr   r@   r0   r5   r+   r   r   r   r   r      s    "
"r   	metaclass)rE   r%   r2   r(   Ztypingr   r   r   Zurllib.parser   Zuaclientr   r   r   r	   r
   ABCMetar   r   r   r   r   <module>   s   (