U
    C]                  	   @   st  d dl Z d dlZd dlZd dlZd dlZd dlZd dl	m
Z
 d dlmZmZ d dlmZmZ d dlZd dlZddlmZ ddlmZmZmZmZmZmZ ddlmZmZmZm Z m!Z!m"Z"m#Z# dd	l$m%Z% dd
l&m'Z' ddl(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ ej0rddl1m2Z2 ddl3m4Z4 ej5ej6e7e8e9e:f  Z;ej6de7f Z<ej6dej=e7e;f ej>ej?e7e;f  e7f Z@ej6dejAejBejBf ej>ej?ejBejBf  f ZCej6deejAe7e7f f ZDej6ej?ej6e7eEf ej6e7eEf f ejFdgdf df ZGej6e<dejAe<ej6e<df f f ZHej6eIe7eEejJeE f ZKej6eIe7eEejLeE f ZMejAe7ej6ejNejB ej?e7ejNejB f ej?e7ejNejB e7f f f ZOej6eEejJeE f ZPej6eEejLeE f ZQG dd dZRG dd dZSG dd dej=e7e7f ZTG dd dej
e7e7f ZUG dd dZVG dd deVZWG dd deVZXG dd  d ZYG d!d" d"eYZZG d#d$ d$eYZ[G d%d de
Z\dS )&    N)MutableMapping)Cookie	CookieJar)	parse_qsl	urlencode   )
USER_AGENT)ACCEPT_ENCODINGSUPPORTED_DECODERSDecoderIdentityDecoderMultiDecoderTextDecoder)CookieConflict	HTTPError
InvalidURLNotRedirectResponseResponseClosedResponseNotReadStreamConsumed)multipart_encode)
StatusCode)guess_json_utfis_known_encodingnormalize_header_keynormalize_header_valueobfuscate_sensitive_headersparse_header_linksstr_query_param)BaseMiddleware)AsyncDispatcherURLQueryParamsHeadersCookiesAsyncRequestr   r    c                   @   s  e Zd Zd5eeeddddZeedddZ	eedd	d
Z
eedddZeedddZeedddZeedddZeedddZeedddZeedddZejeje ddddZeedddZeedddZeeddd Zeedd!d"Zed#dd$d%Zejd d&d'd(Zed d)d*d+Zedd,d-Zejed.d/d0Zedd1d2Z edd3d4Z!dS )6r!   FN)urlallow_relativeparamsreturnc                 C   s   t |trtj| | _n|j| _| jr8| j | _|rXtt	|}| jj
|d| _|sx| jsjtd| jsxtdd | _d S )N)queryzNo scheme included in URL.zNo host included in URL.)
isinstancestrrfc3986ZapiZiri_referenceencode_uri_referenceis_absolute_url	normalizer"   	copy_withschemer   host
_full_path)selfr&   r'   r(   query_string r8   l/var/www/html/staging.mfahmagazine.net/magazine_api/magazine_env/lib/python3.8/site-packages/httpx/models.py__init__d   s    
zURL.__init__r)   c                 C   s   | j jp
dS N )r/   r3   r6   r8   r8   r9   r3      s    z
URL.schemec                 C   s   | j jp
dS r<   )r/   	authorityr>   r8   r8   r9   r?      s    zURL.authorityc                 C   s   | j jp
d}|dd S )Nr=   :r   r/   userinfo	partitionr6   rB   r8   r8   r9   username   s    zURL.usernamec                 C   s   | j jp
d}|dd S )Nr=   r@      rA   rD   r8   r8   r9   password   s    zURL.passwordc                 C   s   | j jp
dS r<   )r/   r4   r>   r8   r8   r9   r4      s    zURL.hostc                 C   s(   | j j}|d kr ddd| j S t|S )Ni  P   )httpshttp)r/   portr3   int)r6   rK   r8   r8   r9   rK      s    zURL.portc                 C   s   | j jp
dS )N/)r/   pathr>   r8   r8   r9   rN      s    zURL.pathc                 C   s   | j jp
dS r<   )r/   r*   r>   r8   r8   r9   r*      s    z	URL.queryc                 C   s.   | j d k	r| j S | j}| jr*|d| j 7 }|S )N?)r5   rN   r*   )r6   rN   r8   r8   r9   	full_path   s    
zURL.full_pathvaluer)   c                 C   s
   || _ d S N)r5   r6   rR   r8   r8   r9   rP      s    c                 C   s   | j jp
dS r<   )r/   fragmentr>   r8   r8   r9   rU      s    zURL.fragmentc                 C   s
   | j dkS )NrI   )r3   r>   r8   r8   r9   is_ssl   s    z
URL.is_sslc                 C   s   t | jo| jS )z
        Return `True` for absolute URLs such as 'http://example.com/path',
        and `False` for relative URLs such as '/path'.
        )boolr3   r4   r>   r8   r8   r9   r0      s    
