
    <OOfT`                     n   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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! G d de      Z" G d de      Z#e$dk(  r ejJ                  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_httpclientc            
           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 ))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*                  d      | _        | j,                  j/                          t        j0                         }| j                  j3                  |       | j                  j5                  |       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_timeoutr   PeriodicCallback_handle_force_timeout_force_timeout_callbackstartCurl
add_handleremove_handle)selfr   r   idummy_curl_handle	__class__s        X/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/tornado/curl_httpclient.pyr   zCurlAsyncHTTPClient.initialize1   s%    	H-&&(61143D3DE622D4G4GH49+4FGqt((*G++a. 	 	 (.'>'>&&(
$ 	$$**, #KKM01!!"341 Hs    Fc                 J   | j                   j                          | j                  %| j                  j	                  | j                         | j
                  D ]  }|j                           | j                  j                          t        |           d | _         d | _        y N)	r1   stopr.   io_loopremove_timeoutr(   closer    r   )r6   curlr9   s     r:   r@   zCurlAsyncHTTPClient.closeS   s{    $$))+==$LL''6KK 	DJJL	
 (,$    requestcallbackc                     | j                   j                  ||| j                  j                         f       | j	                          | j                  d       y Nr   )r,   appendr>   time_process_queuer#   )r6   rC   rD   s      r:   
fetch_implzCurlAsyncHTTPClient.fetch_implb   sD     	w$,,2C2C2EFG!rB   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-   r>   remove_handleradd_handler_handle_events)r6   rK   rL   rM   rN   	event_mapioloop_events          r:   r%   z"CurlAsyncHTTPClient._handle_socketi   s    
 fmm00NNFMM..OOV]]00v}}11FMM4G4GG	
	 F&&&TYY++B/IIbM  %U+L TYY++B/LL$$R)<)<lK(DIIbMrB   msecsc                     | j                   %| j                  j                  | j                          | j                  j                  | j                  j	                         |dz  z   | j
                        | _         y)z(Called by libcurl to schedule a timeout.Ng     @@)r.   r>   r?   add_timeoutrH   _handle_timeout)r6   r^   s     r:   r#   z CurlAsyncHTTPClient._set_timeout   sY    ==$LL''600LL%&.0$2F2F
rB   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   rQ   rT   r   
CSELECT_INrV   CSELECT_OUTr    socket_actionerrorargsE_CALL_MULTI_PERFORM_finish_pending_requests)r6   rL   rb   actionretnum_handleses          r:   r[   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    rf   r   SOCKET_TIMEOUTrg   rh   ri   rj   timeoutr#   )r6   rl   rm   rn   new_timeouts        r:   ra   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                         \  }}|t        j
                  k7  rn3| j                          y# t        j                  $ r}|j                  d   }Y d}~Md}~ww xY w)zpCalled by IOLoop periodically to ask libcurl to process any
        events it may have forgotten about.
        r   N)r    
socket_allr   rg   rh   ri   rj   )r6   rl   rm   rn   s       r:   r0   z)CurlAsyncHTTPClient._handle_force_timeout   sl      #';;#9#9#; [ f111  	%%'	 <<  ffQi s   A A2A--A2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_finishrI   )r6   num_qok_listerr_listrA   errnumerrmsgs          r:   rj   z,CurlAsyncHTTPClient._finish_pending_requests   s~     '+{{'<'<'>$E7H #T"#(0 3$ffT6623z  	rB   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        $ r9}| j                   j                  |        |t!        |d|             Y d }~\d }~ww xY w)Nr      )headersbufferrC   rD   queue_start_timecurl_start_timecurl_start_ioloop_timer   r   W  )rC   coderg   )r)   r,   poppopleftr   HTTPHeadersr   rH   r>   currentinfo_curl_setup_requestr    r4   	ExceptionrG   r	   )r6   startedrA   rC   rD   r   rn   s          r:   rI   z"CurlAsyncHTTPClient._process_queue   s3   G//dnn1**,8<8N8N8P5($4  (335%i& ((8'+yy{.2ll.B.B.D.I.I.K	1,,		(+		),	$ KK**40C //dnnF M . ! 
O OO**40\'1MNN
Os   =.D% %	E'./E""E'rA   
curl_errorcurl_messagec                 v   |j                   }d |_         | j                  j                  |       | 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.                  j1                         |d   z
  |d
   |	
             y # t2        $ r | j5                  |d          Y y w xY w)Nr   r   r   r   )queue
namelookupconnect
appconnectpretransferstarttransfertotalredirectrD   rC   r   zX-Http-Reasonr   )
rC   r   r   r   effective_urlrg   reasonrequest_time
start_time	time_info)r   r    r5   r)   rG   	CurlErrorr   r@   getinfor   	HTTP_CODEEFFECTIVE_URLseekdictNAMELOOKUP_TIMECONNECT_TIMEAPPCONNECT_TIMEPRETRANSFER_TIMESTARTTRANSFER_TIME
TOTAL_TIMEREDIRECT_TIMEr	   getr>   rH   r   handle_callback_exception)
r6   rA   r   r   r   r   rg   r   r   r   s
             r:   rw   zCurlAsyncHTTPClient._finish  s    yy	!!$'t$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'  	=**4
+;<	=s   ?AH H87H8c                 4    t        j                  d|d       y )NzException in callback %rT)exc_info)r   rg   )r6   rD   s     r:   r   z-CurlAsyncHTTPClient.handle_callback_exception7  s    0(TJrB   c                 $   t        j                         }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         |S )Nr~   	PROTOCOLS)r   r3   curl_logisEnabledForloggingDEBUGr!   VERBOSEDEBUGFUNCTION_curl_debughasattrr   
PROTO_HTTPPROTO_HTTPSREDIR_PROTOCOLS)r6   rA   s     r:   r'   z CurlAsyncHTTPClient._curl_create:  s    {{}  /KK*KK,,d.>.>?K
 KK((&*;*;f>P>P*PQKK..0A0AFDVDV0VWrB   r   r   c                     j                  t        j                  t        j                               dj
                  vrdj
                  d<   dj
                  vrdj
                  d<   j                  t        j                  j
                  j                         D cg c]<  \  }}dt        |      j                  d      t        |      j                  d      fz  > c}}       j                  t        j                  t        j                   j                  |j                               j                  r!dt        t         t"        f   dt$        f fd	}n|j&                  }j                  t        j(                  |       j                  t        j*                  j,                         j                  t        j.                  j0                         j2                  J j                  t        j4                  t%        d
j2                  z               j6                  J j                  t        j8                  t%        d
j6                  z               j:                  r4j                  t        j<                  t        j:                               n j                  t        j<                  d       j>                  r*j                  t        j@                  j>                         jB                  r!j                  t        jD                  d       n j                  t        jD                  d        jF                  rejH                  rXj                  t        jJ                  jF                         j                  t        jL                  jH                         jN                  rXjP                  J tS        jT                  jN                  jP                        }j                  t        jV                  |       jX                  jX                  dk(  r/j                  t        jZ                  t        j\                         njX                  dk(  r/j                  t        jZ                  t        j^                         nWta        djX                  z        	 jc                  t        jJ                         jc                  t        jV                         jf                  rAj                  t        jh                  d       j                  t        jj                  d       n@j                  t        jh                  d       j                  t        jj                  d       jl                  +j                  t        jn                  jl                         n	 jp                  du r/j                  t        jr                  t        jt                         n.j                  t        jr                  t        jv                         t        jx                  t        jz                  t        j|                  t        j~                  d}	t        g d      }
|	j                         D ]  }j                  |d        j                  |	v r?jc                  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 ta        d|rdnddj                  d      |s|r3j                  dk(  rta        d      t        t        j                  xs d            dt$        dd 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        j\                         nVj                  dk(  r/j                  t        j                  t        j^                         nta        d"j                  z        tS        jT                  j                  j                        }j                  t        j                  |       t        j                  d#j                  j                  j                         nJjc                  t        j                         t        j                  d$j                  j                         j                  *j                  t        j                  j                         j                  *j                  t        j                  j                         j                  ta        d%      t        j                         dkD  r j                  t        j                  d       j                  j                         y y c c}}w # td        $ r$ j                  t        jJ                  d       Y w xY w)&NExpect Pragmas   %s: %sASCIIz	ISO8859-1br   c                     j                   J j                  j                  j                   |        t        |       S r<   )streaming_callbackr>   add_callbacklen)r   rC   r6   s    r:   write_functionz?CurlAsyncHTTPClient._curl_setup_request.<locals>.write_functiono  s8    11===))'*D*DaH1vrB   r   z Mozilla/5.0 (compatible; pycurl)zgzip,deflatebasicdigestzUnsupported proxy_auth_mode %sr~      r   F)GETPOSTPUTHEAD)DELETEOPTIONSPATCHTz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                 H    | j                   k(  rj                  d       y y rF   )IOCMD_RESTARTREADr   )r   rA   request_buffers    r:   ioctlz6CurlAsyncHTTPClient._curl_setup_request.<locals>.ioctl  s$    $000"''* 1rB   r   zUnsupported auth_mode %sz%s %s (username: %r)%s %sz,ssl_options not supported in curl_httpclient)_r!   r   URLr   urlr   
HTTPHEADERget_allencode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
ValueErrorunsetopt	TypeErrorvalidate_certSSL_VERIFYPEERSSL_VERIFYHOSTca_certsCAINFO
allow_ipv6	IPRESOLVEIPRESOLVE_V4IPRESOLVE_WHATEVERHTTPGETr   UPLOADNOBODYset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)r6   rA   rC   r   r   kvr   credentialscurl_optionscustom_methodsobody_expectedbody_presentr   userpwdr   s   ```             @r:   r   z'CurlAsyncHTTPClient._curl_setup_requestF  sL    	FJJ
7;; 78 7??*(*GOOH% 7??*(*GOOH% $OO335 Aq a=''0*Q-2F2F{2STU	
 	!!**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	
 ;<$$& 	"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+3 +4 + KK++^-@-@AKK,,e4~~'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))$/ 5sx  .FLL"-.s   )Al8l> >)m+*m+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   decoder>   r   rstrip
startswithclearr   parse_response_start_lineHTTPInputError
parse_line)r6   r   r   r3  header_line__r   s          r:   r   z)CurlAsyncHTTPClient._curl_header_callback  s     !!2!9!9(!CD&LL%%o{C "((*!!'*MMO#+#E#Ek#R R1F: ;'	 ** 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<>rC  rD  r   z%s)r~   r   r      z%s %r)r   r   r   strip
splitlines)r6   r?  r@  debug_typeslines        r:   r   zCurlAsyncHTTPClient._curl_debug3  s    /?"9-INN4!236!"9-I!,,. GwJ(?FG1_NN7K
$;YG rB   )
   N)r   N)NN)"__name__
__module____qualname__r   r   r   strr   r   r@   r   r   r	   rJ   r   r%   r#   r[   ra   r0   rj   rI   r   r3   rw   r   r'   r   r   r   r   r   r   __classcell__)r9   s   @r:   r   r   0   s   JN 5 5/7S#X/G 5	 5D".6~t7K.L	)C )S ) )E )d ):
# 
$ 
( (c (d ($+:('X %)&*	4=kk4= SM4= sm	4=
 
4=lK# K$ K
fkk 
T0kkT0 T0 	T0
 %%T0 
T0l(%%( "3%+.( !	(
 
(.
Hc 
Hc 
Hd 
HrB   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__rQ  )r6   rQ  rR  s      r:   rT  zCurlError.__init__A  s    4g.
rB   )rK  rL  rM  r   rN  rT   rB   r:   r   r   @  s    c C D rB   r   __main__)&__doc__r*   r   r   r   r&  rH   ior   tornador   r   tornado.escaper   r   tornado.httpclientr   r	   r
   r   r   tornado.logr   typingr   r   r   r   r   TYPE_CHECKINGr   r   	getLoggerr   r   r   rK  	configurerU  rB   r:   <module>ra     s     <          +    7 7 	#767MH/ MH`	  zO12F rB   