U
    g
=                  &   @  s  d dl mZ 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	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 ddlmZ ddlmZ ejrd dlZdd	d
dZdddddZdddddddZddddddddZdddddddZddddddd d!Zdddd"d#Z ej!ej!e"e"f d$f Z#ej!e#d$f Z$ej%e"ej&e"e$e#f f Z'd%dd&d'd(Z(ddd)ddd*d+d,Z)dd-dd.d/d0Z*d1d2d3d3d4d5d6Z+d1d2d3d3d4d7d8Z,d1d2d3dd4d9d:Z-ej.dd;ej/d<e"d=ej0d>d?d@e"dAdBej0dCdDdEe"e"fdFdGdHej0dIdJdKe"dLdBej0dMdNdOe"e"fdFdPdHej0dQdRdSe"ej1dTdUfdFdVdHej0dWdXdYe"e+dZd[ej0d\d]d^e"e"fdFd_dHej0d`dae"e"fdFdbdHej0dcdde"e"fdee,dfdgej0dhdie"ddjdkej0dldme2dndodkej0dpdqdFddrdsej0dtdudFdFdvdsej0dwdxe3dFddydzej0d{e1d|d}dBej0d~de3dFdddzej0ddFdFde-dddddddddddddddddddddddZ4dS )    )annotationsN   )Client)RequestError)Response)codesNone)returnc                  C  sT  t j } | jddd |   | jddd |   | jddd |   t jjjddd	}|jd
dddd |d |dd |dd |dd |dd |dd |dd |dd |dd |dd |d d! |d"d# |d$d% |d&d' |d(d) |d*d+ |d,d- |d.d/ | | d S )0Nz[bold]HTTPX :butterfly:center)justifyzA next generation HTTP client.z7Usage: [bold]httpx[/bold] [cyan]<URL> [OPTIONS][/cyan] leftr   T)paddingZpad_edge	ParameterZbold)Zno_wrapr   styleDescriptionz-m, --method [cyan]METHODz{Request method, such as GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD.
[Default: GET, or POST if a request body is included]z#-p, --params [cyan]<NAME VALUE> .../Query parameters to include in the request URL.z-c, --content [cyan]TEXT,Byte content to include in the request body.z!-d, --data [cyan]<NAME VALUE> ...)Form data to include in the request body.z%-f, --files [cyan]<NAME FILENAME> ...*Form files to include in the request body.z-j, --json [cyan]TEXT)JSON data to include in the request body.z$-h, --headers [cyan]<NAME VALUE> .../Include additional HTTP headers in the request.z --cookies [cyan]<NAME VALUE> ..."Cookies to include in the request.z--auth [cyan]<USER PASS>Username and password to include in the request. Specify '-' for the password to use a password prompt. Note that using --verbose/-v will expose the Authorization header, including the password encoding in a trivially reversible format.z--proxy [cyan]URLISend the request via a proxy. Should be the URL giving the proxy address.z--timeout [cyan]FLOATzTimeout value to use for network operations, such as establishing the connection, reading some data, etc... [Default: 5.0]--follow-redirectsAutomatically follow redirects.--no-verifyDisable SSL verification.--http2@Send the request using HTTP/2, if the remote server supports it.z--download [cyan]FILE?Save the response content as a file, rather than displaying it.z-v, --verbosez1Verbose output. Show request as well as response.--helpShow this message and exit.)	richconsoleConsoleprinttableZTableZgridZ
add_columnZadd_row)r%   r(    r)   //tmp/pip-unpacked-wheel-ql4n0x43/httpx/_main.py
print_help   s    
 
    r+   r   str)responser	   c                 C  s^   | j d}|d k	rZ|d\}}}ztttj|	 j
W S  tjjk
rX   Y nX dS )NzContent-Type; )headersget	partitiontypingcastr,   pygmentsZlexersZget_lexer_for_mimetypestripnameutilZClassNotFound)r-   content_typeZ	mime_type_r)   r)   r*   get_lexer_for_responseg   s     r;   Fzhttpcore.Requestbool)requesthttp2r	   c                   sh    rdnd} fdd| j D }| jd}| jjd}| d| d| gdd |D  }d|S )	NzHTTP/2zHTTP/1.1c                   s$   g | ]\}} r|  n||fqS r)   )lower.0r7   valuer>   r)   r*   
<listcomp>v   s    z*format_request_headers.<locals>.<listcomp>ascii c                 S  s*   g | ]"\}}| d  d| d  qS rE   : decoder@   r)   r)   r*   rD   {   s    
)r0   methodrJ   urltargetjoin)r=   r>   versionr0   rL   rN   linesr)   rC   r*   format_request_headerst   s    
rR   bytesintzbytes | Nonezlist[tuple[bytes, bytes]])http_versionstatusreason_phraser0   r	   c                 C  sT   |  d}|d krt|n| d}| d| d| gdd |D  }d|S )NrE   rF   c                 S  s*   g | ]"\}}| d  d| d  qS rG   rI   r@   r)   r)   r*   rD      s    z+format_response_headers.<locals>.<listcomp>rK   )rJ   r   Zget_reason_phraserO   )rU   rV   rW   r0   rP   reasonrQ   r)   r)   r*   format_response_headers   s    
rY   c                 C  sV   t j }t| |d}t jj|dddd}|| t jjddddd}|| d S )NrC   http	ansi_darkTZthemeZ	word_wrapr/   )r$   r%   r&   rR   syntaxSyntaxr'   )r=   r>   r%   	http_textr]   r)   r)   r*   print_request_headers   s    

r`   c                 C  sX   t j }t| |||}t jj|dddd}|| t jjddddd}|| d S )NrZ   r[   Tr\   r/   )r$   r%   r&   rY   r]   r^   r'   )rU   rV   rW   r0   r%   r_   r]   r)   r)   r*   print_response_headers   s    

