o
    —¨Êh&  ã                   @  sò   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m	Z	 ddl
mZmZmZmZ ddlmZ dd	lmZ d
dlmZ zddlZW n eyS   d Z ZZY nw ddlmZ ejejejejdœZdZdZeg d¢ƒZ G dd„ deƒZ!dS )zHTTP Client using pyCurl.é    )Úannotations)Údeque)Úpartial)ÚBytesIO)Útime)ÚREADÚWRITEÚHubÚget_event_loop)Ú	HttpError)Úbytes_to_stré   )Ú
BaseClientN©ÚCurl)ÚGETÚPOSTÚPUTÚHEAD)Ú
CurlClientz Mozilla/5.0 (compatible; pycurl))ÚDELETEÚOPTIONSÚPATCHc                      s¸   e Zd ZdZeZd&d'‡ fdd	„Zd
d„ Zdd„ Zdd„ Zdd„ Z	e
fdd„Zdd„ Ze
fdd„Ze
fdd„Ze
fdd„Ze
fdd„Zdd„ Zd d!„ Zdde
fd"d#„Ze
fd$d%„Z‡  ZS )(r   zCurl HTTP Client.Né
   Úhubú
Hub | NoneÚmax_clientsÚintc                   sÐ   t d u rtdƒ‚|ptƒ }tƒ  |¡ |ˆ _t  ¡ ˆ _ˆ j t j	ˆ j
¡ ˆ j t jˆ j¡ ‡ fdd„t|ƒD ƒˆ _ˆ jd d … ˆ _tƒ ˆ _i ˆ _ˆ jjˆ _ˆ j dˆ j¡ˆ _t  ¡ }ˆ j |¡ ˆ j |¡ d S )Nz,The curl client requires the pycurl library.c                   s   g | ]}ˆ   ¡ ‘qS © r   )Ú.0Úi©Úselfr   úN/var/www/html/env/lib/python3.10/site-packages/kombu/asynchronous/http/curl.pyÚ
<listcomp>3   s    z'CurlClient.__init__.<locals>.<listcomp>g      ð?)ÚpycurlÚImportErrorr
   ÚsuperÚ__init__r   Ú	CurlMultiÚ_multiÚsetoptÚM_TIMERFUNCTIONÚ_set_timeoutÚM_SOCKETFUNCTIONÚ_handle_socketÚrangeÚ_curlsÚ
_free_listr   Ú_pendingÚ_fdsÚsocket_actionÚ_socket_actionr   Úcall_repeatedlyÚ_timeout_checkÚ_timeout_check_trefr   Ú
add_handleÚremove_handle)r"   r   r   Údummy_curl_handle©Ú	__class__r!   r#   r(   )   s&   


ÿzCurlClient.__init__c                 C  s,   | j  ¡  | jD ]}| ¡  q| j ¡  d S ©N)r9   Úcancelr1   Úcloser*   )r"   Ú_curlr   r   r#   rA   B   s   


zCurlClient.closec                 C  s"   | j  |¡ |  ¡  |  d¡ |S ©Nr   )r3   ÚappendÚ_process_queuer-   )r"   Úrequestr   r   r#   Úadd_requestH   s   
zCurlClient.add_requestc                 C  s   | j D ]}| j |¡ qd S r?   )r4   r   Úremove)r"   Úfdr   r   r#   Ú_pop_from_hubQ   ó   
ÿzCurlClient._pop_from_hubc                 C  sL   | j  ¡ D ]\}}|t@ r| j || j|¡ |t@ r#| j || j|¡ qd S r?   )	r4   Úitemsr   r   Ú
add_readerÚon_readabler   Ú
add_writerÚon_writable)r"   rI   Úeventsr   r   r#   Ú_push_to_hubU   s   €üzCurlClient._push_to_hubc                 C  sz   ||j kr|| jv r| j |d ¡ d S d S ||jkr!t| j|< d S ||jkr-t| j|< d S ||jkr;ttB | j|< d S d S r?   )ÚPOLL_REMOVEr4   ÚpopÚPOLL_INr   ÚPOLL_OUTr   Ú
POLL_INOUT)r"   ÚeventrI   ÚmultiÚdataÚ_pycurlr   r   r#   r/   \   s   

