
    MhHa                        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j!        d          Z" ej#        d          Z$ G d de          Z% G d de          Z&e'dk    r ej(        e%            e             dS dS )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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j        ddf
d Zdej        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 )*CurlAsyncHTTPClient
   Nmax_clientsdefaultsreturnc                     t                                          |           t          j                     _         j                            t          j         j                    j                            t          j         j	                    fdt          |          D              _         j        d d           _        t          j                     _        i  _        d  _        t%          j         j        d           _         j                                         t          j                    } j                            |            j                            |           d S )N)r   c                 8    g | ]}                                 S  )_curl_create).0iselfs     W/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/tornado/curl_httpclient.py
<listcomp>z2CurlAsyncHTTPClient.initialize.<locals>.<listcomp><   s%    GGGqt((**GGG      )super
initializepycurl	CurlMulti_multisetoptM_TIMERFUNCTION_set_timeoutM_SOCKETFUNCTION_handle_socketrange_curls
_free_listcollectionsdeque	_requests_fds_timeoutr   PeriodicCallback_handle_force_timeout_force_timeout_callbackstartCurl
add_handleremove_handle)r!   r   r   dummy_curl_handle	__class__s   `   r"   r'   zCurlAsyncHTTPClient.initialize4   s<    	H---&((6143DEEE62D4GHHHGGGGE+4F4FGGG+aaa. 	 	 (.'>&(
 (
$ 	$**,,, #KMM0111!!"344444r$   c                 P   | j                                          | j        | j                            | j                   | j        D ]}|                                 | j                                         t                                                       d | _         d | _        d S N)	r:   stopr7   io_loopremove_timeoutr1   closer*   r&   )r!   curlr@   s     r"   rF   zCurlAsyncHTTPClient.closeV   s    $))+++=$L''666K 	 	DJJLLLL
 (,$r$   requestcallbackc                     | j                             ||| j                                        f           |                                  |                     d           d S Nr   )r5   appendrD   time_process_queuer-   )r!   rH   rI   s      r"   
fetch_implzCurlAsyncHTTPClient.fetch_imple   s[     	w$,2C2C2E2EFGGG!r$   eventfdmultidatac           	      0   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    r/|| j        v r$| j                            |           | j        |= dS dS ||         }|| j        v r| j                            |           | j                            || j        |           || j        |<   dS )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_REMOVEr6   rD   remove_handleradd_handler_handle_events)r!   rP   rQ   rR   rS   	event_mapioloop_events          r"   r/   z"CurlAsyncHTTPClient._handle_socketl   s    
 fm0NFM.OV]0v}1FM4GG	
	 F&&&TY++B///IbMMM  %U+L TY++B///L$$R)<lKKK(DIbMMMr$   msecsc                     | j         | j                            | j                    | j                            | j                                        |dz  z   | j                  | _         dS )z(Called by libcurl to schedule a timeout.Ng     @@)r7   rD   rE   add_timeoutrM   _handle_timeout)r!   rc   s     r"   r-   z CurlAsyncHTTPClient._set_timeout   s^    =$L''66600L%&.0$2F
 
r$   eventsc                 v   d}|t           j        j        z  r|t          j        z  }|t           j        j        z  r|t          j        z  }	 	 | j                            ||          \  }}n)# t          j	        $ r}|j
        d         }Y d}~nd}~ww xY w|t          j        k    rn[|                                  dS )zXCalled by IOLoop when there is activity on one of our
        file descriptors.
        r   TN)r   rV   rY   r(   
CSELECT_INr[   CSELECT_OUTr*   socket_actionerrorargsE_CALL_MULTI_PERFORM_finish_pending_requests)r!   rQ   rg   actionretnum_handleses          r"   r`   z"CurlAsyncHTTPClient._handle_events   s     FM&& 	(f''FFM'' 	)f((F	 #';#<#<R#H#H [[<      fQi f111	 	%%'''''s   A* *B9BBc                 t   d| _         	 	 | j                            t          j        d          \  }}n)# t          j        $ r}|j        d         }Y d}~nd}~ww xY w|t          j        k    rne|                                  | j        	                                }|dk    r| 
                    |           dS dS )z7Called by IOLoop when the requested timeout has passed.NTr   )r7   r*   rk   r(   SOCKET_TIMEOUTrl   rm   rn   ro   timeoutr-   )r!   rq   rr   rs   new_timeouts        r"   rf   z#CurlAsyncHTTPClient._handle_timeout   s    	 #';#<#<V=RTU#V#V [[<      fQi f111	 	%%''' k))++!k***** s   (3 AAAc                     	 	 | j                                         \  }}n)# t          j        $ r}|j        d         }Y d}~nd}~ww xY w|t          j        k    rnY|                                  dS )zpCalled by IOLoop periodically to ask libcurl to process any
        events it may have forgotten about.
        Tr   N)r*   
