ž 7’ReWc@s¾dZddlZddlmZddlmZddlmZddlmZm Z m Z m Z m Z ddl mZmZmZmZdd lmZmZmZdd lmZmZdd lmZmZmZdd lmZmZm Z m!Z!dd l"m#Z#ddl$m%Z%ddlm&Z&m'Z'm(Z(m)Z)m*Z*ddl+m,Z,ddlm-Z-e dd„Z.e dd„Z/Gdd„de0ƒZ1Gdd„de1ƒZ2dd„Z3dS(u” requests.session ~~~~~~~~~~~~~~~~ This module provides a Session object to manage and persist settings across requests (cookies, auth, proxies). iN(uMapping(udatetimei(u_basic_auth_str(u cookielibu OrderedDictuurljoinuurlparseu builtin_str(ucookiejar_from_dictuextract_cookies_to_jaruRequestsCookieJaru merge_cookies(uRequestuPreparedRequestuDEFAULT_REDIRECT_LIMIT(u default_hooksu dispatch_hook(uto_key_val_listudefault_headersuto_native_string(uTooManyRedirectsu InvalidSchemauChunkedEncodingErroruContentDecodingError(uCaseInsensitiveDict(u HTTPAdapter(u requote_uriuget_environ_proxiesuget_netrc_authushould_bypass_proxiesuget_auth_from_url(ucodes(uREDIRECT_STATIcCs½|dkr|S|dkr |St|tƒo;t|tƒsB|S|t|ƒƒ}|jt|ƒƒx0|jƒD]"\}}|dkrt||=qtqtWtdd„|jƒDƒƒ}|S(uí Determines appropriate setting for a given request, taking into account the explicit setting on that request, and the setting in the session. If a setting is a dictionary, they will be merged together using `dict_class` css-|]#\}}|dk r||fVqdS(N(uNone(u.0ukuv((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyu Csu merge_setting..N(uNoneu isinstanceuMappinguto_key_val_listuupdateuitemsudict(urequest_settingusession_settingu dict_classumerged_settingukuv((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyu merge_setting's   u merge_settingcCsZ|dks!|jdƒgkr%|S|dksF|jdƒgkrJ|St|||ƒS(u® Properly merges both requests and session hooks. This is necessary because when request_hooks == {'response': []}, the merge breaks Session hooks entirely. uresponseN(uNoneugetu merge_setting(u request_hooksu session_hooksu dict_class((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyu merge_hooksHs !!u merge_hookscBsG|EeZdZddd dddd„Zdd„Zdd„ZdS( uSessionRedirectMixinc!csÛd}xÎ|jrÖ|jƒ} y |jWn.tttfk rY|jjddƒYnX||j krt d|j ƒ‚n|j ƒ|j d} |j } | jdƒrÓt|jƒ} d| j| f} nt| ƒ} | jƒ} t| ƒjst|jt| ƒƒ} n t| ƒ} t| ƒ| _|jtjkrW| dkrWd} n|jtjkr~| dkr~d} n|jtjkr¥| d kr¥d} n| | _ |jtjtjfkrñd | j krå| j d =nd| _n| j }y |d =Wnt k rYnXt!| j"| |jƒ| j"j#|j$ƒ| j%| j"ƒ|j&| |ƒ}|j'| |ƒ| }|j(|d |d |d|d|d|ddƒ}t!|j$| |jƒ|d7}|Vq WdS(u6Receives a Response. Returns a generator of Responses.iudecode_contentuExceeded %s redirects.ulocationu//u%s:%suHEADuGETuPOSTuContent-LengthuCookieustreamutimeoutuverifyucertuproxiesuallow_redirectsiNF()u is_redirectucopyucontentuChunkedEncodingErroruContentDecodingErroru RuntimeErrorurawureaduFalseu max_redirectsuTooManyRedirectsucloseuheadersumethodu startswithuurlparseuurluschemeugeturlunetlocuurljoinu requote_uriuto_native_stringu status_codeucodesu see_otherufoundumovedu temporaryuresumeuNoneubodyuKeyErroruextract_cookies_to_jaru_cookiesuupdateucookiesuprepare_cookiesurebuild_proxiesu rebuild_authusend(uselfurespurequstreamutimeoutuverifyucertuproxiesuiuprepared_requestuurlumethodu parsed_rurluparseduheaders((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyuresolve_redirectsYsn                     u&SessionRedirectMixin.resolve_redirectscCs–|j}|j}d|kr[t|jjƒ}t|ƒ}|j|jkr[|d=q[n|jrpt|ƒnd}|dk r’|j|ƒndS(uò When being redirected we may want to strip authentication from the request to avoid leaking credentials. This method intelligently removes and reapplies authentication where possible to avoid credential loss. u AuthorizationN( uheadersuurluurlparseurequestuhostnameu trust_envuget_netrc_authuNoneu prepare_auth(uselfuprepared_requesturesponseuheadersuurluoriginal_parseduredirect_parsedunew_auth((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyu rebuild_auth»s      u!SessionRedirectMixin.rebuild_authc Cs|j}|j}t|ƒj}|dk r9|jƒni}|jrt|ƒ rt|ƒ}|j |ƒ}|r|j |||ƒqnd|kr¦|d=nyt ||ƒ\} } Wnt k ràd\} } YnX| r| rt | | ƒ|d>> import requests >>> s = requests.Session() >>> s.get('http://httpbin.org/get') 200 uheadersucookiesuauthutimeoutuproxiesuhooksuparamsuverifyucertuprefetchuadaptersustreamu trust_envu max_redirectscCs¥tƒ|_d|_i|_tƒ|_i|_d|_ d|_ d|_ t |_d|_tiƒ|_tƒ|_|jdtƒƒ|jdtƒƒdS(Nuhttps://uhttp://FT(udefault_headersuheadersuNoneuauthuproxiesu default_hooksuhooksuparamsuFalseustreamuTrueuverifyucertuDEFAULT_REDIRECT_LIMITu max_redirectsu trust_envucookiejar_from_dictucookiesu OrderedDictuadaptersumountu HTTPAdapter(uself((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyu__init__ s           uSession.__init__cCs|S(N((uself((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyu __enter__?suSession.__enter__cGs|jƒdS(N(uclose(uselfuargs((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyu__exit__BsuSession.__exit__cCs!|jp i}t|tjƒs0t|ƒ}ntttƒ|jƒ|ƒ}|j}|jrƒ| rƒ|j rƒt |j ƒ}nt ƒ}|j d|j jƒd|j d|jd|jdt|j|jdtƒdt|j|jƒdt||jƒd |d t|j|jƒƒ |S( ubConstructs a :class:`PreparedRequest ` for transmission and returns it. The :class:`PreparedRequest` has settings merged from the :class:`Request ` instance and those of the :class:`Session`. :param request: :class:`Request` instance to prepare with this session's settings. umethoduurlufilesudatauheadersu dict_classuparamsuauthucookiesuhooks(ucookiesu isinstanceu cookielibu CookieJarucookiejar_from_dictu merge_cookiesuRequestsCookieJaruauthu trust_envuget_netrc_authuurluPreparedRequestuprepareumethoduupperufilesudatau merge_settinguheadersuCaseInsensitiveDictuparamsu merge_hooksuhooks(uselfurequestucookiesumerged_cookiesuauthup((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyuprepare_requestEs(       uSession.prepare_requestcCs¡t|ƒ}td|jƒd|d|d|d|p9id|pEid|d|d | ƒ }|j|ƒ}| pui} |jrt|ƒpi}x*|jƒD]\}}| j||ƒq W| rè|dk rèt j j d ƒ}n| r|dk rt j j d ƒ}qnt | |j ƒ} t | |jƒ} t ||jƒ}t ||jƒ}i| d 6| d 6|d6|d6| d6| d6}|j||}|S(u4Constructs a :class:`Request `, prepares it and sends it. Returns :class:`Response ` object. :param method: method for the new :class:`Request` object. :param url: URL for the new :class:`Request` object. :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. :param data: (optional) Dictionary or bytes to send in the body of the :class:`Request`. :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. :param files: (optional) Dictionary of 'filename': file-like-objects for multipart encoding upload. :param auth: (optional) Auth tuple or callable to enable Basic/Digest/Custom HTTP Auth. :param timeout: (optional) Float describing the timeout of the request in seconds. :param allow_redirects: (optional) Boolean. Set to True by default. :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. :param stream: (optional) whether to immediately download the response content. Defaults to ``False``. :param verify: (optional) if ``True``, the SSL cert will be verified. A CA_BUNDLE path can also be provided. :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. umethoduurluheadersufilesudatauparamsuauthucookiesuhooksuREQUESTS_CA_BUNDLEuCURL_CA_BUNDLEustreamutimeoutuverifyucertuproxiesuallow_redirectsF(u builtin_struRequestuupperuprepare_requestu trust_envuget_environ_proxiesuitemsu setdefaultuFalseuosuenvironugetu merge_settinguproxiesustreamuverifyucertusend(uselfumethoduurluparamsudatauheadersucookiesufilesuauthutimeoutuallow_redirectsuproxiesuhooksustreamuverifyucerturequprepu env_proxiesukuvu send_kwargsuresp((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyurequestlsD,        uSession.requestcKs#|jddƒ|jd||S(uÃSends a GET request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. uallow_redirectsuGETT(u setdefaultuTrueurequest(uselfuurlukwargs((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyugetÌsu Session.getcKs#|jddƒ|jd||S(uÇSends a OPTIONS request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. uallow_redirectsuOPTIONST(u setdefaultuTrueurequest(uselfuurlukwargs((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyuoptionsÖsuSession.optionscKs#|jddƒ|jd||S(uÄSends a HEAD request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. uallow_redirectsuHEADF(u setdefaultuFalseurequest(uselfuurlukwargs((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyuheadàsu Session.headcKs|jd|d||S(u8Sends a POST request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. uPOSTudata(urequest(uselfuurludataukwargs((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyupostêsu Session.postcKs|jd|d||S(u7Sends a PUT request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. uPUTudata(urequest(uselfuurludataukwargs((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyuputôsu Session.putcKs|jd|d||S(u9Sends a PATCH request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. uPATCHudata(urequest(uselfuurludataukwargs((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyupatchþsu Session.patchcKs|jd||S(uÆSends a DELETE request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. uDELETE(urequest(uselfuurlukwargs((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyudeletesuSession.deletec Ks |jd|jƒ|jd|jƒ|jd|jƒ|jd|jƒt|tƒsjtdƒ‚n|jdd ƒ}|j dƒ}|j dƒ}|j dƒ}|j dƒ}|j dƒ}|j } |j d|j ƒ} tjƒ} | j||} tjƒ| | _td | | |} | jrdx-| jD]} t|j| j| jƒq>Wnt|j|| jƒ|j| |d|d|d|d|d|ƒ}|rÃd d „|Dƒng}|r÷|jd | ƒ|jƒ} || _n|s| jn| S(uSend a given PreparedRequest.ustreamuverifyucertuproxiesu#You can only send PreparedRequests.uallow_redirectsutimeoutuurluresponsecSsg|] }|‘qS(((u.0uresp((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyu Is u Session.send..iT(u setdefaultustreamuverifyucertuproxiesu isinstanceuPreparedRequestu ValueErrorupopuTrueugetuhooksu get_adapteruurludatetimeuutcnowusenduelapsedu dispatch_hookuhistoryuextract_cookies_to_jarucookiesurequesturawuresolve_redirectsuinsertucontent(uselfurequestukwargsuallow_redirectsustreamutimeoutuverifyucertuproxiesuhooksuadapterustartururespugenuhistory((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyusendsH        u Session.sendcCsMx6|jjƒD]%\}}|jƒj|ƒr|SqWtd|ƒ‚dS(u>Returns the appropriate connnection adapter for the given URL.u*No connection adapters were found for '%s'N(uadaptersuitemsuloweru startswithu InvalidSchema(uselfuurluprefixuadapter((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyu get_adapterXsuSession.get_adaptercCs(x!|jjƒD]}|jƒqWdS(u+Closes all adapters and as such the sessionN(uadaptersuvaluesuclose(uselfuv((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyuclosebsu Session.closecsW||jˆ<‡fdd†|jDƒ}x'|D]}|jj|ƒ|j|ms u!Session.mount..N(uadaptersupop(uselfuprefixuadapteru keys_to_moveukey((uprefixu6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyumountgs  u Session.mountcs t‡fdd†ˆjDƒƒS(Nc3s'|]}|tˆ|dƒfVqdS(N(ugetattruNone(u.0uattr(uself(u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyu ssu'Session.__getstate__..(udictu __attrs__(uself((uselfu6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyu __getstate__rsuSession.__getstate__cCs1x*|jƒD]\}}t|||ƒq WdS(N(uitemsusetattr(uselfustateuattruvalue((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyu __setstate__usuSession.__setstate__NT(u__name__u __module__u __qualname__u__doc__u __attrs__u__init__u __enter__u__exit__uprepare_requestuNoneuTrueurequestugetuoptionsuheadupostuputupatchudeleteusendu get_adapterucloseumountu __getstate__u __setstate__(u __locals__((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyuSessionúsD   3   (S    G  uSessioncCstƒS(u2Returns a :class:`Session` for context-management.(uSession(((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyusessionzsusession(4u__doc__uosu collectionsuMappingudatetimeuauthu_basic_auth_strucompatu cookielibu OrderedDictuurljoinuurlparseu builtin_strucookiesucookiejar_from_dictuextract_cookies_to_jaruRequestsCookieJaru merge_cookiesumodelsuRequestuPreparedRequestuDEFAULT_REDIRECT_LIMITuhooksu default_hooksu dispatch_hookuutilsuto_key_val_listudefault_headersuto_native_stringu exceptionsuTooManyRedirectsu InvalidSchemauChunkedEncodingErroruContentDecodingErroru structuresuCaseInsensitiveDictuadaptersu HTTPAdapteru requote_uriuget_environ_proxiesuget_netrc_authushould_bypass_proxiesuget_auth_from_urlu status_codesucodesuREDIRECT_STATIu merge_settingu merge_hooksuobjectuSessionRedirectMixinuSessionusession(((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyu s* (""(!¢ÿ