ra   c                 C  s   t j }t| }|r| dkrZz|  }tj|dd}W q` tk
rV   | j}Y q`X n| j}t j	j
||ddd}|| n|dt| j d d S )	Njson   )indentr[   Tr\   <z bytes of binary data>)r$   r%   r&   r;   r?   rb   dumps
ValueErrortextr]   r^   r'   lencontent)r-   r%   Z
lexer_namedatarh   r]   r)   r)   r*   print_response   s    
rl   ._PeerCertRetDictType)certr	   c              
   C  s   g }|   D ]\}}t|ttfr|d| d |D ]|}|dkrn|D ]"}|d|d  d|d  qHq8t|trt|dkr|d|d  d|d  q8|d| q8q|d| d| qd	|S )
Nz*   :)subjectZissuerz*     r   rH   r      rK   )items
isinstancelisttupleappendri   rO   )rn   rQ   keyrB   itemZsub_itemr)   r)   r*   format_certificate   s    " ry   ztyping.Mapping[str, typing.Any])r7   infoverboser	   c                 C  s  t j }| dkr2|r2|d }|d| nh| dkrr|rr|d }|d}|d|d d	|d
   n(| dkr|r|d }|d}| }| }	| }
| }|d|d|	d  |d| |
r|d |t	|
 n| dkr|r|d }t
|dd n|| dkrD|rD|d }t
|dd nV| dkrn|d \}}}}t|||| n,| dkr|d \}}d}d }t|||| d S )Nzconnection.connect_tcp.startedhostz* Connecting to zconnection.connect_tcp.completeZreturn_valueserver_addrz* Connected to r   z	 on port r   zconnection.start_tls.complete
ssl_objectz* SSL established using z / z* Selected ALPN protocol: z* Server certificate:z#http11.send_request_headers.startedr=   FrC   z"http2.send_request_headers.startedTz(http11.receive_response_headers.completez'http2.receive_response_headers.completes   HTTP/2)r$   r%   r&   r'   Zget_extra_inforP   ciphergetpeercertselected_alpn_protocolry   r`   ra   )r7   rz   r{   r%   r|   streamr}   r~   rP   r   Zserver_certZalpnr=   rU   rV   rW   r0   r)   r)   r*   trace   sD    

"