zURL.is_absolute_urlc                 C   s   | j  S rS   )r0   r>   r8   r8   r9   is_relative_url   s    zURL.is_relative_urlOriginc                 C   s   t | S rS   )rY   r>   r8   r8   r9   origin   s    z
URL.originkwargsr)   c                 K   s   t | jjf | S rS   )r!   r/   r2   unsplit)r6   r\   r8   r8   r9   r2      s    zURL.copy_with)relative_urlr)   c                 C   s<   | j rt|S | jjdd}t|dd}t|j| S )zK
        Return an absolute URL, using given this URL as the base.
        N)rU   T)r'   )rX   r!   r/   r2   Zresolve_withr]   )r6   r^   Zbase_urir8   r8   r9   join   s
    zURL.joinc                 C   s   t t| S rS   )hashr,   r>   r8   r8   r9   __hash__   s    zURL.__hash__otherr)   c                 C   s   t |ttfot| t|kS rS   )r+   r!   r,   r6   rc   r8   r8   r9   __eq__   s    z
URL.__eq__c                 C   s
   | j  S rS   )r/   r]   r>   r8   r8   r9   __str__   s    zURL.__str__c                 C   sF   | j j}t| }| jjr6t|j| j dd	 }| d|dS )Nz	:[secure])rB   ())
	__class____name__r,   r/   rB   r-   urlparser2   rE   r]   )r6   
class_nameZurl_strr8   r8   r9   __repr__   s    

zURL.__repr__)FN)"rj   
__module____qualname__URLTypesrW   QueryParamTypesr:   propertyr,   r3   r?   rE   rG   r4   rL   rK   rN   r*   rP   settertypingOptionalrU   rV   r0   rX   rZ   Anyr2   r_   ra   re   rf   rm   r8   r8   r8   r9   r!   c   sX     c                   @   sN   e Zd ZdZeddddZejedddZ	e
d	d
dZed	ddZdS )rY   zU
    The URL scheme and authority information, as a comparable, hashable object.
    N)r&   r)   c                 C   s6   t |tst|}|j| _|j| _|j| _|j| _d S rS   )r+   r!   r3   rV   r4   rK   )r6   r&   r8   r8   r9   r:      s    
zOrigin.__init__rb   c                 C   s0   t || jo.| j|jko.| j|jko.| j|jkS rS   )r+   ri   r3   r4   rK   rd   r8   r8   r9   re     s    


