
    	Pj]                        d Z ddlZddlZddlZddlZddlZddlZddlZddlm	Z	 ddl
mZ ddl
mZ ddlmZmZ ddlmZmZmZmZmZ ddlmZ dd	lmZmZmZmZmZ ddlZej<                  rdd
lmZm Z   ejB                  d      Z" ejF                  d      Z$ G d de      Z% G d de      Z&e'dk(  r ejP                  e%        e        yy)z5Non-blocking HTTP client implementation using pycurl.    N)BytesIO)httputil)ioloop)utf8
native_str)HTTPRequestHTTPResponse	HTTPErrorAsyncHTTPClientmain)app_log)DictAnyCallableUnionOptional)DequeTupleztornado.curl_httpclients   |
c            
           e Zd Z	 d%dedeeeef      ddf fdZd& fdZ	de
deegdf   ddfd	Zd
ededededdf
dZdeddfdZdededdfdZd&dZd&dZd&dZ	 	 d'dej,                  dee   dee   ddfdZdeddfdZdej,                  fdZdej,                  de
dedej8                  ddf
dZdej8                  deegdf   d eddfd!Zd"ed#eddfd$Z xZ S )(CurlAsyncHTTPClientNmax_clientsdefaultsreturnc                    t         |   |       t        j                         | _        | j                  j                  t        j                  | j                         | j                  j                  t        j                  | j                         t        |      D cg c]  }| j                          c}| _        | j                  d d  | _        t        j                         | _        i | _        d | _        t        j&                         }| j                  j)                  |       | j                  j+                  |       y c c}w )N)r   )super
initializepycurl	CurlMulti_multisetoptM_TIMERFUNCTION_set_timeoutM_SOCKETFUNCTION_handle_socketrange_curl_create_curls
_free_listcollectionsdeque	_requests_fds_timeoutCurl
add_handleremove_handle)selfr   r   idummy_curl_handle	__class__s        J/root/.hermes/venv/lib/python3.12/site-packages/tornado/curl_httpclient.pyr   zCurlAsyncHTTPClient.initialize4   s     	H-&&(61143D3DE622D4G4GH49+4FGqt((*G++a. 	 	 #KKM01!!"34 Hs    Ec                    | j                   %| j                  j                  | j                          | j                  D ]  }|j	                           | j
                  j	                          t        |           d | _        y N)r-   io_loopremove_timeoutr'   closer   r   )r1   curlr4   s     r5   r:   zCurlAsyncHTTPClient.closeM   sa    ==$LL''6KK 	DJJL	
     requestcallbackc                     | j                   j                  ||| j                  j                         f       | j	                          | j                  d       y )Nr   )r+   appendr8   time_process_queuer"   )r1   r=   r>   s      r5   
fetch_implzCurlAsyncHTTPClient.fetch_implZ   sD     	w$,,2C2C2EFG!r<   eventfdmultidatac           	         t         j                  t        j                  j                  t         j
                  t        j                  j                  t         j                  t        j                  j                  t         j                  t        j                  j                  t        j                  j                  z  i}|t         j                  k(  r8|| j                  v r)| j                  j                  |       | j                  |= yy||   }|| j                  v r| j                  j                  |       | j                  j                  || j                  |       || j                  |<   y)z_Called by libcurl when it wants to change the file descriptors
        it cares about.
        N)r   	POLL_NONEr   IOLoopNONEPOLL_INREADPOLL_OUTWRITE
POLL_INOUTPOLL_REMOVEr,   r8   remove_handleradd_handler_handle_events)r1   rD   rE   rF   rG   	event_mapioloop_events          r5   r$   z"CurlAsyncHTTPClient._handle_socketa   s    
 fmm00NNFMM..OOV]]00v}}11FMM4G4GG	
	 F&&&TYY++B/IIbM  %U+L TYY++B/LL$$R)<)<lK(DIIbMr<   msecsc                     | j                   %| j                  j                  | j                          | j                  j                  | j                  j	                         |dz  z   | j
                        | _         y)z(Called by libcurl to schedule a timeout.Ng     @@)r-   r8   r9   add_timeoutrA   _handle_timeout)r1   rW   s     r5   r"   z CurlAsyncHTTPClient._set_timeout~   sY    ==$LL''600LL%&.0$2F2F
