
    >i&                    H   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 	 ddlZddlmZ ej.                  ej0                  ej2                  ej4                  dZdZdZ eg d      Z  G d de      Z!y# e$ r	 dxZxZZY 'w xY w)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                       e Zd ZdZeZdd fdZd Zd Zd Zd Z	e
fdZd	 Ze
fd
Ze
fdZe
fdZe
fdZd Zd Zdde
fdZe
fdZ xZS )r   zCurl HTTP Client.Nc                H   t         t        d      |xs
 t               }t        |   |       || _        t        j                         | _        | j                  j                  t         j                  | j                         | j                  j                  t         j                  | j                         t        |      D cg c]  }| j                          c}| _        | j                  d d  | _        t#               | _        i | _        | j                  j(                  | _        | j,                  j/                  d| j0                        | _        t        j                         }| j                  j5                  |       | j                  j7                  |       y c c}w )Nz,The curl client requires the pycurl library.g      ?)pycurlImportErrorr   super__init__max_clients	CurlMulti_multisetoptM_TIMERFUNCTION_set_timeoutM_SOCKETFUNCTION_handle_socketranger   _curls
_free_listr   _pending_fdssocket_action_socket_actionhubcall_repeatedly_timeout_check_timeout_check_tref
add_handleremove_handle)selfr.   r   idummy_curl_handle	__class__s        x/var/www/html/wine-match-dev/backend/winematch-backend/venv/lib/python3.12/site-packages/kombu/asynchronous/http/curl.pyr   zCurlClient.__init__)   s0   >LMM%^%&&&(61143D3DE622D4G4GH,1+,>?qtyy{?++a.	"kk77#'88#;#;$$$
 
 #KKM01!!"34 @s   Fc                    | j                   j                          | j                  D ]  }|j                           | j                  j                          y N)r1   cancelr(   closer!   )r4   _curls     r8   r<   zCurlClient.closeB   s@      '')[[ 	EKKM	    c                ~    | j                   j                  |       | j                          | j                  d       |S Nr   )r*   append_process_queuer$   )r4   requests     r8   add_requestzCurlClient.add_requestH   s3    W%!r>   c                \    | j                   D ]  }| j                  j                  |        y r:   )r+   r.   remove)r4   fds     r8   _pop_from_hubzCurlClient._pop_from_hubQ   s%    )) 	 BHHOOB	 r>   c                
   | j                   j                         D ]f  \  }}|t        z  r'| j                  j	                  || j
                  |       |t        z  s@| j                  j                  || j                  |       h y r:   )	r+   itemsr   r.   
