o
    Df&                     @  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   U/home/ubuntu/webapp/venv/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pd | j |j!rd
nd | j"|j!rdnd |j#d ur| j$|j# | j%t&j' t() D ]}||d qz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    