ÿ


ÿzCurlClient._handle_socketc                 C  s   | j  || j¡ d S r?   )r   Ú
call_laterr8   )r"   Úmsecsr   r   r#   r-   h   s   zCurlClient._set_timeoutc              
   C  s€   |   ¡  z0	 z	| j ¡ \}}W n tjy' } z|jd }W Y d }~nd }~ww ||jkr.nqW |  ¡  n|  ¡  w |  ¡  d S ©Nr   r   )	rJ   r*   Ú
socket_allr%   ÚerrorÚargsÚE_CALL_MULTI_PERFORMrR   Ú_process_pending_requests)r"   r[   ÚretÚ_Úexcr   r   r#   r8   k   s   €ÿ
úzCurlClient._timeout_checkc                 C  ó   |   ||j¡S r?   )Ú	_on_eventÚ
CSELECT_IN©r"   rI   r[   r   r   r#   rN   y   ó   zCurlClient.on_readablec                 C  rg   r?   )rh   ÚCSELECT_OUTrj   r   r   r#   rP   |   rk   zCurlClient.on_writablec              
   C  s‚   |   ¡  z1	 z
|  ||¡\}}W n tjy( } z|jd }W Y d }~nd }~ww ||jkr/nqW |  ¡  n|  ¡  w |  ¡  d S r^   )rJ   r6   r%   r`   ra   rb   rR   rc   )r"   rI   rX   r[   rd   re   rf   r   r   r#   rh      s   €ÿ
úzCurlClient._on_eventc                 C  s\   	 | j  ¡ \}}}|D ]}|  |¡ q|D ]\}}}|  |||¡ q|dkr'nq|  ¡  d S r^   )r*   Ú	info_readÚ_processrE   )r"   ÚqÚ	succeededÚfailedÚcurlÚerrnoÚreasonr   r   r#   rc   �   s   ùz$CurlClient._process_pending_requestsc                 C  s€   	 d}| j r;| jr;|d7 }| j  ¡ }| j ¡ }|  ¡ }tƒ }|||tƒ dœ|_|  ||||¡ | j	 
|¡ | j r;| js	|s?d S q)Nr   r   )ÚheadersÚbufferrF   Úcurl_start_time)r2   r3   rT   ÚpopleftÚHeadersr   r   ÚinfoÚ_setup_requestr*   r:   )r"   Ústartedrr   rF   ru   Úbufr   r   r#   rE   ˜   s&   

üóïzCurlClient._process_queuec              
   C  sª   |j d }|_ | j |¡ | j |¡ |d }|r,d}t||ƒ}||_d }	| ¡  d }nd }| |j	¡}| |j
¡}	| d¡ |d }
|
 | j|
||d ||	|d�¡ d S )Nrv   iW  r   rF   ru   )rF   Úcoderu   rv   Úeffective_urlr`   )rz   r*   r;   r2   rD   r   rs   rA   ÚgetinfoÚ	HTTP_CODEÚEFFECTIVE_URLÚseekÚon_readyÚResponse)r"   rr   rs   rt   r[   rz   rv   r~   r`   r   rF   r   r   r#   rn   ¬   s(   