r<   eventsc                    d}|t         j                  j                  z  r|t        j                  z  }|t         j                  j
                  z  r|t        j                  z  }	 	 | j                  j                  ||      \  }}|t        j                  k7  rn5| j                          y# t        j                  $ r}|j                  d   }Y d}~Md}~ww xY w)zXCalled by IOLoop when there is activity on one of our
        file descriptors.
        r   N)r   rJ   rM   r   
CSELECT_INrO   CSELECT_OUTr   socket_actionerrorargsE_CALL_MULTI_PERFORM_finish_pending_requests)r1   rE   r[   actionretnum_handleses          r5   rT   z"CurlAsyncHTTPClient._handle_events   s     FMM&&&f'''FFMM'''f(((F #';;#<#<R#H [ f111  	%%'	 <<  ffQi s   %B* *C=CCc                 z   d| _         	 	 | j                  j                  t        j                  d      \  }}|t        j                  k7  rnC| j                          | j                  j                         }|dk\  r| j                  |       yy# t        j
                  $ r}|j                  d   }Y d}~~d}~ww xY w)z7Called by IOLoop when the requested timeout has passed.Nr   )r-   r   r_   r   SOCKET_TIMEOUTr`   ra   rb   rc   timeoutr"   )r1   re   rf   rg   new_timeouts        r5   rZ   z#CurlAsyncHTTPClient._handle_timeout   s     #';;#<#<V=R=RTU#V [ f111  	%%' kk))+!k* ) <<  ffQi s   -B B:!B55B:c                     	 | j                   j                         \  }}}|D ]  }| j                  |        |D ]  \  }}}| j                  |||        |dk(  rn[| j                          y)zbProcess any requests that were completed by the last
        call to multi.socket_action.
        r   N)r   	info_read_finishrB   )r1   num_qok_listerr_listr;   errnumerrmsgs          r5   rc   z,CurlAsyncHTTPClient._finish_pending_requests   s~     '+{{'<'<'>$E7H #T"#(0 3$ffT6623z  	r<   c                    	 d}| j                   r| j                  r|dz  }| j                   j                         }| j                  j                         \  }}}t	        j
                         t               |||t        j                         | j                  j                         j                         d|_
        	 | j                  |||j                  d   |j                  d          | j                  j                  |       | j                   r| j                  r|sy ## t        $ rI}|j                          | j                   j!                  |        |t#        |d|             Y d }~ld }~ww xY w)Nr      )headersbufferr=   r>   queue_start_timecurl_start_timecurl_start_ioloop_timerw   rv   W  )r=   coder`   )r(   r+   poppopleftr   HTTPHeadersr   rA   r8   currentinfo_curl_setup_requestr   r/   	Exceptionresetr@   r	   )r1   startedr;   r=   r>   rx   rg   s          r5   rB   z"CurlAsyncHTTPClient._process_queue   s<   G//dnn1**,8<8N8N8P5($4  (335%i& ((8'+yy{.2ll.B.B.D.I.I.K	1,,		(+		),	& KK**40E //dnnH O . ! O JJLOO**40\'1MNNOs   =.D% %	E7.?E22E7r;   
curl_errorcurl_messagec                    |j                   }d |_         | j                  j                  |       |d   }|r5|J t        ||      }|J |j                  }d }|j                          d }nQd }|j                  t        j                        }|j                  t        j                        }|j                  d       t        |d   |d   z
  |j                  t        j                        |j                  t        j                        |j                  t        j                        |j                  t        j                        |j                  t        j                         |j                  t        j"                        |j                  t        j$                              }		  |d   t'        |d   ||d   ||||d   j)                  d	d       | j*                  j-                         |d   z
  |d
   |	
             |j3                          | j4                  j7                  |       y # t.        $ r | j1                  |d          Y Kw xY w)Nrw   r   rz   rx   )queue