zOrigin.__eq__r;   c                 C   s   t | j| j| jfS rS   )r`   r3   r4   rK   r>   r8   r8   r9   ra     s    zOrigin.__hash__c                 C   s*   | j j}| d| jd| jd| j dS )Nz(scheme=z host=z port=rh   )ri   rj   r3   r4   rK   )r6   rl   r8   r8   r9   rm     s     zOrigin.__repr__)rj   rn   ro   __doc__rp   r:   rt   rv   rW   re   rL   ra   r,   rm   r8   r8   r8   r9   rY      s
   rY   c                   @   s>  e Zd ZdZeejddddZejeje	 dddZ
ejd	d
dZejd	ddZejd	ddZejeje	e	f  d	ddZd*ejejejdddZd+eddddZeje	dddZe	e	ddddZejedddZejej d	dd Zed	d!d"Zejed#d$d%Ze	d	d&d'Ze	d	d(d)ZdS ),r"   z0
    URL query parameters, as a multi-dict.
    N)argsr\   r)   c                 O   s   t |dk std|r$|r$td|r0|d n|}t|trHt|}n,t|tr\| }nt|trl|}n| }dd |D | _	dd |D | _
d S )	NrF   zToo many arguments.z'Cannot mix named and unnamed arguments.r   c                 S   s    g | ]\}}t |t|fqS r8   r,   r   .0kvr8   r8   r9   
<listcomp>)  s     z(QueryParams.__init__.<locals>.<listcomp>c                 S   s   i | ]\}}t |t|qS r8   ry   rz   r8   r8   r9   
<dictcomp>*  s      z(QueryParams.__init__.<locals>.<dictcomp>)lenAssertionErrorr+   r,   r   r"   multi_itemslistitems_list_dict)r6   rx   r\   rR   r   r8   r8   r9   r:     s    




zQueryParams.__init__keyr)   c                    s    fdd| j D S )Nc                    s   g | ]\}}| kr|qS r8   r8   r{   item_keyZ
item_valuer   r8   r9   r~   -  s      z'QueryParams.getlist.<locals>.<listcomp>r   r6   r   r8   r   r9   getlist,  s    zQueryParams.getlistr;   c                 C   s
   | j  S rS   )r   keysr>   r8   r8   r9   r   /  s    zQueryParams.keysc                 C   s
   | j  S rS   )r   valuesr>   r8   r8   r9   r   2  s    zQueryParams.valuesc                 C   s
   | j  S rS   )r   r   r>   r8   r8   r9   r   5  s    zQueryParams.itemsc                 C   s
   t | jS rS   )r   r   r>   r8   r8   r9   r   8  s    zQueryParams.multi_itemsr   defaultr)   c                 C   s   || j kr| j | S |S rS   r   r6   r   r   r8   r8   r9   get;  s    

zQueryParams.get)r(   r)   c                 C   s*   |sd S t |}|D ]}|| | |< qd S rS   )r"   )r6   r(   paramr8   r8   r9   update@  s
    zQueryParams.updatec                 C   s
   | j | S rS   r   r   r8   r8   r9   __getitem__H  s    zQueryParams.__getitem__r   rR   r)   c                 C   s   || j |< g }t| jD ]\}\}}||kr|| qt|dd  D ]}| j|= qH|rr|d }||f| j|< n| j||f d S )Nr   r   )r   	enumerater   appendreversed)r6   r   rR   found_indexesidxr   _r8   r8   r9   __setitem__K  s    

zQueryParams.__setitem__c                 C   s
   || j kS rS   r   r   r8   r8   r9   __contains__\  s    zQueryParams.__contains__c                 C   s   t |  S rS   iterr   r>   r8   r8   r9   __iter___  s    zQueryParams.__iter__c                 C   s
   t | jS rS   )r   r   r>   r8   r8   r9   __len__b  s    zQueryParams.__len__rb   c                 C   s$   t || jsdS t| jt|jkS NF)r+   ri   sortedr   rd   r8   r8   r9   re   e  s    zQueryParams.__eq__c                 C   s
   t | jS rS   )r   r   r>   r8   r8   r9   rf   j  s    zQueryParams.__str__c                 C   s    | j j}t| }| d|dS )Nrg   rh   )ri   rj   r,   )r6   rl   r7   r8   r8   r9   rm   m  s    zQueryParams.__repr__)N)N) rj   rn   ro   rw   rq   rt   rv   r:   Listr,   r   KeysViewr   
ValuesViewr   	ItemsViewr   Tupler   r   r   r   r   rW   r   Iteratorr   rL   r   re   rf   rm   r8   r8   r8   r9   r"     s"   c                   @   s  e Zd ZdZd2eeddddZeedddZej	edd	d
dZee
je
jeef  dddZe
je dddZe
je dddZe
je
jeef  dddZd3ee
je
jdddZd4eee
je dddZd5eddddZd dddZeedd d!Zeedd"d#d$Zeddd%d&Ze
jedd'd(Ze
je
j dd)d*Zedd+d,Ze
jed-d.d/Z edd0d1Z!dS )6r#   z9
    HTTP headers, as a case-insensitive multi-dict.
    N)headersencodingr)   c                    sj   |d krg | _ nPt|tr(t|j| _ n8t|trL fdd| D | _ n fdd|D | _  | _d S )Nc                    s$   g | ]\}}t | t| fqS r8   r   r   rz   r   r8   r9   r~   ~  s   z$Headers.__init__.<locals>.<listcomp>c                    s$   g | ]\}}t | t| fqS r8   r   rz   r   r8   r9   r~     s   )r   r+   r#   r   rawdictr   	_encoding)r6   r   r   r8   r   r9   r:   x  s    




zHeaders.__init__r;   c              
   C   sn   | j dkrhdD ]R}| jD ]<\}}z|| || W q tk
rR   Y  qY qX q|| _  qhqd| _ | j S )zn
        Header encoding is mandated as ascii, but we allow fallbacks to utf-8
        or iso-8859-1.
        N)asciiutf-8
iso-8859-1)r   r   decodeUnicodeDecodeError)r6   r   r   rR   r8   r8   r9   r     s    

zHeaders.encodingrQ   c                 C   s
   || _ d S rS   r   rT   r8   r8   r9   r     s    c                 C   s   | j S )zi
        Returns a list of the raw header items, as byte pairs.
        May be mutated in-place.
        r   r>   r8   r8   r9   r     s    zHeaders.rawc                    s    fdd j D S )Nc                    s   g | ]\}}|  jqS r8   r   r   r{   r   rR   r>   r8   r9   r~     s     z Headers.keys.<locals>.<listcomp>r   r>   r8   r>   r9   r     s    zHeaders.keysc                    s    fdd j D S )Nc                    s   g | ]\}}|  jqS r8   r   r   r>   r8   r9   r~     s     z"Headers.values.<locals>.<listcomp>r   r>   r8   r>   r9   r     s    zHeaders.valuesc                    s    fdd j D S )Nc                    s(   g | ] \}}|  j|  jfqS r8   r   r   r>   r8   r9   r~     s   z!Headers.items.<locals>.<listcomp>r   r>   r8   r>   r9   r     s    
zHeaders.itemsr   c                 C   s(   z
| | W S  t k
r"   | Y S X d S rS   )KeyErrorr   r8   r8   r9   r     s    
zHeaders.getF)r   split_commasr)   c                    sZ   |  j  fddjD }|s.|S g }|D ]}|dd |dD  q6|S )z0
        Return multiple header values.
        c                    s$   g | ]\}}| kr| jqS r8   r   r   get_header_keyr6   r8   r9   r~     s   z#Headers.getlist.<locals>.<listcomp>c                 S   s   g | ]}|  qS r8   )strip)r{   itemr8   r8   r9   r~     s     ,)lowerr.   r   r   extendsplit)r6   r   r   r   Zsplit_valuesrR   r8   r   r9   r     s    zHeaders.getlist)r   r)   c                 C   s"   t |}|D ]}|| | |< qd S rS   )r#   )r6   r   headerr8   r8   r9   r     s    zHeaders.updatec                 C   s   t |  | jdS )Nr   )r#   r   r   r>   r8   r8   r9   copy  s    zHeaders.copyr   c                 C   sX   |  | j}g }| jD ]"\}}||kr||| j q|rLd|S t|dS )z
        Return a single header value.

        If there are multiple headers with the same key, then we concatenate
        them with commas. See: https://tools.ietf.org/html/rfc7230#section-3.2.2
        , N)r   r.   r   r   r   r   r_   r   )r6   r   Znormalized_keyr   
header_keyZheader_valuer8   r8   r9   r     s    
zHeaders.__getitem__r   c           	      C   s   |  | j}|| j}g }t| jD ]\}\}}||kr*|| q*t|dd D ]}| j|= qZ|r|d }||f| j|< n| j||f dS )zs
        Set the header `key` to `value`, removing any duplicate entries.
        Retains insertion order.
        r   Nr   )r   r.   r   r   r   r   r   )	r6   r   rR   Zset_key	set_valuer   r   r   r   r8   r8   r9   r     s    
zHeaders.__setitem__c                 C   sd   |  | j}g }t| jD ]\}\}}||kr|| q|sJt|t|D ]}| j|= qRdS )z*
        Remove the header `key`.
        N)r   r.   r   r   r   r   r   r   )r6   r   Zdel_keyZpop_indexesr   r   r   r8   r8   r9   __delitem__  s    zHeaders.__delitem__c                 C   s2   |  | j}| jD ]\}}||kr dS qdS NTF)r   r.   r   r   )r6   r   r   r   r   r8   r8   r9   r     s
    zHeaders.__contains__c                 C   s   t |  S rS   r   r>   r8   r8   r9   r     s    zHeaders.__iter__c                 C   s
   t | jS rS   )r   r   r>   r8   r8   r9   r     s    zHeaders.__len__rb   c                 C   s"   t |tsdS t| jt|jkS r   )r+   r#   r   r   rd   r8   r8   r9   re   "  s    
zHeaders.__eq__c                 C   sv   | j j}d}| jdkr"d| j}tt|  }t|}t|t|k}|rb| d|| dS | d|| dS )Nr=   r   z, encoding=rg   rh   )ri   rj   r   r   r   r   r   r   )r6   rl   Zencoding_strZas_listZas_dictZno_duplicate_keysr8   r8   r9   rm   '  s    
zHeaders.__repr__)NN)N)F)N)"rj   rn   ro   rw   HeaderTypesr,   r:   rr   r   rs   rt   r   r   bytesr   r   r   r   rv   r   rW   r   r   r   r   r   r   r   r   r   rL   r   re   rm   r8   r8   r8   r9   r#   s  s.    c                   @   s   e Zd Zddddeejeef eee	dddZ
deeejejeef dddZdd	d
dZedd	ddZed	ddZdS )BaseRequestN)r(   r   cookiesmethodr&   r(   r   r   c                C   s@   |  | _t||d| _t|| _|r<t|| _| j|  d S )N)r(   )	upperr   r!   r&   r#   r   r$   _cookiesset_cookie_header)r6   r   r&   r(   r   r   r8   r8   r9   r:   8  s    	


zBaseRequest.__init__)datafilesjsonr)   c                 C   sj   |d k	rt |d}d}nD|d k	r:t|p.i |\}}n(|d k	rZt|ddd}d}nd}d}||fS )Nr   zapplication/jsonT)doseqz!application/x-www-form-urlencoded    r=   )jsonlibdumpsr.   r   r   )r6   r   r   r   contentcontent_typer8   r8   r9   encode_dataH  s    zBaseRequest.encode_datar;   c                 C   s"  t | dd }t | dd}g }d| jk}d| jk}d| jk}d| jkpLd| jk}d	| jk}d
| jk}	|s~|d| jjdf |s|dtdf |s|d |s|r|d n"|rtt| }
|d|
f |s|dt	 f |	s|d t
|D ]}| jjd| qd S )Nr   is_streamingFr4   z
user-agentacceptzcontent-lengthztransfer-encodingzaccept-encodingZ
connections   hostr   s
   user-agent)s   accepts   */*)s   transfer-encodings   chunkeds   content-lengths   accept-encoding)s
   connections
   keep-aliver   )getattrr   r   r&   r?   r.   r   r,   r   r	   r   r   insert)r6   r   r   Zauto_headersZhas_hostZhas_user_agentZ
has_acceptZhas_content_lengthZhas_accept_encodingZhas_connectionZcontent_lengthr   r8   r8   r9   prepareX  s8    






zBaseRequest.preparer$   c                 C   s   t | dst | _| jS Nr   )hasattrr$   r   r>   r8   r8   r9   r   {  s    
zBaseRequest.cookiesc                 C   s,   | j j}t| j}d| d| jd|dS )N<rg   r   z)>)ri   rj   r,   r&   r   )r6   rl   r&   r8   r8   r9   rm     s    
zBaseRequest.__repr__)NNN)rj   rn   ro   r,   rt   Unionr!   rq   r   CookieTypesr:   r   RequestFilesrv   r   r   r   r   rr   r   rm   r8   r8   r8   r9   r   7  s.          #r   c                
       sn   e Zd Zdddddddeejeef eee	e
eejd fddZedddZeje dd	d
Z  ZS )r%   Nr(   r   r   r   r   r   r   r&   r(   r   r   r   r   r   c                   s   t  j|||||d |d ks(t|trV| |||\}	}
d| _|	| _|
r|
| jd< nNt|tt	frt|trx|
dn|}d| _|| _nt|dstd| _|| _|   d S )Nr   FContent-Typer   	__aiter__T)superr:   r+   r   r   r   r   r   r,   r   r.   r   r   content_aiterr   r6   r   r&   r(   r   r   r   r   r   r   r   ri   r8   r9   r:     s*        zAsyncRequest.__init__r;   c                    s0   t | ds*ddd |  2 I dH | _| jS )7
        Read and return the response content.
        r   r   c                    s   g | z3 d H W }|q6 S rS   r8   r{   partr8   r8   r9   r~     s     z%AsyncRequest.read.<locals>.<listcomp>Nr   r_   streamr   r>   r8   r8   r9   read  s    
 zAsyncRequest.readc                 C  s6   | j r$| j2 z3 d H W }|V  q6 n| jr2| jV  d S rS   )r   r   r   r6   r   r8   r8   r9   r     s
    zAsyncRequest.stream)rj   rn   ro   r,   rt   r   r!   rq   r   r   AsyncRequestDatar   rv   r:   r   r   AsyncIteratorr   __classcell__r8   r8   r   r9   r%     s$    c                
       sn   e Zd Zdddddddeejeef eee	e
eejd fddZedddZeje dd	d
Z  ZS )RequestNr   r   c                   s   t  j|||||d |d ks(t|trV| |||\}	}
d| _|	| _|
r|
| jd< nNt|tt	frt|trx|
dn|}d| _|| _nt|dstd| _|| _|   d S )Nr   Fr   r   r   T)r   r:   r+   r   r   r   r   r   r,   r   r.   r   r   content_iterr   r   r   r8   r9   r:     s*        zRequest.__init__r;   c                 C   s*   t | ds$ddd |  D | _| jS )Nr   r   c                 S   s   g | ]}|qS r8   r8   r   r8   r8   r9   r~     s     z Request.read.<locals>.<listcomp>r   r>   r8   r8   r9   r     s    
zRequest.readc                 c   s,   | j r| jD ]
}|V  qn| jr(| jV  d S rS   )r   r   r   r   r8   r8   r9   r     s
    

zRequest.stream)rj   rn   ro   r,   rt   r   r!   rq   r   r   RequestDatar   rv   r:   r   r   r   r   r   r8   r8   r   r9   r     s$   !r   c                   @   sv  e Zd Zddddddeeeeeje	j
dddZeedddZeeje dd	d
ZeedddZeedddZeedddZejeddddZeeje dddZeeje dddZeedddZeedddZddddZejejee f dddZ!ed dd!d"Z"eej#eje ej#eef f dd#d$Z$edd%d&Z%dS )'BaseResponseN)http_versionr   requeston_closeelapsedstatus_coder  r   r  r  r  c                C   sD   || _ || _t|| _|| _|| _|d kr4tdn|| _d | _	d S )Nr   )
r  r  r#   r   r  r  datetime	timedeltar  	call_next)r6   r  r  r   r  r  r  r8   r8   r9   r:     s    

zBaseResponse.__init__r;   c                 C   s   t | jS rS   )r   Zget_reason_phraser  r>   r8   r8   r9   reason_phrase  s    zBaseResponse.reason_phrasec                 C   s   | j dkrdS | j jS )z
        Returns the URL for which the request was made.

        Requires that `request` was provided when instantiating the response.
        N)r  r&   r>   r8   r8   r9   r&     s    zBaseResponse.urlc                 C   sH   t | dsBt | dr<| j}| j|}|| j 7 }|| _nt | jS )N_content_raw_content)r   r  decoderr   flushr  r   )r6   Zraw_contentr   r8   r8   r9   r     s    

zBaseResponse.contentc                 C   s8   t | ds2| j}|sd| _n| j}|j|dd| _| jS )N_textr=   replace)errors)r   r   r  r   r   )r6   r   r   r8   r8   r9   text  s    
zBaseResponse.textc                 C   sF   t | ds@| j}|d ks t|s:| j}|d ks6t|s:d}|| _| jS )Nr   r   )r   charset_encodingr   apparent_encodingr   )r6   r   r8   r8   r9   r     s    
zBaseResponse.encodingrQ   c                 C   s
   || _ d S rS   r   rT   r8   r8   r9   r   *  s    c                 C   s\   | j d}|dkrdS t|}|d |d  }}d|krJ|d dS |drXdS dS )	zO
        Return the encoding, as specified by the Content-Type header.
        r   Nr   charsetz'"ztext/r   )r   r   cgiparse_headerr   
startswith)r6   r   parsedZ
media_typer(   r8   r8   r9   r  .  s    

zBaseResponse.charset_encodingc                 C   s   t | jd S )zF
        Return the encoding, as it appears to autodetection.
        r   )chardetdetectr   r>   r8   r8   r9   r  D  s    zBaseResponse.apparent_encodingc              	   C   s   t | dsg }| jjddd}|D ]B}|  }zt| }||  W q" tk
rb   Y q"Y q"X q"t|dkr~|d | _	n t|dkrt
|| _	nt | _	| j	S )z
        Returns a decoder instance which can be used to decode the raw byte
        content, depending on the Content-Encoding used in the response.
        _decoderzcontent-encodingT)r   r   r   )r   r   r   r   r   r
   r   r   r   r  r   r   )r6   decodersr   rR   Zdecoder_clsr8   r8   r9   r  K  s     
zBaseResponse.decoderc                 C   s   t | jod| jkS )Nlocation)r   is_redirectr  r   r>   r8   r8   r9   r!  e  s    zBaseResponse.is_redirectc                 C   sT   d}t | jr |j| dd}n t | jr<|j| dd}nd}|rPt|| ddS )z8
        Raise the `HttpError` if one occurred.
        z{0.status_code} {error_type}: {0.reason_phrase} for url: {0.url}
For more information check: https://httpstatuses.com/{0.status_code}zClient Error)Z
error_typezServer Errorr=   responseN)r   Zis_client_errorr  formatZis_server_errorr   )r6   messager8   r8   r9   raise_for_statusi  s    zBaseResponse.raise_for_statusr[   c                 K   sn   | j d kr^| jr^t| jdkr^t| j}|d k	r^ztj| j|f|W S  tk
r\   Y nX tj| jf|S )N   )	r  r   r   r   r   loadsr   r   r  )r6   r\   r   r8   r8   r9   r   {  s    
zBaseResponse.jsonr$   c                 C   s2   t | ds,| jd k	stt | _| j|  | jS r   )r   r  r   r$   r   extract_cookiesr>   r8   r8   r9   r     s
    
zBaseResponse.cookiesc                 C   sF   | j d}i }|rBt|}|D ] }|dp6|d}|||< q |S )zI
        Returns the parsed header links of the response, if any
        linkrelr&   )r   r   r   )r6   r   Zldictlinksr*  r   r8   r8   r9   r,    s    
zBaseResponse.linksc                 C   s   d| j  d| j dS )Nz<Response [ z]>)r  r  r>   r8   r8   r9   rm     s    zBaseResponse.__repr__)&rj   rn   ro   rL   r,   r   r   rt   Callabler  r	  r:   rr   r  ru   r!   r&   r   r   r  r   rs   r  r  r   r  rW   r!  r&  rv   r   r   r   r   r   Dictr,  rm   r8   r8   r8   r9   r    sP   


*r  c                
       s   e Zd Zddddddddeeeeeje	ej
d ejd fddZeddd	Zeje dd
dZeje dddZeje dddZd dddZddddZ  ZS )AsyncResponseNr  r   r   r  r  historyr  r  r  r  r   r   r  r  r2  r  c          	         sn   t  j||||||d |d kr$g nt|| _|d ks@t|trXd| _d| _|pRd| _nd| _d| _|| _	d S Nr  Tr   F
r   r:   r   r2  r+   r   	is_closedis_stream_consumedr  _raw_stream	r6   r  r  r   r   r  r  r2  r  r   r8   r9   r:     s     	zAsyncResponse.__init__r;   c                    s0   t | ds*ddd |  2 I dH | _| jS )r   r  r   c                    s   g | z3 d H W }|q6 S rS   r8   r   r8   r8   r9   r~     s     z&AsyncResponse.read.<locals>.<listcomp>Nr   r_   r   r  r>   r8   r8   r9   r     s    
 zAsyncResponse.readc                 C  sJ   t | dr| jV  n2|  2 z3 dH W }| j|V  q6 | j V  dS z
        A byte-iterator over the decoded response content.
        This allows us to handle gzip, deflate, and brotli encoded responses.
        r  Nr   r  r   r  r   r  r6   chunkr8   r8   r9   r     s
    

zAsyncResponse.streamc                 C  s>   t | jd}|  2 z3 dH W }||V  q6 | V  dS z
        A str-iterator over the decoded response content
        that handles both gzip, deflate, etc but also detects the content's
        string encoding.
        r   Nr   r  r   r   r  r6   r  r>  r8   r8   r9   stream_text  s    zAsyncResponse.stream_textc                 C  s`   t | dr| jV  nH| jr t | jr,t d| _| j2 z3 dH W }|V  q86 |  I dH  dS z@
        A byte-iterator over the raw response content.
        r  TNr   r  r7  r   r6  r   r8  closer   r8   r8   r9   r     s    


