o
    wvXjÆ&  ã                   @   s  d Z ddlmZ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 ddlmZ dd	lmZmZ dd
lmZ ddlmZ zddlZW n ey[   d Z ZZY nw ddlmZ ejejejejdœZdZ edƒZ!e"g d¢ƒZ#G dd„ deƒZ$dS )zHTTP Client using pyCurl.é    )Úabsolute_importÚunicode_literals)Údeque)Úpartial)ÚBytesIO)Útime)ÚREADÚWRITEÚget_event_loop)Ú	HttpError)Úbytes_if_py2Úitems)Ú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"‡ 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é
   c                    sÔ   t d u rtdƒ‚|ptƒ }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   úY/var/www/html/myproject/venv/lib/python3.10/site-packages/kombu/asynchronous/http/curl.pyÚ
<listcomp>3   s    z'CurlClient.__init__.<locals>.<listcomp>g      ð?)ÚpycurlÚImportErrorr
   Úsuperr   Ú__init__Úmax_clientsÚ	CurlMultiÚ_multiÚsetoptÚM_TIMERFUNCTIONÚ_set_timeoutÚM_SOCKETFUNCTIONÚ_handle_socketÚrangeÚ_curlsÚ
_free_listr   Ú_pendingÚ_fdsÚsocket_actionÚ_socket_actionÚhubÚcall_repeatedlyÚ_timeout_checkÚ_timeout_check_trefr   Ú
add_handleÚremove_handle)r    r6   r'   Údummy_curl_handle©Ú	__class__r   r!   r&   )   s&   


ÿzCurlClient.__init__c                 C   s,   | j  ¡  | jD ]}| ¡  q| j ¡  d S ©N)r9   Úcancelr0   Úcloser)   )r    Ú_curlr   r   r!   rA   B   s   


zCurlClient.closec                 C   s"   | j  |¡ |  ¡  |  d¡ |S ©Nr   )r2   ÚappendÚ_process_queuer,   )r    Úrequestr   r   r!   Úadd_requestH   s   
zCurlClient.add_requestc                 C   s   | j D ]}| j |¡ qd S r?   )r3   r6   Ú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?   )	r3   r   r   r6   Ú
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_REMOVEr3   ÚpopÚPOLL_INr   ÚPOLL_OUTr	   Ú
POLL_INOUT)r    ÚeventrI   ÚmultiÚdataÚ_pycurlr   r   r!   r.   \   s   

ÿ


ÿzCurlClient._handle_socketc                 C   s   d S r?   r   )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_PERFORMrQ   Ú_process_pending_requests)r    rZ   ÚretÚ_Úexcr   r   r!   r8   k   s   €ÿ
úzCurlClient._timeout_checkc                 C   ó   |   ||j¡S r?   )Ú	_on_eventÚ
CSELECT_IN©r    rI   rZ   r   r   r!   rM   y   ó   zCurlClient.on_readablec                 C   re   r?   )rf   ÚCSELECT_OUTrh   r   r   r!   rO   |   ri   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   r5   r#   r^   r_   r`   rQ   ra   )r    rI   rW   rZ   rb   rc   rd   r   r   r!   rf      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!   ra   �   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)r1   r2   rS   ÚpopleftÚHeadersr   r   ÚinfoÚ_setup_requestr)   r:   )r    Ústartedrp   rF   rs   Ú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 )Nrt   iW  r   rF   rs   )rF   Úcoders   rt   Úeffective_urlr^   )rx   r)   r;   r1   rD   r   rq   rA   ÚgetinfoÚ	HTTP_CODEÚEFFECTIVE_URLÚseekÚon_readyÚResponse)r    rp   rq   rr   rZ   rx   rt   r|   r^   r}   rF   r   r   r!   rl   ¬   s(   


þzCurlClient._processc                    s>  |j }|ˆ jt|jƒƒ |j dd¡ |j dd¡ |ˆ jdd„ t|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¡ƒ n|ˆ jdƒ |  ˆ j¡ |ˆ 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 �r9|j.�r|j. /d¡nt0ƒ }t1|ƒ‰|ˆ j2ˆj3ƒ |j+dk�r0‡ ‡fdd„}	|ˆ j4|	ƒ |ˆ j5t6|ƒƒ n|ˆ j7t6|ƒƒ n|j+dk�rE|j.�rEJ ‚|j8d u�rpˆ j9ˆ j:dœ|j;�pVd }
|ˆ j<|
ƒ d	 |j8|j=�pgd¡}|ˆ j>|ƒ n|  ˆ j>¡ |j?d u�rƒ|ˆ j@|j?ƒ |jAd u�r�|ˆ jB|jAƒ |jCd u�r�| C|¡ d S d S )NÚExpectÚ ÚPragmac                 S   s   g | ]}d j |Ž ‘qS )z{0}: {1})Ú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{0}:{1}r   r   é   FT)r   r   zutf-8r   c                    s   | ˆ j krˆ d¡ d S d S rC   )ÚIOCMD_RESTARTREADr�   )Úcmd©rZ   Ú	reqbufferr   r!   Úioctl  rK   z(CurlClient._setup_request.<locals>.ioctlr   )ÚbasicÚdigestr�   )Dr*   ÚURLr   Úurlrs   Ú
setdefaultÚ
HTTPHEADERr   Ú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ÚunsetoptÚSSL_VERIFYPEERÚvalidate_certÚSSL_VERIFYHOSTÚca_certsÚCAINFOÚ	IPRESOLVEr#   ÚIPRESOLVE_WHATEVERÚMETH_TO_CURLÚvaluesÚmethodÚKeyErrorÚCUSTOMREQUESTÚbodyÚencodeÚbytesr   Ú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    rp   rF   rt   rs   rZ   r*   Úmethr¹   r�   rÅ   Úuserpwdr   r�   r!   ry   Ä   s¦   þþÿÿþÿ
ÿ€
ÿ
þ
ýÿÿzCurlClient._setup_request)Nr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r&   rA   rG   rJ   rQ   r#   r.   r,   r8   rM   rO   rf   ra   rE   rl   ry   Ú__classcell__r   r   r=   r!   r   $   s$    	r   )%rÓ   Ú
__future__r   r   Úcollectionsr   Ú	functoolsr   Úior   r   Úkombu.asynchronous.hubr   r	   r
   Úkombu.exceptionsr   Ú
kombu.fiver   r   Úkombu.utils.encodingr   Úbaser   r#   r$   r   r´   ÚHTTPGETr   ÚUPLOADÚNOBODYÚ__all__rŸ   Ú	frozensetÚEXTRA_METHODSr   r   r   r   r!   Ú<module>   s4    ÿü