
    R?ga                        S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKJ	r	  SSK
Jr  SSK
Jr  SSKJrJr  SSKJrJrJrJrJr  SSKJr  SS	KJrJrJrJrJr  SSKr\R<                  (       a  SS
KJrJ r   \RB                  " S5      r"\RF                  " S5      r$ " S S\5      r% " S S\5      r&\'S:X  a  \RP                  " \%5        \" 5         gg)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            
         ^  \ rS rSr S(S\S\\\\4      SS4U 4S jjjr	S)U 4S jjr
S\S	\\/S4   SS4S
 jrS\S\S\S\SS4
S jrS\SS4S jrS\S\SS4S jrS)S jrS)S jrS)S jrS)S jr  S*S\R0                  S\\   S\\   SS4S jjrS	\SS4S jrS\R0                  4S jrS\R0                  S\S\S\R<                  SS4
S  jrS\R<                  S!\\/S4   S"\SS4S# jr S$\S%\SS4S& jr!S'r"U =r#$ )+CurlAsyncHTTPClient3   Nmax_clientsdefaultsreturnc                   > [         TU ]  US9  [        R                  " 5       U l        U R                  R                  [        R                  U R                  5        U R                  R                  [        R                  U R                  5        [        U5       Vs/ s H  o0R                  5       PM     snU l        U R                  S S  U l        [        R                  " 5       U l        0 U l        S U l        [&        R(                  " U R*                  S5      U l        U R,                  R/                  5         [        R0                  " 5       nU R                  R3                  U5        U R                  R5                  U5        g s  snf )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        9/usr/lib/python3/dist-packages/tornado/curl_httpclient.pyr   CurlAsyncHTTPClient.initialize4   s)    	H-&&(61143D3DE622D4G4GH49+4FG4Fq((*4FG++a. 	 	 (.'>'>&&(
$ 	$$**, #KKM01!!"341 Hs   Fc                 P  > U R                   R                  5         U R                  b%  U R                  R	                  U R                  5        U R
                   H  nUR                  5         M     U R                  R                  5         [        TU ]  5         S U l         S U l        g N)	r2   stopr/   io_loopremove_timeoutr)   closer!   r   )r7   curlr:   s     r;   rB   CurlAsyncHTTPClient.closeV   sv    $$))+==$LL''6KKDJJL  
 (,$    requestcallbackc                     U R                   R                  XU R                  R                  5       45        U R	                  5         U R                  S5        g Nr   )r-   appendr@   time_process_queuer$   )r7   rF   rG   s      r;   