zAsyncResponse.rawc                    s(   | j st | jdk	st|  I dH S )zA
        Get the next response from a redirect response.
        N)r!  r   r
  r   r>   r8   r8   r9   next  s    zAsyncResponse.nextc                    s(   | j s$d| _ | jdk	r$|  I dH  dS z
        Close the response and release the connection.
        Automatically called if the response body is read to completion.
        TNr6  r  r>   r8   r8   r9   rE    s    
zAsyncResponse.close)rj   rn   ro   rL   r,   r   AsyncResponseContentrt   r.  r%   r   r  r	  r:   r   r   r   r   rB  r   rF  rE  r   r8   r8   r   r9   r0    s.    	r0  c                
       s   e Zd Zddddddddeeeeeje	ej
d ejd fddZeddd	Zeje dd
dZeje dddZeje dddZddddZ  ZS )ResponseNr1  r  r3  c          	         sn   t  j||||||d |d kr$g nt|| _|d ks@t|trXd| _d| _|pRd| _nd| _d| _|| _	d S r4  r5  r9  r   r8   r9   r:     s     	zResponse.__init__r;   c                 C   s*   t | ds$ddd |  D | _| jS )r   r  r   c                 S   s   g | ]}|qS r8   r8   r   r8   r8   r9   r~   *  s     z!Response.read.<locals>.<listcomp>r:  r>   r8   r8   r9   r   %  s    
zResponse.readc                 c   s@   t | dr| jV  n(|  D ]}| j|V  q| j V  dS r;  r<  r=  r8   r8   r9   r   -  s
    