add_readeron_readabler	   
add_writeron_writable)r4   rG   eventss      r8   _push_to_hubzCurlClient._push_to_hubU   sf    ))//+ 	>JB}##B(8(8"=~##B(8(8"=		>r>   c                Z   ||j                   k(  r,|| j                  v r| j                  j                  |d        y y ||j                  k(  rt        | j                  |<   y ||j
                  k(  rt        | j                  |<   y ||j                  k(  rt        t        z  | j                  |<   y y r:   )POLL_REMOVEr+   popPOLL_INr   POLL_OUTr	   
POLL_INOUT)r4   eventrG   multidata_pycurls         r8   r&   zCurlClient._handle_socket\   s    G'''TYY		b$'  ' $		"'*** %		"',,, $u		" -r>   c                P    | j                   j                  || j                         y r:   )r.   
call_laterr0   )r4   msecss     r8   r$   zCurlClient._set_timeouth   s    E4#6#67r>   c                P   | j                          	 	 	 | j                  j                         \  }}||j                  k7  rn/	 | j                          | j                          y # t        j                  $ r}|j
                  d   }Y d }~Zd }~ww xY w# | j                          w xY wr@   )	rH   r!   
socket_allr   errorargsE_CALL_MULTI_PERFORMrP   _process_pending_requests)r4   rZ   ret_excs        r8   r0   zCurlClient._timeout_checkk   s    		 &![[335FC '666  &&( || &((1+C&
 s3   B A$ B $B7BB BB B%c                :    | j                  ||j                        S r:   )	_on_event
CSELECT_INr4   rG   rZ   s      r8   rL   zCurlClient.on_readabley   s    ~~b'"4"455r>   c                :    | j                  ||j                        S r:   )rh   CSELECT_OUTrj   s      r8   rN   zCurlClient.on_writable|   s    ~~b'"5"566r>   c                @   | j                          	 	 	 | j                  ||      \  }}||j
                  k7  rn'	 | j                          | j                          y # t        j                  $ r}|j                  d   }Y d }~Zd }~ww xY w# | j                          w xY wr@   )rH   r-   r   r`   ra   rb   rP   rc   )r4   rG   rW   rZ   rd   re   rf   s          r8   rh   zCurlClient._on_event   s    		 &!00U;FC '666  &&( || &((1+C&
 s3   B A B B/B>B BB Bc                    	 | j                   j                         \  }}}|D ]  }| j                  |        |D ]  \  }}}| j                  |||        |dk(  rn[| j                          y r@   )r!   	info_read_processrB   )r4   q	succeededfailedcurlerrnoreasons          r8   rc   z$CurlClient._process_pending_requests   s|    #';;#8#8#: Ay&! $d#$'- 3#eVdE623Av  	r>   c                   	 d}| j                   r| j                  r|dz  }| j                   j                         }| j                  j                         }| j	                         }t               }|||t               d|_        | j                  ||||       | j                  j                  |       | j                   r| j                  r|sy )Nr   r   )headersbufferrC   curl_start_time)r)   r*   rS   popleftHeadersr   r   info_setup_requestr!   r2   )r4   startedrt   rC   rx   bufs         r8   rB   zCurlClient._process_queue   s    G//dmm1**,--//1,,.i&!&'+v		 ##D'3@&&t, //dmm # r>   c           
        |j                   d c}|_         | j                  j                  |       | j                  j	                  |       |d   }|r*d}t        ||      }||_        d }	|j                          d }nId }|j                  |j                        }|j                  |j                        }	|j                  d       |d   }
|
j                  | j                  |
||d   ||	|             y )Nry   iW  r   rC   rx   )rC   coderx   ry   effective_urlr`   )r}   r!   r3   r)   rA   r   ru   r<   getinfo	HTTP_CODEEFFECTIVE_URLseekon_readyResponse)r4   rt   ru   rv   rZ   r}   ry   r   r`   r   rC   s              r8   rp   zCurlClient._process   s    ))Tdi!!$'t$hDdF+EEK MLLNFE<< 1 12D LL)>)>?MKKNy/$Ye ' 
 	r>   c           	        |j                   } |j                  t        |j                               |j                  j                  dd       |j                  j                  dd        |j                  |j                  j                         D cg c]  } dj                  |  c}        |j                  t        |j                  xs | j                  |j                                |j                  |j                  xs |j                          |j                  |j                           |j"                  t        |j$                  xs t&                     |j(                  r |j*                  |j(                          |j,                  |j.                  rdnd       |j0                  r|j2                  st5        d       |j6                  |j0                          |j8                  |j2                         |j:                  r; |j<                  dj                  |j:                  |j>                  xs d              |j@                  |jB                  rd	nd
        |jD                  |jB                  rdnd
       |jF                   |jH                  |jF                          |jJ                  tL        jN                         tP        jS                         D ]  } ||d        	 tP        |jT                     }|jW                  jX                          ||d       |jT                  dv r|j\                  sd}	nAt_        |j\                  t`              r|j\                  n|j\                  jc                  d      }	te        |	       |jf                  jh                         |jT                  dk(  r6fd}
 |jj                  |
        |jl                  to        |	             n: |jp                  to        |	             n|jT                  dk(  r|j\                  rJ |jr                  {jt                  jv                  d|jx                  xs d   } |jz                  |       dj                  |jr                  |j|                  xs d      } |j~                  |       n|jW                  j~                         |j                   |j                  |j                         |j                   |j                  |j                         |j                  |j                  |       y y c c}w # tZ        $ r* |j                  jX                  |jT                         Y Ow xY w)NExpect Pragmaz{}: {}zgzip,deflatenonez)Request with proxy_host but no proxy_portz{}:{}r   r      FT)r   r   r>   zutf-8r   c                H    | j                   k(  rj                  d       y y r@   )IOCMD_RESTARTREADr   )cmdrZ   	reqbuffers    r8   ioctlz(CurlClient._setup_request.<locals>.ioctl  s"    g777!q) 8r>   r   )basicdigestr   )Er"   URLr   urlrx   
setdefault
HTTPHEADERrJ   format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PROXYUSERPWDproxy_passwordSSL_VERIFYPEERvalidate_certSSL_VERIFYHOSTca_certsCAINFO	IPRESOLVEr   IPRESOLVE_WHATEVERMETH_TO_CURLvaluesmethodunsetoptCUSTOMREQUESTKeyErrorbody
isinstancebytes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)r4   rt   rC   ry   rx   rZ   r"   hmethr   r   r   userpwdr   s        `       @r8   r~   zCurlClient._setup_request   s~   w{{L56 	""8R0""8R0*1//*?*?*ABQ_X__a B	

 	""G%%7I	
 	!!7#4#4#D	
 	""G$<$<	
 	++A/AB	
 $$7$$g&?&?@0@0@nf	
 %% !LMM7=='"4"457$$g&8&89%%w++W^^**G,B,B,Hb.J K 	w%%G,A,AqqIw%%G,A,AqqI'7>>7#3#34w  &";";< '') 	 D4	 	/D MM'//04>>_,<<'1',,'Fw||GLLL_L_`gLhI7''8~~'* w,,e4w,,c$i8w))3t95^^u$||##  , //!11 *7,I 7##Y/nn%%w'<'<'BG 7??G,MM'//**7??G$7$78)7>>7#5#56)t$ *m CT  	?KK--w~~>	?s   U
U /VV)N
   )r.   z
Hub | Noner   int)__name__
__module____qualname____doc__r   r   r<   rD   rH   rP   r   r&   r$   r0   rL   rN   rh   rc   rB   rp   r~   __classcell__)r7   s   @r8   r   r   $   s    D52 > >D 
-8 &, ) '- 6 '- 7 ,2 )	( $(f 0 FL a%r>   r   )"r   
__future__r   collectionsr   	functoolsr   ior   r   kombu.asynchronous.hubr   r	   r
   r   kombu.exceptionsr   kombu.utils.encodingr   baser   r   r   HTTPGETr   UPLOADNOBODYr   r   __all__r   	frozensetEXTRA_METHODSr    r>   r8   <module>r      s     "     C C & -   ~~}}	L 7 89A% A%%  (#''F'TL(s    B B! B!