namelookupconnect
appconnectpretransferstarttransfertotalredirectr>   r=   rv   zX-Http-Reasonry   )
r=   r|   rv   rw   effective_urlr`   reasonrequest_time
start_time	time_info)r   r   r0   	CurlErrorr|   r:   getinfor   	HTTP_CODEEFFECTIVE_URLseekdictNAMELOOKUP_TIMECONNECT_TIMEAPPCONNECT_TIMEPRETRANSFER_TIMESTARTTRANSFER_TIME
TOTAL_TIMEREDIRECT_TIMEr	   getr8   rA   r   handle_callback_exceptionr   r(   r@   )
r1   r;   r   r   r   rw   r`   r|   r   r   s
             r5   rn   zCurlAsyncHTTPClient._finish   s    yy	!!$'h+++j,7E$$$::D MLLNFE<< 0 01D LL)=)=>MKKN /048J3KK||F$:$:;LL!4!45||F$:$:;V%<%<=,,v'@'@A,,v001\\&"6"67	
		=D O O!"/	?..E!%!2!2!4t<T7U!U#$56'  	

t$  	=**4
+;<	=s   $AH( (IIc                 4    t        j                  d|d       y )NzException in callback %rT)exc_info)r   r`   )r1   r>   s     r5   r   z-CurlAsyncHTTPClient.handle_callback_exception$  s    0(TJr<   c                 *    t        j                         S r7   )r   r.   )r1   s    r5   r&   z CurlAsyncHTTPClient._curl_create'  s    {{}r<   rw   rv   c           	      &    t         j                  t        j                        rJ|j	                  t
        j                  d       |j	                  t
        j                   j                         t        t
        d      r~|j	                  t
        j                  t
        j                  t
        j                  z         |j	                  t
        j                  t
        j                  t
        j                  z         |j	                  t
        j                  t        j                                dj"                  vrdj"                  d<   dj"                  vrdj"                  d<   j"                  j%                         D cg c]<  \  }}dt        |      j'                  d      t        |      j'                  d      fz  > }}}|D ]%  }t(        j+                  |      st-        d	|z         |j	                  t
        j.                  |       |j	                  t
        j0                  t3        j4                   j6                  |j8                               j:                  r!d
t<        t>        t@        f   dtB        f fd}	n|jD                  }	|j	                  t
        jF                  |	       |j	                  t
        jH                  jJ                         |j	                  t
        jL                  jN                         jP                  J |j	                  t
        jR                  tC        djP                  z               jT                  J |j	                  t
        jV                  tC        djT                  z               jX                  r4|j	                  t
        jZ                  t        jX                               n |j	                  t
        jZ                  d       j\                  r*|j	                  t
        j^                  j\                         j`                  r!|j	                  t
        jb                  d       n |j	                  t
        jb                  d        jd                  rejf                  rX|j	                  t
        jh                  jd                         |j	                  t
        jj                  jf                         jl                  rXjn                  J tq        jr                  jl                  jn                        }