zResponse.streamc                 c   s4   t | jd}|  D ]}||V  q| V  dS r?  r@  rA  r8   r8   r9   rB  9  s    zResponse.stream_textc                 c   sP   t | dr| jV  n8| jr t | jr,t d| _| jD ]
}|V  q8|   dS rC  rD  r   r8   r8   r9   r   D  s    


zResponse.rawc                 C   s"   | j sd| _ | jdk	r|   dS rG  rH  r>   r8   r8   r9   rE  U  s    
zResponse.close)rj   rn   ro   rL   r,   r   ResponseContentrt   r.  r   r   r  r	  r:   r   r   r   r   rB  r   rE  r   r8   r8   r   r9   rJ    s,    rJ  c                   @   s8  e Zd ZdZd/eddddZeddddZedd	d
dZ	d0e
e
e
e
ddddZd1e
e
e
e
eje
 dddZd2e
e
e
ddddZd3e
e
ddddZd4eddddZe
e
ddddZe
e
dd d!Ze
ddd"d#Zed$d%d&Zeje
 d$d'd(Zed$d)d*ZG d+d, d,ejjZG d-d. d.ZdS )5r$   z-
    HTTP Cookies, as a mutable mapping.
    N)r   r)   c                 C   sz   |d kst |trDt | _t |trv| D ]\}}| || q,n2t |trpt | _|jD ]}| j| q\n|| _d S rS   )r+   r   r   jarr   setr$   
