o �J�h�u�@sjdZddlZddlZddlZddlmZddlmZddlm Z ddl m Z ddl m Z dd lmZmZmZmZdd lmZmZmZmZdd lmZmZmZmZdd lmZmZdd l m!Z!m"Z"m#Z#m$Z$ddl%m&Z&ddl'm(Z(ddl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3ej4dkr�ej5Z6nejZ6efdd�Z7efdd�Z8Gdd�d�Z9Gdd�de9�Z:dd�Z;dS)z� requests.sessions ~~~~~~~~~~~~~~~~~ This module provides a Session object to manage and persist settings across requests (cookies, auth, proxies). �N)� OrderedDict)� timedelta�)�to_native_string)� HTTPAdapter)�_basic_auth_str)�Mapping� cookielib�urljoin�urlparse)�RequestsCookieJar�cookiejar_from_dict�extract_cookies_to_jar� merge_cookies)�ChunkedEncodingError�ContentDecodingError� InvalidSchema�TooManyRedirects)� default_hooks� dispatch_hook)�DEFAULT_REDIRECT_LIMIT�REDIRECT_STATI�PreparedRequest�Request)�codes)�CaseInsensitiveDict) � DEFAULT_PORTS�default_headers�get_auth_from_url�get_environ_proxies�get_netrc_auth� requote_uri�resolve_proxies� rewind_body�should_bypass_proxies�to_key_val_list�win32cCsp|dur|S|dur |St|t�rt|t�s|S|t|��}|�t|��dd�|��D�}|D]}||=q0|S)z�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` NcSsg|] \}}|dur|�qS�N�)�.0�k�vr(r(�OC:\pinokio\api\whisper-webui.git\app\env\lib\site-packages\requests\sessions.py� <listcomp>Tsz!merge_setting.<locals>.<listcomp>)� isinstancerr%�update�items)Zrequest_settingZsession_setting� dict_classZmerged_settingZ none_keys�keyr(r(r,� merge_setting=s�� r3cCs@|dus |�d�gkr |S|dus|�d�gkr|St|||�S)z�Properly merges both requests and session hooks. This is necessary because when request_hooks == {'response': []}, the merge breaks Session hooks entirely. N�response)�getr3)Z request_hooksZ session_hooksr1r(r(r,� merge_hooks[s  r6c@sJeZdZdd�Zdd�Z      ddd �Zd d �Zd d �Zdd�ZdS)�SessionRedirectMixincCs(|jr|jd}|�d�}t|d�SdS)z7Receives a Response. Returns a redirect URI or ``None``�location�latin1�utf8N)� is_redirect�headers�encoder)�self�respr8r(r(r,�get_redirect_targetks    z(SessionRedirectMixin.get_redirect_targetcCs�t|�}t|�}|j|jkrdS|jdkr&|jdvr&|jdkr&|jdvr&dS|j|jk}|j|jk}t�|jd�df}|sI|j|vrI|j|vrIdS|pL|S)zFDecide whether Authorization header should be removed when redirectingT�http)�PN�https)i�NFN)r �hostname�scheme�portrr5)r>Zold_urlZnew_urlZ old_parsedZ new_parsedZ changed_portZchanged_scheme� default_portr(r(r,�should_strip_auths$       �  z&SessionRedirectMixin.should_strip_authFNTc  ksB�g} |�|�} t|j�j} | �r|��} | �|�| dd�|_z|jWntt t fy9|j j dd�Ynwt |j�|jkrMtd|j�d�|d��|��| �d�ret|j�}d �t|j�| g�} t| �}|jd krw| rw|j| d �}n|jr}|j} |��} |js�t|jt| ��} nt| �} t| �| _|�| |�|jtjtjfvr�d }|D] }| j� |d�q�d| _!| j}|� d d�t"| j#||j �t$| j#|j%�| �&| j#�|�'| |�}|�(| |�| j)duo�d|vp�d|v}|r�t*| �| }|r�|Vn |j+|f|||||dd�| ��}t"|j%| |j �|�|�} |V| sdSdS)zBReceives a Response. Returns a generator of Responses or Requests.rNF)�decode_contentz Exceeded z redirects.)r4z//�:�)�fragment)�Content-Lengthz Content-Type�Transfer-Encoding�CookierMrN)�stream�timeout�verify�cert�proxies�allow_redirects),r@r �urlrL�copy�append�history�contentrr� RuntimeError�raw�read�len� max_redirectsr�close� startswith�joinrrE�_replace�geturl�netlocr r!�rebuild_method� status_coder�temporary_redirect�permanent_redirectr<�pop�bodyr�_cookiesr�cookiesZprepare_cookies�rebuild_proxies� rebuild_auth�_body_positionr#�send)r>r?�reqrPrQrRrSrT�yield_requestsZadapter_kwargsZhistrVZprevious_fragment�prepared_requestZ parsed_rurl�parsedZpurged_headers�headerr<Z rewindabler(r(r,�resolve_redirects�s��    ��    �     ����  �z&SessionRedirectMixin.resolve_redirectscCsV|j}|j}d|vr|�|jj|�r|d=|jrt|�nd}|dur)|�|�dSdS)z�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. � AuthorizationN)r<rVrH�request� trust_envr Z prepare_auth)r>rtr4r<rVZnew_authr(r(r,ros ��z!SessionRedirectMixin.rebuild_authcCsx|j}t|j�j}t|||j�}d|vr|d=z t||�\}}Wn ty.d\}}Ynw|r:|r:t||�|d<|S)a�This 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 zProxy-Authorization�NN) r<r rVrEr"rzr�KeyErrorr)r>rtrTr<rE� new_proxies�username�passwordr(r(r,rn/s   �z$SessionRedirectMixin.rebuild_proxiescCsX|j}|jtjkr|dkrd}|jtjkr|dkrd}|jtjkr'|dkr'd}||_dS)z�When being redirected we may want to change the method of the request based on certain specs or browser behavior. �HEAD�GET�POSTN)�methodrgr� see_other�foundZmoved)r>rtr4r�r(r(r,rfLs z#SessionRedirectMixin.rebuild_method)FNTNNF) �__name__� __module__� __qualname__r@rHrwrornrfr(r(r(r,r7js$ �| r7c@s�eZdZdZgd�Zdd�Zdd�Zdd�Zd d �Z d+d d�Z dd�Z dd�Z dd�Z d,dd�Z d-dd�Zd-dd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd S).�Sessiona�A Requests session. Provides cookie persistence, connection-pooling, and configuration. Basic Usage:: >>> import requests >>> s = requests.Session() >>> s.get('https://httpbin.org/get') <Response [200]> Or as a context manager:: >>> with requests.Session() as s: ... s.get('https://httpbin.org/get') <Response [200]> ) r<rm�authrT�hooks�paramsrRrS�adaptersrPrzr_cCsrt�|_d|_i|_t�|_i|_d|_d|_d|_ t |_ d|_ t i�|_t�|_|�dt��|�dt��dS)NFTzhttps://zhttp://)rr<r�rTrr�r�rPrRrSrr_rzr rmrr��mountr�r>r(r(r,�__init__�s  zSession.__init__cCs|Sr'r(r�r(r(r,� __enter__�szSession.__enter__cGs |��dSr')r`)r>�argsr(r(r,�__exit__�s zSession.__exit__c Cs�|jpi}t|tj�st|�}ttt�|j�|�}|j}|jr)|s)|js)t |j �}t �}|j |j ��|j |j|j|jt|j|jtd�t|j|j�t||j�|t|j|j�d� |S)a�Constructs a :class:`PreparedRequest <PreparedRequest>` for transmission and returns it. The :class:`PreparedRequest` has settings merged from the :class:`Request <Request>` instance and those of the :class:`Session`. :param request: :class:`Request` instance to prepare with this session's settings. :rtype: requests.PreparedRequest )r1) r�rV�files�data�jsonr<r�r�rmr�)rmr.r � CookieJarr rr r�rzr rVrZpreparer��upperr�r�r�r3r<rr�r6r�)r>ryrm�merged_cookiesr��pr(r(r,�prepare_request�s2 �  �   �zSession.prepare_requestNTc Csxt|��||||p i||pi||| d� }|�|�}| pi} |�|j| | ||�}| | d�}|�|�|j|fi|��}|S)aw Constructs a :class:`Request <Request>`, prepares it and sends it. Returns :class:`Response <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, list of tuples, 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) <timeouts>` 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``. When set to ``False``, requests will accept any TLS certificate presented by the server, and will ignore hostname mismatches and/or expired certificates, which will make your application vulnerable to man-in-the-middle (MitM) attacks. Setting verify to ``False`` may be useful during local development or testing. :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. :rtype: requests.Response ) r�rVr<r�r�r�r�r�rmr�)rQrU)rr�r��merge_environment_settingsrVr/rq)r>r�rVr�r�r<rmr�r�rQrUrTr�rPrRrSr�rrZprepZsettingsZ send_kwargsr?r(r(r,ry�s.=�  �� zSession.requestcK� |�dd�|jd|fi|��S)z�Sends 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 rUTr��� setdefaultry�r>rV�kwargsr(r(r,r5O� z Session.getcKr�)z�Sends 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 rUT�OPTIONSr�r�r(r(r,�optionsZr�zSession.optionscKr�)z�Sends 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 rUFr�r�r�r(r(r,�header�z Session.headcKs|jd|f||d�|��S)a�Sends a POST request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, list of tuples, 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�)r�r��ry)r>rVr�r�r�r(r(r,�postps z Session.postcK�|jd|fd|i|��S)auSends a PUT request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, list of tuples, 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�r��r>rVr�r�r(r(r,�put}� z Session.putcKr�)awSends a PATCH request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, list of tuples, 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�r�r�r(r(r,�patch�r�z Session.patchcKs|jd|fi|��S)z�Sends 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 �DELETEr�r�r(r(r,�delete�szSession.deletec Ks�|�d|j�|�d|j�|�d|j�d|vr#t||j|j�|d<t|t�r,t d��|� dd�}|� d�}|j }|j |jd�}t�}|j|fi|��}t�|} t| d �|_td ||fi|��}|jrt|jD] } t|j| j| j�qht|j||j�|r�|j||fi|��} d d �| D�} ng} | r�| �d |�| � �}| |_|s�zt|j||fddi|���|_Wn ty�Ynw|s�|j|S)zISend a given PreparedRequest. :rtype: requests.Response rPrRrSrTz#You can only send PreparedRequests.rUT)rV)�secondsr4cSsg|]}|�qSr(r()r)r?r(r(r,r-�sz Session.send.<locals>.<listcomp>rrs)r�rPrRrSr"rTrzr.r� ValueErrorrjr5r�� get_adapterrV�preferred_clockrqr�elapsedrrYrrmryr\rw�insert�next�_next� StopIterationrZ) r>ryr�rUrPr��adapter�start�rr�r?�genrYr(r(r,rq�sN        � �z Session.sendc Cs�|jr9|dur |�d�nd}t||d�}|��D] \}} |�|| �q|dus+|dur9tj�d�p8tj�d�p8|}t||j�}t||j �}t||j �}t||j �}||||d�S)z^ Check the environment and merge it with some settings. :rtype: dict N�no_proxy)r�TZREQUESTS_CA_BUNDLEZCURL_CA_BUNDLE)rTrPrRrS) rzr5rr0r��os�environr3rTrPrRrS) r>rVrTrPrRrSr�Z env_proxiesr*r+r(r(r,r��s    ��    z"Session.merge_environment_settingscCs<|j��D]\}}|���|���r|Sqtd|����)z~ Returns the appropriate connection adapter for the given URL. :rtype: requests.adapters.BaseAdapter z&No connection adapters were found for )r�r0�lowerrar)r>rV�prefixr�r(r(r,r� s �zSession.get_adaptercCs|j��D]}|��qdS)z+Closes all adapters and as such the sessionN)r��valuesr`)r>r+r(r(r,r`s �z Session.closecs>||j�<�fdd�|jD�}|D] }|j�|�|j|<qdS)zwRegisters a connection adapter to a prefix. Adapters are sorted in descending order by prefix length. cs g|] }t|�t��kr|�qSr()r^)r)r*�r�r(r,r-%s z!Session.mount.<locals>.<listcomp>N)r�rj)r>r�r�Z keys_to_mover2r(r�r,r�s �z Session.mountcs�fdd��jD�}|S)Ncsi|] }|t�|d��qSr')�getattr)r)�attrr�r(r,� <dictcomp>+sz(Session.__getstate__.<locals>.<dictcomp>)� __attrs__)r>�stater(r�r,� __getstate__*szSession.__getstate__cCs"|��D] \}}t|||�qdSr')r0�setattr)r>r�r��valuer(r(r,� __setstate__.s�zSession.__setstate__)NNNNNNNTNNNNNNr{r')r�r�r��__doc__r�r�r�r�r�ryr5r�r�r�r�r�r�rqr�r�r`r�r�r�r(r(r(r,r�csH>/ �[    N r�cCst�S)aZ Returns a :class:`Session` for context-management. .. deprecated:: 1.0.0 This method has been deprecated since version 1.0.0 and is only kept for backwards compatibility. New code should use :class:`~requests.sessions.Session` to create a session. This may be removed at a future date. :rtype: Session )r�r(r(r(r,�session3s r�)<r�r��sys�time� collectionsr�datetimer�_internal_utilsrr�rr�r�compatrr r r rmr r rr� exceptionsrrrrr�rr�modelsrrrr� status_codesr� structuresr�utilsrrrrr r!r"r#r$r%�platform� perf_counterr�r3r6r7r�r�r(r(r(r,�<module>s:       0   z S
Memory