|j	                  t
        jt                  |
       jv                  jv                  dk(  r/|j	                  t
        jx                  t
        jz                         njv                  dk(  r/|j	                  t
        jx                  t
        j|                         nWt-        djv                  z        	 |j                  t
        jh                         |j                  t
        jt                         j                  rA|j	                  t
        j                  d       |j	                  t
        j                  d       n@|j	                  t
        j                  d       |j	                  t
        j                  d       j                  +|j	                  t
        j                  j                         n	 j                  du r/|j	                  t
        j                  t
        j                         n.|j	                  t
        j                  t
        j                         t
        j                  t
        j                  t
        j                  t
        j                  d}h d}|j                         D ]  }|j	                  |d        j                  |v r?|j                  t
        j                         |j	                  |j                     d       n]j                  sj                  |v r+|j	                  t
        j                  j                         nt        dj                  z         j                  dv }j                  d u}j                  s(|r|r|r"|s t-        d|rdnddj                  d      |s|r<j                  dk(  rt-        d       t        t        j                  xs d            d!tB        d"tB        dtB        ffd#}|j	                  t
        j                  j                         |j	                  t
        j                  |       j                  d$k(  r8|j	                  t
        j                  t        j                  xs d             nW|j	                  t
        j                  d       |j	                  t
        j                  t        j                  xs d             j                  /j                  J j                  j                  dk(  r/|j	                  t
        j                  t
        jz                         nVj                  dk(  r/|j	                  t
        j                  t
        j|                         nt-        d%j                  z        tq        jr                  j                  j                        }|j	                  t
        j                  |       t         j                  d&j                  j                   j                         nJ|j                  t
        j                         t         j                  d'j                  j                          j                  *|j	                  t
        j                  j                         j                  *|j	                  t
        j                  j                         j                  t-        d(      t        j                         dkD  r |j	                  t
        j                  d       j                  j                  |       y y c c}}w # t        $ r$ |j	                  t
        jh                  d       Y w xY w))Nru   	PROTOCOLSExpect Pragmas   %s: %sASCIIz	ISO8859-1z+Illegal characters in header (CR or LF): %rbr   c                     j                   J j                  j                  j                   |        t        |       S r7   )streaming_callbackr8   add_callbacklen)r   r=   r1   s    r5   write_functionz?CurlAsyncHTTPClient._curl_setup_request.<locals>.write_function]  s8    11===))'*D*DaH1vr<   i  z Mozilla/5.0 (compatible; pycurl)zgzip,deflatebasicdigestzUnsupported proxy_auth_mode %s   r   F)GETPOSTPUTHEAD>   PATCHDELETEOPTIONSTzunknown method )r   r   r   z
Body must znot zbe None for method z+ (unless allow_nonstandard_methods is true)r   z!Body must be None for GET requestoffsetoriginc                 H    j                  | |       t        j                  S r7   )r   r   SEEKFUNC_OK)r   r   request_buffers     r5   r   z5CurlAsyncHTTPClient._curl_setup_request.<locals>.seek  s    ##FF3)))r<   r   zUnsupported auth_mode %sz%s %s (username: %r)%s %sz,ssl_options not supported in curl_httpclient)kcurl_logisEnabledForloggingDEBUGr    r   VERBOSEDEBUGFUNCTION_curl_debughasattrr   
PROTO_HTTPPROTO_HTTPSREDIR_PROTOCOLSURLr   urlrv   get_allencodeCR_OR_LF_REsearch
ValueError
HTTPHEADERHEADERFUNCTION	functoolspartial_curl_header_callbackheader_callbackr   r   bytes	bytearrayintwriteWRITEFUNCTIONFOLLOWLOCATIONfollow_redirects	MAXREDIRSmax_redirectsconnect_timeoutCONNECTTIMEOUT_MSrequest_timeout
TIMEOUT_MS
user_agent	USERAGENTnetwork_interface	INTERFACEdecompress_responseENCODING
proxy_host
proxy_portPROXY	PROXYPORTproxy_usernameproxy_passwordr   encode_username_passwordPROXYUSERPWDproxy_auth_mode	PROXYAUTHHTTPAUTH_BASICHTTPAUTH_DIGESTunsetopt	TypeErrorvalidate_certSSL_VERIFYPEERSSL_VERIFYHOSTca_certsCAINFO
allow_ipv6	IPRESOLVEIPRESOLVE_V4IPRESOLVE_WHATEVERHTTPGETr   UPLOADNOBODYvaluesmethodCUSTOMREQUESTallow_nonstandard_methodsKeyErrorbodyr   r   READFUNCTIONreadSEEKFUNCTIONPOSTFIELDSIZEr   
INFILESIZEauth_usernameauth_password	auth_modeHTTPAUTHUSERPWDdebugclient_certSSLCERT
client_keySSLKEYssl_options	threadingactive_countNOSIGNALprepare_curl_callback)r1   r;   r=   rw   rv   kvencoded_headersliner   credentialscurl_optionscustom_methodsobody_expectedbody_presentr   userpwdr   s   ` `               @r5   r   z'CurlAsyncHTTPClient._curl_setup_request*  s	      /KK*KK,,d.>.>?K
 KK((&*;*;f>P>P*PQKK..0A0AFDVDV0VWFJJ
7;; 78 7??*(*GOOH% 7??*(*GOOH%
  //1
 1 !}##G,jm.B.B;.OPQ
 

 $ 	WD!!$' !NQU!UVV	W 	F%%7!!**GW5L5L	
 %%%y(8"9 c  $\\NF((.9F))7+C+CDF$$g&;&;<&&222F,,c$9P9P2P.QR&&222F%%s4'2I2I+I'JKKK((*W5G5G*HIKK((*LM$$KK(('*C*CD&&KK8KK.'"4"4KKg&8&89KK(('*<*<=%%--999&??**G,B,B F//=&&.'2I2IW2TF,,f.C.CD((H4F,,f.D.DE 4w7N7NN .fll+ MM&--.  KK--q1KK--q1KK--q1KK--q1'KKw'7'78 & KK((&*=*=>KK((&*C*CD
 >>KK==MM	
 8$$& 	"AKK5!	">>\)MM&../KKW^^4d;..'..N2RKK,,gnn=,w~~=>>*BB||4/00 l]  "/vB6H  L~~& !!DEE$T',,*<"%=>N*S *# *# * KK++^-@-@AKK++T2~~'F00#gll6Hb2IJFMM40F--s7<<3E2/FG  ,((444  (G,=,=,HFOOV-B-BC""h.FOOV-C-CD !;g>O>O!OPP77%%w'<'<G KK0NN&%%	 MM&..)NN7GNNGKK@*KK(;(;<)KKw'9'9:*KLL!!#a' KK+((4))$/ 5y
~  .FLL"-.s   	Aq+q# #)rrr   header_line_bytesc                 n   t        |j                  d            }|| j                  j                  ||       |j	                         }|j                  d      r/|j                          	 t        j                  |      \  }}}d|z  }|sy |j                  |       y # t        j                  $ r Y y w xY w)Nlatin1zHTTP/zX-Http-Reason: %s)r   decoder8   r   rstrip
startswithclearr   parse_response_start_lineHTTPInputError
parse_line)r1   rv   r   r.  header_line_version_coder   s           r5   r   z)CurlAsyncHTTPClient._curl_header_callback
  s     !!2!9!9(!CD&LL%%o{C "((*!!'*MMO,4,N,N-)5& 2F: ;'	 ** s   +B B43B4
debug_type	debug_msgc                 0   d}|dk(  r0t        |      }t        j                  d|j                                y |dv r;t        |      }|j	                         D ]  }t        j                  d||   |        y |dk(  rt        j                  d||   |       y y )N)I<>r?  r@  r   z%s)ru   r   r      z%s %r)r   r   r  strip
splitlines)r1   r;  r<  debug_typesr&  s        r5   r   zCurlAsyncHTTPClient._curl_debug#  s    /?"9-INN4!236!"9-I!,,. GwJ(?FG1_NN7K
$;YG r<   )
   N)r   N)NN)!__name__
