
    ga                        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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        L/var/www/openai/venv/lib/python3.12/site-packages/tornado/curl_httpclient.pyr   zCurlAsyncHTTPClient.initialize4   s+    	H-&&(61143D3DE622D4G4GH49+4FG4Fqt((*4F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.closeV   sv    $$))+==$LL''6KKD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_imple   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_socketl   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   st     '+{{'<'<'>$E7HT"  (0$ffT662 )1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_exception:  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           	      2    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        j                  t        j                   j                  |j                                j"                  r!dt$        t&        t(        f   d	t*        f fd
}	n|j,                  }	j                  t        j.                  |	       j                  t        j0                  j2                         j                  t        j4                  j6                         j8                  J j                  t        j:                  t+        dj8                  z               j<                  J j                  t        j>                  t+        dj<                  z               j@                  r4j                  t        jB                  t        j@                               n j                  t        jB                  d       jD                  r*j                  t        jF                  jD                         jH                  r!j                  t        jJ                  d       n j                  t        jJ                  d        jL                  rejN                  rXj                  t        jP                  jL                         j                  t        jR                  jN                         jT                  rXjV                  J tY        jZ                  jT                  jV                        }
j                  t        j\                  |
       j^                  j^                  dk(  r/j                  t        j`                  t        jb                         nj^                  dk(  r/j                  t        j`                  t        jd                         nWt        dj^                  z        	 jg                  t        jP                         jg                  t        j\                         jj                  rAj                  t        jl                  d       j                  t        jn                  d       n@j                  t        jl                  d       j                  t        jn                  d       jp                  +j                  t        jr                  jp                         n	 jt                  du r/j                  t        jv                  t        jx                         n.j                  t        jv                  t        jz                         t        j|                  t        j~                  t        j                  t        j                  d}t        g d      }|j                         D ]  }j                  |d        j                  |v r?jg                  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|r3j                  dk(  rt        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        jb                         nVj                  dk(  r/j                  t        j                  t        jd                         nt        d#j                  z        tY        jZ                  j                  j                        }j                  t        j                  |       t        j                  d$j                  j                  j                         nJjg                  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 # th        $ r$ j                  t        jP                  d       Y w xY w)'NExpect Pragmas   %s: %sASCIIz	ISO8859-1z+Illegal characters in header (CR or LF): %r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_functions  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)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)r6   rA   rC   r   r   kvencoded_headersliner   credentialscurl_optionscustom_methodsobody_expectedbody_presentr   userpwdr   s   ```               @r:   r   z'CurlAsyncHTTPClient._curl_setup_requestI  s|    	FJJ
7;; 78 7??*(*GOOH% 7??*(*GOOH%
  //1
 21 !}##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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m#1m) ))nn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   r7  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<>rG  rH  r   z%s)r~   r   r      z%s %r)r   r   r"  strip
splitlines)r6   rC  rD  debug_typesr/  s        r:   r   zCurlAsyncHTTPClient._curl_debug7  s    /?"9-INN4!236!"9-I!,,.wJ(?F /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   3   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 
U0kkU0 U0 	U0
 %%U0 
U0n(%%( "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__rT  )r6   rT  rU  s      r:   rW  zCurlError.__init__E  s    4g.
rB   )rN  rO  rP  r   rQ  rW   rB   r:   r   r   D  s    c C D rB   r   __main__))__doc__r*   r   r   r   rer(  rH   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   rN  	configurerX  rB   r:   <module>rf     s     <     	      +    7 7 	#767bjj"NH/ NHb	  zO12F rB   