set_cookie)r6   r   r   rR   cookier8   r8   r9   r:   e  s    


zCookies.__init__)r#  r)   c                 C   s6   |j dk	st| |}| |j }| j|| dS )zO
        Loads any cookies based on the response `Set-Cookie` headers.
        N)r  r   _CookieCompatResponse_CookieCompatRequestrL  r)  )r6   r#  Zurlib_responseurllib_requestr8   r8   r9   r)  r  s    
zCookies.extract_cookiesr  r)   c                 C   s   |  |}| j| dS )zM
        Sets an appropriate 'Cookie:' HTTP header on the `Request`.
        N)rQ  rL  Zadd_cookie_header)r6   r  rR  r8   r8   r9   r   |  s    
zCookies.set_cookie_headerr=   rM   )namerR   domainrN   r)   c                 C   sT   d||dd|t ||d|t |dddddddidd}tf |}| j| dS )zU
        Set a cookie value by name. May optionally include domain and path.
        r   NF.TZHttpOnly)versionrT  rR   rK   Zport_specifiedrU  Zdomain_specifiedZdomain_initial_dotrN   Zpath_specifiedZsecureZexpiresdiscardcommentZcomment_urlrestZrfc2109)rW   r  r   rL  rN  )r6   rT  rR   rU  rN   r\   rO  r8   r8   r9   rM    s(    
zCookies.set)rT  r   rU  rN   r)   c                 C   sn   d}| j D ]R}|j|kr
|dks*|j|kr
|dks<|j|kr
|dk	rVd| }t||j}q
|dkrj|S |S )z
        Get a cookie by name. May optionally include domain and path
        in order to specify exactly which cookie to retrieve.
        Nz!Multiple cookies exist with name=)rL  rT  rU  rN   r   rR   )r6   rT  r   rU  rN   rR   rO  r%  r8   r8   r9   r     s    


