3 gYk @sdZddlZddlZddlZddlmZddlmZddlm Z ddl m Z m Z m Z mZmZddlmZmZmZmZdd lmZmZmZdd lmZmZdd lmZdd lmZm Z dd l!m"Z"m#Z#m$Z$m%Z%ddl&m'Z'ddl(m)Z)ddlm*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ddl0m1Z1ddlm2Z2ej3dkrTy ej4Z5Wne6k rPej7Z5YnXnejZ5e fddZ8e fddZ9Gddde:Z;Gddde;ZJsz!merge_setting..) isinstancerrupdateitems)request_settingsession_setting dict_classmerged_settingZ none_keyskeyr&r&r* merge_setting2s     r4cCs@|dks|jdgkr|S|dks0|jdgkr4|St|||S)zProperly merges both requests and session hooks. This is necessary because when request_hooks == {'response': []}, the merge breaks Session hooks entirely. Nresponse)getr4) request_hooks session_hooksr1r&r&r* merge_hooksQs r9c@s6eZdZddZdddZdd Zd d Zd d ZdS)SessionRedirectMixincCs,|jr(|jd}tr|jd}t|dSdS)z7Receives a Response. Returns a redirect URI or ``None``locationlatin1utf8N) is_redirectheadersrencoder)selfrespr;r&r&r*get_redirect_targetbs    z(SessionRedirectMixin.get_redirect_targetFNTc ks.g} |j|} x| r(|j} | j|| dd|_y |jWn(tttfk rj|jj ddYnXt |j|j krt d|j |d|j | jdrt|j} dt| j| f} t| }|j} |jst|jt| } nt| } t| | _|j| ||jtjtjfkr>d}x|D]}| jj|dq Wd| _| j}y |d =Wntk rdYnXt | j!||jt"| j!|j#| j$| j!|j%| |}|j&| || j'dk od |kpd |k}|rt(| | }|r|Vq|j)|f|||||dd | }t |j#| |j|j|} |VqWdS)zBReceives a Response. Returns a generator of Responses or Requests.rNF)decode_contentzExceeded %s redirects.)r5z//z%s:%sContent-Length Content-TypeTransfer-EncodingCookie)streamtimeoutverifycertproxiesallow_redirects)rErFrG)*rCcopyappendhistorycontentrr RuntimeErrorrawreadlen max_redirectsrclose startswithr urlrschemegeturlnetlocr rrebuild_method status_coder#temporary_redirectpermanent_redirectr?popbodyKeyErrorr _cookiesrcookiesprepare_cookiesrebuild_proxies rebuild_auth_body_positionr"send)rArBreqrIrJrKrLrMyield_requestsadapter_kwargshistrZprepared_request parsed_rurlparsedZpurged_headersheaderr?Z rewindabler&r&r*resolve_redirectswsr               z&SessionRedirectMixin.resolve_redirectscCsb|j}|j}d|kr:t|jj}t|}|j|jkr:|d=|jrHt|nd}|dk r^|j|dS)zWhen 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. AuthorizationN)r?rZr requesthostname trust_envr prepare_auth)rArpr5r?rZoriginal_parsedredirect_parsednew_authr&r&r*ris   z!SessionRedirectMixin.rebuild_authc Cs|dk r |ni}|j}|j}t|j}|j}|jd}t||d}|jr~| r~t||d} | j|| jd} | r~|j || d|kr|d=yt ||\} } Wnt k rd\} } YnX| r| rt | | |d<|S)aThis method re-evaluates the proxy configuration by considering the environment variables. If we are redirected to a URL covered by NO_PROXY, we strip the proxy configuration. Otherwise, we set missing proxy keys for this URL (in case they were stripped by a previous redirect). This method also replaces the Proxy-Authorization header where necessary. :rtype: dict Nno_proxy)r}allzProxy-Authorization)NN) r?rZr r[rOr6r rxr setdefaultr!rdr) rArprMr?rZr[ new_proxiesr}Z bypass_proxyenviron_proxiesproxyusernamepasswordr&r&r*rhs*       z$SessionRedirectMixin.rebuild_proxiescCsX|j}|jtjkr|dkrd}|jtjkr6|dkr6d}|jtjkrN|dkrNd}||_dS)zWhen being redirected we may want to change the method of the request based on certain specs or browser behavior. HEADGETPOSTN)methodr_r# see_otherfoundmoved)rArpr5rr&r&r*r^$sz#SessionRedirectMixin.rebuild_method)FNTNNF)__name__ __module__ __qualname__rCrtrirhr^r&r&r&r*r:`s  k)r:c@seZdZdZdddddddd d d d d dg ZddZddZddZddZd7ddZ ddZ ddZ dd Z d8d!d"Z d9d#d$Zd:d%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6ZdS);Sessiona~A Requests session. Provides cookie persistence, connection-pooling, and configuration. Basic Usage:: >>> import requests >>> s = requests.Session() >>> s.get('http://httpbin.org/get') Or as a context manager:: >>> with requests.Session() as s: >>> s.get('http://httpbin.org/get') r?rfauthrMhooksparamsrKrLprefetchadaptersrIrxrWcCsrt|_d|_i|_t|_i|_d|_d|_d|_ t |_ d|_ t i|_t|_|jdt|jdtdS)NFTzhttps://zhttp://)rr?rrMrrrrIrKrLrrWrxr rfrrmountr)rAr&r&r*__init__Ts zSession.__init__cCs|S)Nr&)rAr&r&r* __enter__szSession.__enter__cGs |jdS)N)rX)rAargsr&r&r*__exit__szSession.__exit__c Cs|jpi}t|tjst|}ttt|j|}|j}|jrV| rV|j rVt |j }t }|j |j j|j |j|j|jt|j|jtdt|j|jt||j|t|j|jd |S)aConstructs 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. :rtype: requests.PreparedRequest )r1) rrZfilesdatajsonr?rrrfr)rfr,r CookieJarr rr rrxrrZrpreparerupperrrrr4r?rrr9r)rArvrfmerged_cookiesrpr&r&r*prepare_requests*     zSession.prepare_requestNTc Cstt|j||||pi||pi||| d }|j|}| p8i} |j|j| | ||}| | d}|j||j|f|}|S)aConstructs 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, bytes, or file-like object to send in the body of the :class:`Request`. :param json: (optional) json 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) How long to wait for the server to send data before giving up, as a float, or a :ref:`(connect timeout, read timeout) ` tuple. :type timeout: float or tuple :param allow_redirects: (optional) Set to True by default. :type allow_redirects: bool :param proxies: (optional) Dictionary mapping protocol or protocol and hostname to the URL of the proxy. :param stream: (optional) whether to immediately download the response content. Defaults to ``False``. :param verify: (optional) Either a boolean, in which case it controls whether we verify the server's TLS certificate, or a string, in which case it must be a path to a CA bundle to use. Defaults to ``True``. :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. :rtype: requests.Response ) rrZr?rrrrrrfr)rJrN)rrrmerge_environment_settingsrZr-rk)rArrZrrr?rfrrrJrNrMrrIrKrLrrlprepsettings send_kwargsrBr&r&r*rvs()  zSession.requestcKs|jdd|jd|f|S)zSends a GET request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. :rtype: requests.Response rNTr)rrv)rArZkwargsr&r&r*r6s z Session.getcKs|jdd|jd|f|S)zSends a OPTIONS request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. :rtype: requests.Response rNTOPTIONS)rrv)rArZrr&r&r*options s zSession.optionscKs|jdd|jd|f|S)zSends a HEAD request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. :rtype: requests.Response rNFr)rrv)rArZrr&r&r*heads z Session.headcKs|jd|f||d|S)aSends 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 json: (optional) json to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :rtype: requests.Response r)rr)rv)rArZrrrr&r&r*post!s z Session.postcKs|jd|fd|i|S)aYSends 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. :rtype: requests.Response PUTr)rv)rArZrrr&r&r*put-s z Session.putcKs|jd|fd|i|S)a[Sends 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. :rtype: requests.Response PATCHr)rv)rArZrrr&r&r*patch8s z Session.patchcKs|jd|f|S)zSends a DELETE request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. :rtype: requests.Response DELETE)rv)rArZrr&r&r*deleteCszSession.deletec Ks~|jd|j|jd|j|jd|j|jd|jt|trJtd|jdd}|j d}|j }|j |j d}t }|j|f|}t |} t| d |_td ||f|}|jrx |jD]} t|j| j| jqWt|j||j|j||f|} |r d d | Dng} | r.| jd || j}| |_|sny"t|j||fddi||_Wntk rlYnX|sz|j|S)zISend a given PreparedRequest. :rtype: requests.Response rIrKrLrMz#You can only send PreparedRequests.rNT)rZ)secondsr5cSsg|]}|qSr&r&)r'rBr&r&r*r+sz Session.send..rrm)rrIrKrLrMr,r ValueErrorrbr6r get_adapterrZpreferred_clockrkrelapsedrrQr rfrvrTrtinsertnext_next StopIterationrR) rArvrrNrIradapterstartrrrBgenrQr&r&r*rkMsB       "z Session.sendc Cs|jrr|dk r|jdnd}t||d}x |jD]\}} |j|| q2W|dksZ|dkrrtjjdpptjjd}t||j}t||j }t||j }t||j }||||dS)z^ Check the environment and merge it with some settings. :rtype: dict Nr})r}TREQUESTS_CA_BUNDLECURL_CA_BUNDLE)rKrMrIrL) rxr6rr.rosenvironr4rMrIrKrL) rArZrMrIrKrLr} env_proxiesr(r)r&r&r*rs       z"Session.merge_environment_settingscCs:x(|jjD]\}}|jj|r |Sq Wtd|dS)z~ Returns the appropriate connection adapter for the given URL. :rtype: requests.adapters.BaseAdapter z*No connection adapters were found for '%s'N)rr.lowerrYr)rArZprefixrr&r&r*rszSession.get_adaptercCs x|jjD] }|jq WdS)z+Closes all adapters and as such the sessionN)rvaluesrX)rAr)r&r&r*rXsz Session.closecsB||j<fdd|jD}x|D]}|jj||j|<q$WdS)zwRegisters a connection adapter to a prefix. Adapters are sorted in descending order by prefix length. cs g|]}t|tkr|qSr&)rV)r'r()rr&r*r+sz!Session.mount..N)rrb)rArr keys_to_mover3r&)rr*rs  z Session.mountcstfddjD}|S)Nc3s|]}|t|dfVqdS)N)getattr)r'attr)rAr&r* sz'Session.__getstate__..)dict __attrs__)rAstater&)rAr* __getstate__szSession.__getstate__cCs&x |jD]\}}t|||q WdS)N)r.setattr)rArrvaluer&r&r* __setstate__szSession.__setstate__)NNNNNNNTNNNNNN)NN)N)N)rrr__doc__rrrrrrvr6rrrrrrrkrrrXrrrr&r&r&r*r;s2 7) D    I rcCstS)zQ Returns a :class:`Session` for context-management. :rtype: Session )rr&r&r&r*sessionsr)>rrplatformtime collectionsrdatetimerrrcompatrrrr r rfr r r rmodelsrrrrrr_internal_utilsrutilsrr exceptionsrrrr structuresrrrrrrr r!r" status_codesr#r$system perf_counterrAttributeErrorclockr4r9objectr:rrr&r&r&r* sB            \"