U
    nËj
=  ã                &   @  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rªd dlZdd	œd
d„Zdddœdd„ZdŒddddœdd„Zddddddœdd„Zd�d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(dŽd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d€dz�ej0d�dFdFde-d‚dƒ�ddd„dd„d…dd„d„d†dd‡ddddˆddd‰œdŠd‹„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ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]URLúISend the request via a proxy. Should be the URL giving the proxy address.z--timeout [cyan]FLOATúzTimeout 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-7ig9zwdf/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ƒr¤t|ƒ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� q‚W 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}z’t |
|||d��x}|j|| t|ƒ|t|ƒ|||t|ƒ|	|dtjt|d�id��0}|dk	r‚t||ƒ n| ¡  |j	r˜t
|ƒ 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	 ÿ'
ú
úûúúúúûùûú
ûûúýúú