r   ztyping.BinaryIO)r-   downloadr	   c              	   C  s   t j }|  | jd}t jddt jjd dt j	 t j
 ^}dt j|j }|j|t|pld|d k	d}|  D ]}|| |j|| jd qW 5 Q R X d S )	NzContent-Lengthz([progress.description]{task.description}z-[progress.percentage]{task.percentage:>3.0f}%)Z	bar_widthzDownloading [bold]r   )totalstart)Z	completed)r$   r%   r&   r'   r0   r1   progressProgressZ	BarColumnZDownloadColumnZTransferSpeedColumnZmarkupescaper7   Zadd_taskrT   Z
iter_byteswriteupdateZnum_bytes_downloaded)r-   r   r%   content_lengthr   descriptionZdownload_taskchunkr)   r)   r*   download_response   s(    


r   zclick.Contextzclick.Option | click.Parameterz
typing.Any)ctxparamrB   r	   c                 C  s>   |d krd S zt |W S  t jk
r8   tdY nX d S )NzNot valid JSON)rb   loadsJSONDecodeErrorclickZBadParameterr   r   rB   r)   r)   r*   validate_json  s    r   c                 C  s2   |dkrd S |\}}|dkr*t jddd}||fS )NNN-ZPasswordT)Z
hide_input)r   prompt)r   r   rB   usernamepasswordr)   r)   r*   validate_auth  s    r   c                 C  s    |r
| j rd S t  |   d S )N)Zresilient_parsingr+   exitr   r)   r)   r*   handle_help-  s    
r   )add_help_optionrM   )typez--methodz-mrL   z{Request method, such as GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD. [Default: GET, or POST if a request body is included])r   helpz--paramsz-pparamsTr   )r   multipler   z	--contentz-crj   r   z--dataz-drk   r   z--filesz-ffilesrb)moder   z--jsonz-jrb   r   )r   callbackr   z	--headersz-hr0   r   z	--cookiescookiesr   z--authauthr   r   )r   defaultr   r   z--proxyproxyr   )r   r   r   z	--timeouttimeoutg      @r   r   follow_redirectsr   )is_flagr   r   r   verifyr   r   r>   r    )r   r   r   r   z
--downloadwbr!   z	--verbosez-vz*Verbose. Show request as well as response.r"   r#   )r   Zis_eagerZexpose_valuer   r   zlist[tuple[str, str]]zlist[tuple[str, click.File]]ztuple[str, str] | Nonefloatztyping.BinaryIO | None)rM   rL   r   rj   rk   r   rb   r0   r   r   r   r   r   r   r>   r   r{   r	   c                 C  s  |s|s|s|s|rdnd}zt |
|||dx}|j|| t||t||||t||	|dtjt|did0}|dk	rt|| n|  |j	rt
| W 5 Q R X W 5 Q R X W nT tk
r } z4tj }|dt|j d	|  td
 W 5 d}~X Y nX t|jrdnd
 dS )zU
    An HTTP command line client.
    Sends a request and displays the response.
    POSTGET)r   r   r>   r   r   )r{   )
r   rj   rk   r   rb   r0   r   r   r   
extensionsNz[red]z[/red]: r   r   )r   r   rt   dict	functoolspartialr   r   readrj   rl   r   r$   r%   r&   r'   r   __name__sysr   Z
is_success)rM   rL   r   rj   rk   r   rb   r0   r   r   r   r   r   r   r>   r   r{   clientr-   excr%   r)   r)   r*   main9  s<     # 
r   )F)F)F)5
__future__r   r   rb   r   r3   r   Zpygments.lexersr5   Zpygments.utilZrich.consoler$   Zrich.markupZrich.progressZrich.syntaxZ
rich.tableZ_clientr   _exceptionsr   Z_modelsr   Z_status_codesr   TYPE_CHECKINGZhttpcorer+   r;   rR   rY   r`   ra   rl   Tupler,   Z_PCTRTTZ_PCTRTTTDictUnionrm   ry   r   r   r   r   r   commandargumentoptionZFiler   r<   r   r)   r)   r)   r*   <module>   sH  M	 '