socket_allr(   rl   rm   rn   ro   )r!   rq   rr   rs   s       r"   r9   z)CurlAsyncHTTPClient._handle_force_timeout   s    	 #';#9#9#;#; [[<      fQi f111	 	%%'''''s     AAAc                     	 | j                                         \  }}}|D ]}|                     |           |D ]\  }}}|                     |||           |dk    rn_|                                  dS )zbProcess any requests that were completed by the last
        call to multi.socket_action.
        Tr   N)r*   	info_read_finishrN   )r!   num_qok_listerr_listrG   errnumerrmsgs          r"   ro   z,CurlAsyncHTTPClient._finish_pending_requests   s    	'+{'<'<'>'>$E7H # #T""""(0 3 3$ffT662222zz	 	r$   c                    	 d}| j         rN| j        rF|dz  }| j                                         }| j                                        \  }}}t	          j                    t                      |||t          j                    | j        	                                                                d|_
        	 |                     |||j
        d         |j
        d                    | j                            |           nL# t          $ r?}| j                             |            |t!          |d|                     Y d }~nd }~ww xY w| j         r| j        F|sd S ^)	NTr      )headersbufferrH   rI   queue_start_timecurl_start_timecurl_start_ioloop_timer   r   W  )rH   coderl   )r2   r5   poppopleftr   HTTPHeadersr   rM   rD   currentinfo_curl_setup_requestr*   r=   	ExceptionrL   r	   )r!   startedrG   rH   rI   r   rs   s          r"   rN   z"CurlAsyncHTTPClient._process_queue   s   &	G/ !1dn !11**,,8<8N8N8P8P5($4  (355%ii& ((8'+y{{.2l.B.B.D.D.I.I.K.K 	1,,	(+	),	  $ K**40000 ! 
O 
O 
O O**4000H\'1MMMNNNNNNNN
O+ / !1dn !1F  M&	s   6.C? ?
E	5EErG   
curl_errorcurl_messagec                    |j         }d |_         | j                            |           | j                            |           |d         }|r8|J t          ||          }|J |j        }d }|                                 d }nUd }|                    t          j
                  }|                    t          j                  }|                    d           t          |d         |d         z
  |                    t          j                  |                    t          j                  |                    t          j                  |                    t          j                  |                    t          j                  |                    t          j                  |                    t          j                            }		  |d         t+          |d         ||d         ||||d                             d	d           | j                                        |d         z
  |d
         |	
  
                   d S # t2          $ r |                     |d                    Y d S w xY w)Nr   r   r   r   )queue
namelookupconnect
appconnectpretransferstarttransfertotalredirectrI   rH   r   zX-Http-Reasonr   )
rH   r   r   r   effective_urlrl   reasonrequest_time
start_time	time_info)r   r*   r>   r2   rL   	CurlErrorr   rF   getinfor(   	HTTP_CODEEFFECTIVE_URLseekdictNAMELOOKUP_TIMECONNECT_TIMEAPPCONNECT_TIMEPRETRANSFER_TIMESTARTTRANSFER_TIME
TOTAL_TIMEREDIRECT_TIMEr	   getrD   rM   r   handle_callback_exception)
r!   rG   r   r   r   r   rl   r   r   r   s
             r"   r|   zCurlAsyncHTTPClient._finish  sL    y	!!$'''t$$$h 	+++j,77E$$$:D MLLNNNFFE<< 011D LL)=>>MKKNNN /048J3KK||F$:;;LL!455||F$:;;V%<==,,v'@AA,,v011\\&"677	
 	
 	
		=D O O!"/	?..EE!%!2!2!4!4t<T7U!U#$56'        	= 	= 	=**4
+;<<<<<<	=s   A4I %I+*I+c                 4    t          j        d|d           d S )NzException in callback %rT)exc_info)r   rl   )r!   rI   s     r"   r   z-CurlAsyncHTTPClient.handle_callback_exception:  s     0(TJJJJJJr$   c                    t          j                    }t                              t          j                  rE|                    t           j        d           |                    t           j        | j	                   t          t           d          rn|                    t           j        t           j        t           j        z             |                    t           j        t           j        t           j        z             |S )Nr   	PROTOCOLS)r(   r<   curl_logisEnabledForloggingDEBUGr+   VERBOSEDEBUGFUNCTION_curl_debughasattrr   
PROTO_HTTPPROTO_HTTPSREDIR_PROTOCOLS)r!   rG   s     r"   r   z CurlAsyncHTTPClient._curl_create=  s    {}}  // 	@KK***KK,d.>???K
 
 	X KK(&*;f>P*PQQQKK.0AFDV0VWWWr$   r   r   c                 D                         t          j        t          j                             dj        vr
dj        d<   dj        vr
dj        d<   d j                                        D             }|D ].}t                              |          rt          d|z            /                     t          j
        |                                t          j        t          j         j        |j                             j        r(dt"          t$          t&          f         dt(          f fd}n|j        }                     t          j        |                                t          j        j                                        t          j        j                   j        J                      t          j        t)          d	j        z                       j        J                      t          j        t)          d	j        z                       j        r3                     t          j         t          j                             n                      t          j         d
           j!        r%                     t          j"        j!                   j#        r!                     t          j$        d           n                      t          j$        d            j%        r+j&        r#                     t          j'        j%                                        t          j(        j&                   j)        rHj*        J tW          j,        j)        j*                  }                     t          j-        |           j.        j.        dk    r+                     t          j/        t          j0                   nj.        dk    r+                     t          j/        t          j1                   nt          dj.        z            	 2                    t          j'                   n0# tf          $ r#                      t          j'        d           Y nw xY w2                    t          j-                   j4        rA                     t          j5        d                                t          j6        d           n@                     t          j5        d                                t          j6        d           j7        &                     t          j8        j7                   n	 j9        du r+                     t          j:        t          j;                   n*                     t          j:        t          j<                   t          j=        t          j>        t          j?        t          j@        d}	h d}
|	A                                D ]}                     |d           jB        |	v rA2                    t          jC                                        |	jB                 d           nMjD        s	jB        |
v r&                     t          jC        jB                   nt          djB        z             jB        dv }jF        d u}jD        s'|r|r|r!|st          d|rdnddjB        d          |s|r&jB        dk    rt          d          t          t          jF        pd                    dt(          dd ffd}                     t          jI        jJ                                        t          jK        |           jB        d k    r5                     t          jL        t          jF        pd                     nT                     t          j?        d                                t          jN        t          jF        pd                     jO        jP        J jQ        jQ        dk    r+                     t          jR        t          j0                   nMjQ        dk    r+                     t          jR        t          j1                   nt          d!jQ        z            tW          j,        jO        jP                  }                     t          jS        |           t          U                    d"jB        j        jO                   nE2                    t          jS                   t          U                    d#jB        j                   jV        %                     t          jW        jV                   jX        %                     t          jY        jX                   jZ        t          d$          t          j\                    dk    r                      t          j]        d           j^        ^                               d S d S )%NExpect Pragmac                     g | ]L\  }}d t          |                              d          t          |                              d          fz  MS )s   %s: %sASCIIz	ISO8859-1)r   encode)r   kvs      r"   r#   z;CurlAsyncHTTPClient._curl_setup_request.<locals>.<listcomp>a  sd     
 
 
 1 !}}##G,,jmm.B.B;.O.OPQ
 
 
r$   z+Illegal characters in header (CR or LF): %rbr   c                 t    j         J j                            j         |            t          |           S rB   )streaming_callbackrD   add_callbacklen)r   rH   r!   s    r"   write_functionz?CurlAsyncHTTPClient._curl_setup_request.<locals>.write_functions  s8    1===))'*DaHHH1vvr$   r%   z Mozilla/5.0 (compatible; pycurl)zgzip,deflatebasicdigestzUnsupported proxy_auth_mode %sr      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cmdc                 L    | j         k    r                    d           d S d S rK   )IOCMD_RESTARTREADr   )r   rG   request_buffers    r"   ioctlz6CurlAsyncHTTPClient._curl_setup_request.<locals>.ioctl  s3    $000"''***** 10r$   r   zUnsupported auth_mode %sz%s %s (username: %r)%s %sz,ssl_options not supported in curl_httpclient)_r+   r(   URLr   urlr   get_all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IOCTLFUNCTIONPOSTFIELDSIZEr   
INFILESIZEauth_usernameauth_password	auth_modeHTTPAUTHUSERPWDr   debugclient_certSSLCERT
client_keySSLKEYssl_options	threadingactive_countNOSIGNALprepare_curl_callback)r!   rG   rH   r   r   encoded_headersliner   credentialscurl_optionscustom_methodsobody_expectedbody_presentr   userpwdr   s   ```             @r"   r   z'CurlAsyncHTTPClient._curl_setup_requestI  s	    	FJ
7; 7 7888 7?**(*GOH% 7?**(*GOH%
 
  //11
 
 

 $ 	W 	WD!!$'' W !NQU!UVVVWF%777!*GW5L 	
 	
 	
 % 	*%y(8"9 c         $\NF(.999F)7+CDDDF$g&;<<<&222F,c$9P2P.Q.QRRR&222F%s4'2I+I'J'JKKK 	NKK(*W5G*H*HIIIIKK(*LMMM$ 	EKK('*CDDD& 	/KK8888KK... 	/'"4 	/KKg&8999KK('*<===% >-999&?*G,B  F/===&.'2IW2T2TF,f.CDDDD(H44F,f.DEEEE 4w7NN  .fl++++ . . .FL"-----.MM&-...  	2KK-q111KK-q1111KK-q111KK-q111'KKw'78888 && KK(&*=>>>>KK(&*CDDD
 >K=M	
 
 877$$&& 	" 	"AKK5!!!!>\))MM&.///KKW^4d;;;;. 	?'.N2R2RKK,gn====,w~=>>>*BB|4/0 	  l %2 !j "/6vvB66H    	HL 	H~&& !!DEEE$T',*<"%=%=>>N+3 +4 + + + + + + + KK+^-@AAAKK,e444~''F0#gl6Hb2I2IJJJJFM4000F-s7<3E2/F/FGGG ,(444 (G,=,H,HFOV-BCCCC"h..FOV-CDDDD !;g>O!OPPP7%w'< G KK000NN&%	    MM&.)))NN7GNGK@@@*KK(;<<<)KKw'9:::*KLLL!##a'' KK+++(4))$///// 54s   -Q *Q:9Q:r   header_line_bytesc                    t          |                    d                    }|| j                            ||           |                                }|                    d          rI|                                 	 t          j        |          \  }}}d|z  }n# t          j	        $ r Y d S w xY w|sd S |
                    |           d S )Nlatin1zHTTP/zX-Http-Reason: %s)r   decoderD   r   rstrip
startswithclearr   parse_response_start_lineHTTPInputError
parse_line)r!   r   r   r<  header_line_version_coder   s           r"   r   z)CurlAsyncHTTPClient._curl_header_callback   s     !!2!9!9(!C!CDD&L%%o{CCC "((**!!'** 	MMOOO,4,N- -)5& 2F:*    	F;'''''s   >B B/.B/
debug_type	debug_msgc                    d}|dk    r>t          |          }t                              d|                                           d S |dv rJt          |          }|                                D ]$}t                              d||         |           %d S |dk    r$t                              d||         |           d S d S )N)I<>rM  rN  r   z%s)r   r   r      z%s %r)r   r   r)  strip
splitlines)r!   rI  rJ  debug_typesr4  s        r"   r   zCurlAsyncHTTPClient._curl_debug9  s    /??"9--INN4!2!2333336!!"9--I!,,.. G GwJ(?FFFFG G1__NN7K
$;YGGGGG _r$   )r   N)r   N)NN)"__name__
__module____qualname__r   r   r   strr   r'   rF   r   r   r	   rO   r   r/   r-   r`   rf   r9   ro   rN   r(   r<   r|   r   r   r   r   r   r   r   r   __classcell__)r@   s   @r"   r   r   3   s       JN 5  5 5/7S#X/G 5	 5  5  5  5  5  5D     ".6~t7K.L	   )C )S ) )E )d ) ) ) ):
# 
$ 
 
 
 
( (c (d ( ( ( ($+ + + +:( ( ( (   ' ' ' 'X %)&*	4= 4=k4= SM4= sm	4=
 
4= 4= 4= 4=lK# K$ K K K K
fk 
 
 
 
U0kU0 U0 	U0
 %U0 
U0 U0 U0 U0n(%( "3%+.( !	(
 
( ( ( (2
Hc 
Hc 
Hd 
H 
H 
H 
H 
H 
H 
H 
Hr$   r   c                   "    e Zd ZdededdfdZdS )r   errnomessager   Nc                 @    t          j        | d|           || _        d S )Nr   )r
   __init__rY  )r!   rY  rZ  s      r"   r\  zCurlError.__init__G  s"    4g...


r$   )rS  rT  rU  r   rV  r\  r   r$   r"   r   r   F  s=        c C D      r$   r   __main__))__doc__r3   r   r   r(   rer/  rM   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   rS  	configurer   r$   r"   <module>rj     s    < ;           				                        + + + + + + + +                     7 7 7 7 7 7 7 7 7 7 7 7 7 7 	 $########7677bj""PH PH PH PH PH/ PH PH PHf    	    zO1222DFFFFF r$   