zCookies.get)rT  rU  rN   r)   c                 C   s   |dk	r |dk	r | j |||S g }| j D ]<}|j|kr*|dksJ|j|kr*|dks\|j|kr*|| q*|D ]}| j |j|j|j qldS )z
        Delete a cookie by name. May optionally include domain and path
        in order to specify exactly which cookie to delete.
        N)rL  clearrT  rU  rN   r   )r6   rT  rU  rN   removerO  r8   r8   r9   delete  s    

zCookies.delete)rU  rN   r)   c                 C   sD   g }|dk	r| | |dk	r4|dk	s*t| | | jj|  dS )z
        Delete all cookies. Optionally include a domain and path in
        order to only delete a subset of all the cookies.
        N)r   r   rL  r[  )r6   rU  rN   rx   r8   r8   r9   r[    s    

zCookies.clearc                 C   s$   t |}|jD ]}| j| qd S rS   )r$   rL  rN  )r6   r   rO  r8   r8   r9   r     s    
zCookies.update)rT  rR   r)   c                 C   s   |  ||S rS   )rM  r6   rT  rR   r8   r8   r9   r     s    zCookies.__setitem__)rT  r)   c                 C   s   |  |}|d krt||S rS   )r   r   r^  r8   r8   r9   r     s    
zCookies.__getitem__c                 C   s
   |  |S rS   )r]  )r6   rT  r8   r8   r9   r     s    zCookies.__delitem__r;   c                 C   s
   t | jS rS   )r   rL  r>   r8   r8   r9   r     s    zCookies.__len__c                 C   s   dd | j D S )Nc                 s   s   | ]}|j V  qd S rS   )rT  )r{   rO  r8   r8   r9   	<genexpr>  s     z#Cookies.__iter__.<locals>.<genexpr>rL  r>   r8   r8   r9   r     s    zCookies.__iter__c                 C   s   | j D ]} dS dS r   r`  )r6   r   r8   r8   r9   __bool__  s    
zCookies.__bool__c                       s>   e Zd ZdZedd fddZeedd fddZ  ZS )	zCookies._CookieCompatRequest
        Wraps a `Request` instance up in a compatibility interface suitable
        for use with `CookieJar` operations.
        NrS  c                    s*   t  jt|jt|j|jd || _d S )N)r&   r   r   )r   r:   r,   r&   r   r   r   r  )r6   r  r   r8   r9   r:     s    z%Cookies._CookieCompatRequest.__init__r   c                    s   t  || || jj|< d S rS   )r   add_unredirected_headerr  r   )r6   r   rR   r   r8   r9   rc    s    z4Cookies._CookieCompatRequest.add_unredirected_header)	rj   rn   ro   rw   r   r:   r,   rc  r   r8   r8   r   r9   rQ    s   rQ  c                   @   s0   e Zd ZdZedddZejjdddZ	dS )	zCookies._CookieCompatResponserb  r"  c                 C   s
   || _ d S rS   r"  )r6   r#  r8   r8   r9   r:     s    z&Cookies._CookieCompatResponse.__init__r;   c                 C   s,   t j }| jj D ]\}}|||< q|S rS   )emailr%  Messager#  r   r   )r6   infor   rR   r8   r8   r9   rf    s    