__module____qualname__r   r   r   strr   r   r:   r   r   r	   rC   r   r$   r"   rT   rZ   rc   rB   r   r.   rn   r   r&   r   r   r   r   r   r   __classcell__)r4   s   @r5   r   r   3   s   JN55/7S#X/G5	52".6~t7K.L	)C )S ) )E )d ):
# 
$ 
( (c (d ($+:(Z %)&*	5%kk5% SM5% sm	5%
 
5%nK# K$ Kfkk ^0kk^0 ^0 	^0
 %%^0 
^0@(%%( "3%+.( !	(
 
(2
Hc 
Hc 
Hd 
Hr<   r   c                        e Zd ZdededdfdZy)r   errnomessager   Nc                 @    t        j                  | d|       || _        y )Nr{   )r
   __init__rL  )r1   rL  rM  s      r5   rO  zCurlError.__init__1  s    4g.
r<   )rF  rG  rH  r   rI  rO   r<   r5   r   r   0  s    c C D r<   r   __main__))__doc__r)   r   r   r   rer  rA   ior   tornador   r   tornado.escaper   r   tornado.httpclientr   r	   r
   r   r   tornado.logr   typingr   r   r   r   r   TYPE_CHECKINGr   r   	getLoggerr   compiler   r   r   rF  	configurerP  r<   r5   <module>r^     s     <     	      +    7 7 	#767bjj"zH/ zHz	  zO12F r<   