o
    ?Zc%                     @   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	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yK   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.    )deque)partial)BytesIO)time)READWRITE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" 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   _ 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   R/var/www/chikooza/env/lib/python3.10/site-packages/kombu/asynchronous/http/curl.py
<listcomp>1   s    z'CurlClient.__init__.<locals>.<listcomp>g      ?)pycurlImportErrorr   super__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   r2   r#   dummy_curl_handle	__class__r   r   r"   '   s&   


zCurlClient.__init__c                 C   s,   | j   | jD ]}|  q| j  d S N)r5   cancelr,   closer%   )r   _curlr   r   r   r=   @   s   


zCurlClient.closec                 C   s"   | j | |   | d |S Nr   )r.   append_process_queuer(   )r   requestr   r   r   add_requestF   s   
zCurlClient.add_requestc                 C   s   | j D ]}| j| qd S r;   )r/   r2   remove)r   fdr   r   r   _pop_from_hubO      
zCurlClient._pop_from_hubc                 C   sL   | j  D ]\}}|t@ r| j|| j| |t@ r#| j|| j| qd S r;   )	r/   itemsr   r2   
add_readeron_readabler   
add_writeron_writable)r   rE   eventsr   r   r   _push_to_hubS   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_REMOVEr/   popPOLL_INr   POLL_OUTr   
POLL_INOUT)r   eventrE   multidata_pycurlr   r   r   r*   Z   s   




zCurlClient._handle_socketc                 C   s   | j || j d S r;   )r2   
call_laterr4   )r   msecsr   r   r   r(   f   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   )	rF   r%   
socket_allr   errorargsE_CALL_MULTI_PERFORMrN   _process_pending_requests)r   rW   ret_excr   r   r   r4   i   s   
zCurlClient._timeout_checkc                 C      |  ||jS r;   )	_on_event
CSELECT_INr   rE   rW   r   r   r   rJ   w      zCurlClient.on_readablec                 C   rc   r;   )rd   CSELECT_OUTrf   r   r   r   rL   z   rg   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 rZ   )rF   r1   r   r\   r]   r^   rN   r_   )r   rE   rT   rW   r`   ra   rb   r   r   r   rd   }   s   
zCurlClient._on_eventc                 C   s\   	 | j  \}}}|D ]}| | q|D ]\}}}| ||| q|dkr'nq|   d S rZ   )r%   	info_read_processrA   )r   q	succeededfailedcurlerrnoreasonr   r   r   r_      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bufferrB   curl_start_time)r-   r.   rP   popleftHeadersr   r   info_setup_requestr%   r6   )r   startedrn   rB   rq   bufr   r   r   rA      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 )Nrr   iW  r   rB   rq   )rB   coderq   rr   effective_urlr\   )rv   r%   r7   r-   r@   r	   ro   r=   getinfo	HTTP_CODEEFFECTIVE_URLseekon_readyResponse)r   rn   ro   rp   rW   rv   rr   rz   r\   r{   rB   r   r   r   rj      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t0 }t1|| j2j3 |j*dkr" fdd}	| j4|	 | j5t6| n| j7t6| n|j*dkr7|j.r7J |j8d urb j9 j:d|j;pHd }
| j<|
 d	|j8|j=pYd}| j>| n|- j> |j?d uru| 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{}: {})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-8r   c                    s   |  j krd d S d S r?   )IOCMD_RESTARTREADr   )cmdrW   	reqbufferr   r   ioctl  rG   z(CurlClient._setup_request.<locals>.ioctlr   )basicdigestr   )Dr&   URLr
   urlrq   
setdefault
HTTPHEADERrH   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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   rn   rB   rr   rq   rW   r&   methr   r   r   userpwdr   r   r   rw      s   



zCurlClient._setup_request)Nr   )__name__
__module____qualname____doc__r   r"   r=   rC   rF   rN   r   r*   r(   r4   rJ   rL   rd   r_   rA   rj   rw   __classcell__r   r   r9   r   r   "   s$    	r   )r   collectionsr   	functoolsr   ior   r   kombu.asynchronous.hubr   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>   s0    