3 Pfp @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/m0Z0ddl1m2Z2ddlm3Z3ej4dkrXy ej5Z6Wne7k rTej8Z6YnXnejZ6e fddZ9e fddZ:Gddde;ZdS)z requests.session ~~~~~~~~~~~~~~~~ This module provides a Session object to manage and persist settings across requests (cookies, auth, proxies). N)Mapping) timedelta)_basic_auth_str) cookielibis_py3 OrderedDicturljoinurlparse)cookiejar_from_dictextract_cookies_to_jarRequestsCookieJar merge_cookies)RequestPreparedRequestDEFAULT_REDIRECT_LIMIT) default_hooks dispatch_hook)to_native_string)to_key_val_listdefault_headers)TooManyRedirects InvalidSchemaChunkedEncodingErrorContentDecodingError)CaseInsensitiveDict) HTTPAdapter) requote_uriget_environ_proxiesget_netrc_authshould_bypass_proxiesget_auth_from_url rewind_body DEFAULT_PORTS)codes)REDIRECT_STATIZWindowscCst|dkr |S|dkr|St|to*t|ts0|S|t|}|jt|dd|jD}x|D] }||=qbW|S)zDetermines 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` NcSsg|]\}}|dkr|qS)N).0kvr&r&/usr/lib/python3.6/sessions.py Jsz!merge_setting..) isinstancerrupdateitems)Zrequest_settingZsession_setting dict_classZmerged_settingZ none_keyskeyr&r&r* merge_setting2s     r1cCs@|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)getr1)Z request_hooksZ session_hooksr/r&r&r* merge_hooksQs r4c@s>eZdZddZddZddd Zd d Zd d ZddZdS)SessionRedirectMixincCs,|jr(|jd}tr|jd}t|dSdS)z7Receives a Response. Returns a redirect URI or ``None``locationlatin1utf8N)Z is_redirectheadersrencoder)selfrespr6r&r&r*get_redirect_targetbs    z(SessionRedirectMixin.get_redirect_targetcCst|}t|}|j|jkr dS|jdkrL|jdkrL|jdkrL|jd krLdS|j|jk}|j|jk}tj|jddf}| r|j|kr|j|krdS|p|S) zFDecide whether Authorization header should be removed when redirectingTZhttpPNZhttpsF)r>N)r?N)r ZhostnameschemeZportr#r3)r;Zold_urlZnew_urlZ old_parsedZ new_parsedZ changed_portZchanged_schemeZ default_portr&r&r*should_strip_authxs    z&SessionRedirectMixin.should_strip_authFNTc 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)Zdecode_contentzExceeded %s redirects.)r2z//z%s:%sContent-Length Content-TypeTransfer-EncodingZCookie)streamtimeoutverifycertproxiesallow_redirects)rBrCrD)*r=copyappendhistorycontentrr RuntimeErrorrawreadlen max_redirectsrclose startswithr urlrr@ZgeturlZnetlocr rrebuild_method status_coder$Ztemporary_redirectZpermanent_redirectr9popZbodyKeyErrorr Z_cookiesrcookiesZprepare_cookiesrebuild_proxies rebuild_authZ_body_positionr"send)r;r<reqrErFrGrHrIyield_requestsZadapter_kwargsZhistrVprepared_requestZ parsed_rurlZparsedZpurged_headersheaderr9Z rewindabler&r&r*resolve_redirectssr               z&SessionRedirectMixin.resolve_redirectscCsR|j}|j}d|kr*|j|jj|r*|d=|jr8t|nd}|dk rN|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. Z AuthorizationN)r9rVrArequest trust_envrZ prepare_auth)r;rar2r9rVZnew_authr&r&r*r]s 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)rfallzProxy-Authorization)NN) r9rVr r@rKr3r rer setdefaultr!rZr) r;rarIr9rVr@Z new_proxiesrfZ bypass_proxyZenviron_proxiesproxyZusernameZpasswordr&r&r*r\s*       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)methodrXr$Z see_otherfoundZmoved)r;rar2rmr&r&r*rW:sz#SessionRedirectMixin.rebuild_method)FNTNNF) __name__ __module__ __qualname__r=rArcr]r\rWr&r&r&r*r5`s k)r5c@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') r9r[authrIhooksparamsrGrHZprefetchadaptersrErerScCsrt|_d|_i|_t|_i|_d|_d|_d|_ t |_ d|_ t i|_t|_|jdt|jdtdS)NFTzhttps://zhttp://)rr9rsrIrrtrurErGrHrrSrer r[rrvmountr)r;r&r&r*__init__js zSession.__init__cCs|S)Nr&)r;r&r&r* __enter__szSession.__enter__cGs |jdS)N)rT)r;argsr&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 )r/) rmrVfilesdatajsonr9rursr[rt)r[r,rZ CookieJarr rr rsrerrVrZpreparermupperr|r}r~r1r9rrur4rt)r;rdr[Zmerged_cookiesrspr&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 ) rmrVr9r|r}r~rursr[rt)rFrJ)rrrmerge_environment_settingsrVr-r^)r;rmrVrur}r9r[r|rsrFrJrIrtrErGrHr~r_ZprepZsettingsZ send_kwargsr<r&r&r*rds()  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 rJTrk)rhrd)r;rVkwargsr&r&r*r3s 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 rJTZOPTIONS)rhrd)r;rVrr&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 rJFrj)rhrd)r;rVrr&r&r*head,s 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 rl)r}r~)rd)r;rVr}r~rr&r&r*post7s 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 ZPUTr})rd)r;rVr}rr&r&r*putCs 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 ZPATCHr})rd)r;rVr}rr&r&r*patchNs 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 ZDELETE)rd)r;rVrr&r&r*deleteYszSession.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 rErGrHrIz#You can only send PreparedRequests.rJT)rV)Zsecondsr2cSsg|]}|qSr&r&)r'r<r&r&r*r+sz Session.send..rr`)rhrErGrHrIr,r ValueErrorrYr3rt get_adapterrVpreferred_clockr^relapsedrrMr r[rdrPrcinsertnextZ_next StopIterationrN) r;rdrrJrErtadapterstartrrr<genrMr&r&r*r^csB       "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 Nrf)rfTZREQUESTS_CA_BUNDLEZCURL_CA_BUNDLE)rGrIrErH) rer3rr.rhosenvironr1rIrErGrH) r;rVrIrErGrHrfZ 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)rvr.lowerrUr)r;rVprefixrr&r&r*rszSession.get_adaptercCs x|jjD] }|jq WdS)z+Closes all adapters and as such the sessionN)rvvaluesrT)r;r)r&r&r*rTsz 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&)rR)r'r()rr&r*r+sz!Session.mount..N)rvrY)r;rrZ keys_to_mover0r&)rr*rws  z Session.mountcstfddjD}|S)Nc3s|]}|t|dfVqdS)N)getattr)r'attr)r;r&r* sz'Session.__getstate__..)dict __attrs__)r;stater&)r;r* __getstate__szSession.__getstate__cCs&x |jD]\}}t|||q WdS)N)r.setattr)r;rrvaluer&r&r* __setstate__szSession.__setstate__)NNNNNNNTNNNNNN)NN)N)N)rorprq__doc__rrxryr{rrdr3rrrrrrr^rrrTrwrrr&r&r&r*rrQs2 7) D    I rrcCstS)zQ Returns a :class:`Session` for context-management. :rtype: Session )rrr&r&r&r*sessionsr)?rrplatformZtime collectionsrZdatetimerrsrcompatrrrr r r[r r r rZmodelsrrrrtrrZ_internal_utilsrZutilsrr exceptionsrrrrZ structuresrrvrrrrr r!r"r#Z status_codesr$r%systemZ perf_counterrAttributeErrorZclockr1r4objectr5rrrr&r&r&r* sB      $     r"