!V1fddlZddlZddlZddlZddlmZmZmZddlm Z ddl m Z m Z m Z mZmZGddej Zy)N)AnyDictOptional) urlencode)confighttpsystemutilversionceZdZdZdZeejdefdZ dde e jddfdZ dZ dded e edej$fd Zd efd Zd ede ej$fd Zy)UAServiceClientNreturncy)z@String in subclasses, the UAConfig attribute containing base urlNselfs =/usr/lib/python3/dist-packages/uaclient/http/serviceclient.pycfg_url_base_attrz!UAServiceClient.cfg_url_base_attrs cfgcJ|stj|_y||_yN)rUAConfigr)rrs r__init__zUAServiceClient.__init__s(DHDHrcPdjtjdddS)Nz UA-Client/{}application/json)z user-agentaccept content-type)formatr get_versionrs rheaderszUAServiceClient.headerss)(//0C0C0EF(.  rlog_response_bodytimeoutcT|jd}|s|j}|jddk(r6|r4tj|t j jd}tjt|j|j|}|j|} | r| S|r@t|jD cic] \} } |  | |  } } } |dt!| zz }||n |j"} t%j&||||| |Scc} } w)N/rr)clszutf-8?)urldatar"methodr$r#)lstripr"getjsondumpsr DatetimeAwareJSONEncoderencode posixpathjoingetattrrr_get_fake_responsessorteditemsr url_timeoutrreadurl)rpathr*r"r+ query_paramsr#r$r) fake_responsekvfiltered_paramstimeout_to_uses r request_urlzUAServiceClient.request_url%s{{3llnG ;;~ &*< <::d(E(EFMMDnnWTXXt/E/EFM005  "( (:(:( 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-rfeaturesosr:existsr.loadsr load_file)rr)response_overlay_paths r_get_response_overlayz%UAServiceClient._get_response_overlayMs$  ! ! -))--c26 6 $ 1 1 5 5 )! %%'D " 56%'D "%)ZZ  !67&D "%%))#r22rcZ|j|}|syt|dk(r|d}n|jd}i}g}|d}t|tr|}nt|t r|}t j|d|jditj|dd|| S) z7Return response if faked for this URL in uaclient.conf.Nrresponsecoder"T) sort_keys)rOr"body json_dict json_list) rKlenpop isinstancedictlistr HTTPResponser-r.r/)rr) responsesrNrRrSresps rr5z#UAServiceClient._get_fake_responsesos..s3  y>Q  |H!}}Q'H   # dD !I d #I  &!LLB/HZ0DA   rr)NNNNTN)__name__ __module__ __qualname__r8rDpropertyabcabstractmethodstrrrrrrr"boolintrrYrArKr5rrrr r sK  3  HV__5  "&!%&  & #&    & P 3 3D s x8I8I/J rr ) metaclass)r`r.rFr2typingrrr urllib.parseruaclientrrr r r ABCMetar rrrrjs2 &&"88   r