z"Cookies._CookieCompatResponse.infoN)
rj   rn   ro   rw   r  r:   rd  r%  re  rf  r8   r8   r8   r9   rP    s   rP  )N)r=   rM   )NNN)NN)NN)N) rj   rn   ro   rw   r   r:   r  r)  r   r   r,   rM  rt   ru   r   r]  r[  r   r   r   r   rL   r   r   r   rW   ra  urllibr  r   rQ  rP  r8   r8   r8   r9   r$   `  s4   
        )]r  r  email.messagerd  r   r   rt   Zurllib.requestrg  collections.abcr   Zhttp.cookiejarr   r   urllib.parser   r   r  r-   configr   r  r	   r
   r   r   r   r   
exceptionsr   r   r   r   r   r   r   	multipartr   Zstatus_codesr   utilsr   r   r   r   r   r   r   ZTYPE_CHECKINGZmiddleware.baser   Zdispatch.baser    ru   r   r,   rL   floatrW   ZPrimitiveDatarp   Mappingr   r   rq   r/  ZAnyStrr   r   r   r.  Z	AuthTypesZProxiesTypesr   r   r   r   r   ZIOr   rI  rK  r!   rY   r"   r#   r   r%   r   r  r0  rJ  r$   r8   r8   r8   r9   <module>   s    $	$
 
 ^ EP1/ 9e\