fetch_implCurlAsyncHTTPClient.fetch_imple   sB     	w$,,2C2C2EFG!rE   eventfdmultidatac           	         [         R                  [        R                  R                  [         R
                  [        R                  R                  [         R                  [        R                  R                  [         R                  [        R                  R                  [        R                  R                  -  0nU[         R                  :X  a9  X R                  ;   a)  U R                  R                  U5        U R                  U	 ggXQ   nX R                  ;   a  U R                  R                  U5        U R                  R                  X R                  U5        X`R                  U'   g)zOCalled 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)r7   rO   rP   rQ   rR   	event_mapioloop_events          r;   r&   "CurlAsyncHTTPClient._handle_socketl   s    
 fmm00NNFMM..OOV]]00v}}11FMM4G4GG	
	 F&&&YY++B/IIbM  %+L YY++B/LL$$R)<)<lK(IIbMrE   msecsc                     U R                   b%  U R                  R                  U R                   5        U R                  R                  U R                  R	                  5       US-  -   U R
                  5      U l         g)z(Called by libcurl to schedule a timeout.Ng     @@)r/   r@   rA   add_timeoutrK   _handle_timeout)r7   rc   s     r;   r$    CurlAsyncHTTPClient._set_timeout   sY    ==$LL''600LL%&.0$2F2F
rE   eventsc                    SnU[         R                  R                  -  (       a  U[        R                  -  nU[         R                  R
                  -  (       a  U[        R                  -  n  U R                  R                  X5      u  pEU[        R                  :w  a  OM5  U R                  5         g! [        R                   a  nUR                  S   n SnANPSnAff = f)zHCalled by IOLoop when there is activity on one of our
file descriptors.
r   N)r   rU   rX   r   
CSELECT_INrZ   CSELECT_OUTr!   socket_actionerrorargsE_CALL_MULTI_PERFORM_finish_pending_requests)r7   rP   rh   actionretnum_handleses          r;   r_   "CurlAsyncHTTPClient._handle_events   s     FMM&&&f'''FFMM'''f(((F #';;#<#<R#H  f111  	%%'	 <<  ffQi s   /B4 4C!CC!c                    SU l           U R                  R                  [        R                  S5      u  pU[        R                  :w  a  OMD  U R                  5         U R                  R                  5       nUS:  a  U R                  U5        gg! [        R
                   a  nUR                  S   n SnANSnAff = f)z7Called by IOLoop when the requested timeout has passed.Nr   )r/   r!   rl   r   SOCKET_TIMEOUTrm   rn   ro   rp   timeoutr$   )r7   rr   rs   rt   new_timeouts        r;   rf   #CurlAsyncHTTPClient._handle_timeout   s     #';;#<#<V=R=RTU#V  f111  	%%' kk))+!k* ) <<  ffQi s   ,B B=$B88B=c                       U R                   R                  5       u  pU[        R
                  :w  a  OM4  U R                  5         g! [        R                   a  nUR                  S   n SnANPSnAff = f)z`Called by IOLoop periodically to ask libcurl to process any
events it may have forgotten about.
r   N)r!   
socket_allr   rm   rn   ro   rp   )r7   rr   rs   rt   s       r;   r1   )CurlAsyncHTTPClient._handle_force_timeout   sj      #';;#9#9#;  f111  	%%'	 <<  ffQi s   A A4A//A4c                      U R                   R                  5       u  pnU H  nU R                  U5        M     U H  u  pEnU R                  XEU5        M     US:X  a  OM^  U R                  5         g)zRProcess any requests that were completed by the last
call to multi.socket_action.
r   N)r!   	info_read_finishrL   )r7   num_qok_listerr_listrC   errnumerrmsgs          r;   rp   ,CurlAsyncHTTPClient._finish_pending_requests   sn     '+{{'<'<'>$EHT"  (0$fT62 )1z  	rE   c           	          SnU R                   (       Ga   U R                  (       Ga  US-  nU R                   R                  5       nU R                  R                  5       u  p4n[        R
                  " 5       [        5       UUU[        R                  " 5       U R                  R                  5       R                  5       S.Ul
         U R                  UUUR                  S   UR                  S   5        U R                  R                  U5        U R                   (       a  U R                  (       a  GM  U(       d  g GM?  ! [         a6  nU R                   R                  U5        U" [!        USUS95         S nANkS nAff = f)Nr      )headersbufferrF   rG   queue_start_timecurl_start_timecurl_start_ioloop_timer   r   W  )rF   coderm   )r*   r-   poppopleftr   HTTPHeadersr   rK   r@   currentinfo_curl_setup_requestr!   r5   	ExceptionrJ   r	   )r7   startedrC   rF   rG   r   rt   s          r;   rL   "CurlAsyncHTTPClient._process_queue   s7   G///dnnn1**,8<8N8N8P5$4  (335%i& ((8'+yy{.2ll.B.B.D.I.I.K	1,,		(+		),	$ KK**40C //dnnnF M . ! 
O OO**40\'1MNN
Os   .E 
F,E<<FrC   
curl_errorcurl_messagec                 x   UR                   nS Ul         U R                  R                  U5        U R                  R	                  U5        US   nU(       a6  Uc   e[        X#5      nUc   eUR                  nS nUR                  5         S nOQS nUR                  [        R                  5      nUR                  [        R                  5      nUR                  S5        [        US   US   -
  UR                  [        R                  5      UR                  [        R                  5      UR                  [        R                   5      UR                  [        R"                  5      UR                  [        R$                  5      UR                  [        R&                  5      UR                  [        R(                  5      S9n	 US   " [+        US   UUS   UUUUS   R-                  S	S 5      U R.                  R1                  5       US   -
  US
   U	S9
5        g ! [2         a    U R5                  US   5         g f = f)Nr   r   r   r   )queue
namelookupconnect
appconnectpretransferstarttransfertotalredirectrG   rF   r   zX-Http-Reasonr   )
rF   r   r   r   effective_urlrm   reasonrequest_time
start_time	time_info)r   r!   r6   r*   rJ   	CurlErrorr   rB   getinfor   	HTTP_CODEEFFECTIVE_URLseekdictNAMELOOKUP_TIMECONNECT_TIMEAPPCONNECT_TIMEPRETRANSFER_TIMESTARTTRANSFER_TIME
TOTAL_TIMEREDIRECT_TIMEr	   getr@   rK   r   handle_callback_exception)
r7   rC   r   r   r   r   rm   r   r   r   s
             r;   r   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	
		= O O!"/	?..E!%!2!2!4t<T7U!U#$56'  	=**4
+;<	=s   AH H98H9c                 0    [         R                  " SUSS9  g )NzException in callback %rT)exc_info)r   rm   )r7   rG   s     r;   r   -CurlAsyncHTTPClient.handle_callback_exception:  s    0(TJrE   c                 :   [         R                  " 5       n[        R                  [        R
                  5      (       aJ  UR                  [         R                  S5        UR                  [         R                  U R                  5        [        [         S5      (       a~  UR                  [         R                  [         R                  [         R                  -  5        UR                  [         R                  [         R                  [         R                  -  5        U$ )Nr   	PROTOCOLS)r   r4   curl_logisEnabledForloggingDEBUGr"   VERBOSEDEBUGFUNCTION_curl_debughasattrr   
PROTO_HTTPPROTO_HTTPSREDIR_PROTOCOLS)r7   rC   s     r;   r(    CurlAsyncHTTPClient._curl_create=  s    {{}  //KK*KK,,d.>.>?K
 
 KK((&*;*;f>P>P*PQKK..0A0AFDVDV0VWrE   r   r   c           	      `  ^ ^^^ TR                  [        R                  [        TR                  5      5        STR
                  ;  a  STR
                  S'   STR
                  ;  a  STR
                  S'   TR
                  R                  5        VVs/ s H<  u  pVS[        U5      R                  S5      [        U5      R                  S5      4-  PM>     nnnU H+  n[        R                  U5      (       d  M  [        SU-  5      e   TR                  [        R                  U5        TR                  [        R                  [        R                  " T R                  UTR                   5      5        TR"                  (       a#  S[$        [&        [(        4   S	[*        4UU 4S
 jjn	OUR,                  n	TR                  [        R.                  U	5        TR                  [        R0                  TR2                  5        TR                  [        R4                  TR6                  5        TR8                  c   eTR                  [        R:                  [+        STR8                  -  5      5        TR<                  c   eTR                  [        R>                  [+        STR<                  -  5      5        TR@                  (       a4  TR                  [        RB                  [        TR@                  5      5        O TR                  [        RB                  S5        TRD                  (       a*  TR                  [        RF                  TRD                  5        TRH                  (       a!  TR                  [        RJ                  S5        O TR                  [        RJ                  S 5        TRL                  (       Gat  TRN                  (       Gab  TR                  [        RP                  TRL                  5        TR                  [        RR                  TRN                  5        TRT                  (       aZ  TRV                  c   e[X        RZ                  " TRT                  TRV                  5      n
TR                  [        R\                  U
5        TR^                  b  TR^                  S:X  a/  TR                  [        R`                  [        Rb                  5        OTR^                  S:X  a/  TR                  [        R`                  [        Rd                  5        OW[        STR^                  -  5      e TRg                  [        RP                  5        TRg                  [        R\                  5        TRj                  (       aA  TR                  [        Rl                  S5        TR                  [        Rn                  S5        O@TR                  [        Rl                  S5        TR                  [        Rn                  S5        TRp                  b+  TR                  [        Rr                  TRp                  5        O TRt                  SL a/  TR                  [        Rv                  [        Rx                  5        O.TR                  [        Rv                  [        Rz                  5        [        R|                  [        R~                  [        R                  [        R                  S.n[        / SQ5      nUR                  5        H  nTR                  US5        M     TR                  U;   a?  TRg                  [        R                  5        TR                  UTR                     S5        OdTR                  (       d  TR                  U;   a+  TR                  [        R                  TR                  5        O[        STR                  -   5      eTR                  S;   nTR                  S LnTR                  (       dC  U(       a  U(       a  U(       a.  U(       d'  [        SU(       a  SOS< STR                  < S35      eU(       d  U(       GaF  TR                  S:X  a  [        S5      e[        [        TR                  =(       d    S5      5      mS [*        S	S 4UU4S! jjnTR                  [        R                  TR                  5        TR                  [        R                  U5        TR                  S":X  a=  TR                  [        R                  [        TR                  =(       d    S5      5        O\TR                  [        R                  S5        TR                  [        R                  [        TR                  =(       d    S5      5        TR                  Gb4  TR                  c   eTR                  b  TR                  S:X  a/  TR                  [        R                  [        Rb                  5        OWTR                  S:X  a/  TR                  [        R                  [        Rd                  5        O[        S#TR                  -  5      e[X        RZ                  " TR                  TR                  5      nTR                  [        R                  U5        [        R                  S$TR                  TR                  TR                  5        OJTRg                  [        R                  5        [        R                  S%TR                  TR                  5        TR                  b*  TR                  [        R                  TR                  5        TR                  b*  TR                  [        R                  TR                  5        TR                  b  [        S&5      e[        R                  " 5       S:  a   TR                  [        R                  S5        TR                  b  TR                  T5        g g s  snnf ! [h         a$    TR                  [        RP                  S5         GNf = f)'NExpect Pragmas   %s: %sASCIIz	ISO8859-1z+Illegal characters in header (CR or LF): %rbr   c                    > TR                   c   eTR                  R                  TR                   U 5        [        U 5      $ r>   )streaming_callbackr@   add_callbacklen)r   rF   r7   s    r;   write_function?CurlAsyncHTTPClient._curl_setup_request.<locals>.write_functions  s8    11===))'*D*DaH1vrE   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                 J   > U TR                   :X  a  TR                  S5        g g rI   )IOCMD_RESTARTREADr   )r   rC   request_buffers    r;   ioctl6CurlAsyncHTTPClient._curl_setup_request.<locals>.ioctl  s$    $000"''* 1rE   r   zUnsupported auth_mode %sz%s %s (username: %r)%s %sz,ssl_options not supported in curl_httpclient)ar"   r   URLr   urlr   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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)r7   rC   rF   r   r   kvencoded_headersliner   credentialscurl_optionscustom_methodsobody_expectedbody_presentr   userpwdr   s   ```               @r;   r   'CurlAsyncHTTPClient._curl_setup_requestI  s    	FJJ
7;; 78 7??*(*GOOH% 7??*(*GOOH%
  //1
 2 !}##G,jm.B.B;.OPQ1 	 

 $D!!$'' !NQU!UVV $ 	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"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))$/ 5y
~  .FLL"-.s   Ao9+o? ?*p-,p-r   header_line_bytesc                    [        UR                  S5      5      nUb  U R                  R                  X$5        UR	                  5       nUR                  S5      (       a/  UR                  5          [        R                  " U5      u    pVSU-  nU(       d  g UR                  U5        g ! [        R                   a     g f = f)Nlatin1zHTTP/zX-Http-Reason: %s)r   decoder@   r   rstrip
startswithclearr   parse_response_start_lineHTTPInputError
parse_line)r7   r   r   rH  header_line__r   s          r;   r   )CurlAsyncHTTPClient._curl_header_callback   s     !!2!9!9(!CD&LL%%oC "((*!!'**MMO#+#E#Ek#R R1F: ;'	 ** s   0B( (B?>B?
debug_type	debug_msgc                 8   SnUS:X  a0  [        U5      n[        R                  SUR                  5       5        g US;   a<  [        U5      nUR	                  5        H  n[        R                  SX1   U5        M     g US:X  a  [        R                  SX1   U5        g g )N)I<>rY  rZ  r   z%s)r   r   r      z%s %r)r   r   r2  strip
splitlines)r7   rU  rV  debug_typesr?  s        r;   r   CurlAsyncHTTPClient._curl_debug7  s    /?"9-INN4!236!"9-I!,,.w(?F /1_NN7K$;YG rE   )r)   r.   r2   r*   r!   r-   r/   )
   N)r   N)NN)$__name__
__module____qualname____firstlineno__r   r   r   strr   r   rB   r   r   r	   rM   r   r&   r$   r_   rf   r1   rp   rL   r   r4   r   r   r(   r   r   r   r   r   r   __static_attributes____classcell__)r:   s   @r;   r   r   3   s   JN 5 5/7S#X/G 5	 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 
U0kkU0 U0 	U0
 %%U0 
U0n(%%( "3%+.( !	(
 
(.
Hc 
Hc 
Hd 
H 
HrE   r   c                   *    \ rS rSrS\S\SS4S jrSrg)r   iD  errnomessager   Nc                 @    [         R                  " U SU5        Xl        g )Nr   )r
   __init__ri  )r7   ri  rj  s      r;   rl  CurlError.__init__E  s    4g.
rE   )ri  )ra  rb  rc  rd  r   re  rl  rf   rE   r;   r   r   D  s    c C D rE   r   __main__))__doc__r+   r   r   r   rer8  rK   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   ra  	configurern  rE   r;   <module>r|     s     <     	      +    7 7 	#67jj"NH/ NHb	  z12F rE   