þzCurlClient._processc                   s   |j }|ˆ jt|jƒƒ |j dd¡ |j dd¡ |ˆ jdd„ |j ¡ D ƒƒ |ˆ jt	|j
p1| j
|jƒƒ |ˆ j|jp>|jƒ |ˆ j|jƒ |ˆ jt|jpOtƒƒ |jr\|ˆ j|jƒ |ˆ j|jrddndƒ |jr�|jsqtdƒ‚|ˆ j|jƒ |ˆ j|jƒ |jr�|ˆ jd	 |j|jp�d¡ƒ |ˆ j |j!r˜d
ndƒ |ˆ j"|j!r£dndƒ |j#d ur²|ˆ j$|j#ƒ |ˆ j%t&j'ƒ t( )¡ D ]}||dƒ q½zt(|j* }W n t+yÝ   |  ˆ j,|j*¡ Y nw | -ˆ j,¡ ||dƒ |j*dv �r*|j.rø|j. /d¡nd}t0|ƒ‰|ˆ j1ˆj2ƒ |j*dk�r!‡ ‡fdd„}	|ˆ j3|	ƒ |ˆ j4t5|ƒƒ n|ˆ j6t5|ƒƒ n|j*dk�r6|j.�r6J ‚|j7d u�raˆ j8ˆ j9dœ|j:�pGd }
|ˆ j;|
ƒ d	 |j7|j<�pXd¡}|ˆ j=|ƒ n| -ˆ j=¡ |j>d u�rt|ˆ j?|j>ƒ |j@d u�r�|ˆ jA|j@ƒ |jBd u�rŽ| B|¡ d S d S )NÚExpectÚ ÚPragmac                 S  s   g | ]}d j |Ž ‘qS )z{}: {})Úformat)r   Úhr   r   r#   r$   Î   s    z-CurlClient._setup_request.<locals>.<listcomp>zgzip,deflateÚnonez)Request with proxy_host but no proxy_portz{}:{}r   r   é   FT)r   r   zutf-8ó    r   c                   s   | ˆ j krˆ d¡ d S d S rC   )ÚIOCMD_RESTARTREADrƒ   )Úcmd©r[   Ú	reqbufferr   r#   Úioctl  rK   z(CurlClient._setup_request.<locals>.ioctlr   )ÚbasicÚdigestr“   )Cr+   ÚURLr   Úurlru   Ú
setdefaultÚ
HTTPHEADERrL   ÚHEADERFUNCTIONr   Ú	on_headerÚWRITEFUNCTIONÚ	on_streamÚwriteÚFOLLOWLOCATIONÚfollow_redirectsÚ	USERAGENTÚ
user_agentÚDEFAULT_USER_AGENTÚnetwork_interfaceÚ	INTERFACEÚENCODINGÚuse_gzipÚ
proxy_hostÚ
proxy_portÚ
ValueErrorÚPROXYÚ	PROXYPORTÚproxy_usernameÚPROXYUSERPWDr‰   Úproxy_passwordÚSSL_VERIFYPEERÚvalidate_certÚSSL_VERIFYHOSTÚca_certsÚCAINFOÚ	IPRESOLVEr%   ÚIPRESOLVE_WHATEVERÚMETH_TO_CURLÚvaluesÚmethodÚKeyErrorÚCUSTOMREQUESTÚunsetoptÚbodyÚencoder   ÚREADFUNCTIONÚreadÚIOCTLFUNCTIONÚPOSTFIELDSIZEÚlenÚ
INFILESIZEÚauth_usernameÚHTTPAUTH_BASICÚHTTPAUTH_DIGESTÚ	auth_modeÚHTTPAUTHÚauth_passwordÚUSERPWDÚclient_certÚSSLCERTÚ
client_keyÚSSLKEYÚ
on_prepare)r"   rr   rF   rv   ru   r[   r+   Úmethr¼   r’   rÇ   Úuserpwdr   r�   r#   r{   Ä   s    þþÿÿþÿ
ÿ
ÿ
þ
ýÿÿzCurlClient._setup_request)Nr   )r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r(   rA   rG   rJ   rR   r%   r/   r-   r8   rN   rP   rh   rc   rE   rn   r{   Ú__classcell__r   r   r=   r#   r   $   s$    	r   )"rÕ   Ú
__future__r   Úcollectionsr   Ú	functoolsr   Úior   r   Úkombu.asynchronous.hubr   r   r	   r
   Úkombu.exceptionsr   Úkombu.utils.encodingr   Úbaser   r%   r&   r   r¶   ÚHTTPGETr   ÚUPLOADÚNOBODYÚ__all__r¢   Ú	frozensetÚEXTRA_METHODSr   r   r   r   r#   Ú<module>   s2    ÿü