
    8Cf5                    J   d dl mZ d dlZd dlmZmZ d dlmZ d dlm	Z	m
Z
mZmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZmZmZm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& d dl'm(Z( d dl)m*Z* 	 d dl+m,Z,m-Z- d dl.m/Z/m0Z0 d dl1m2Z2m3Z3m4Z4m5Z5m6Z6 d dl7m8Z8 d dl9m:Z: dZ;e	rd dl=m>Z> d dl?m@Z@ d dlAmBZB d dlCmDZD ee-e0f   ZE G d de(      ZF G d de      ZG G d d eGe       ZH G d! d"eG      ZI G d# d$eG      ZJ G d% d&      ZK G d' d(      ZL	 	 	 	 d*d)ZMy# e<$ r dZ;Y w xY w)+    )annotationsN)ABCabstractmethod)
SSLContext)	TYPE_CHECKINGAnyCallableDictListOptionalTupleUnioncast)Header)LocalCertCreator)
BadRequestPayloadTooLargeSanicExceptionServerError)has_message_body)Stage)Stream)CertSelectorSanicSSLContext)Colorslogger)TransportProtocol)ConnInfo)H0_ALPNH0Connection)H3_ALPNH3Connection)DatagramReceivedDataReceivedH3EventHeadersReceivedWebTransportStreamDataReceived)QuicConfiguration)SessionTicketTF)Sanic)Request)BaseHTTPResponse)Http3Protocolc                  .    e Zd ZdZdZddZddZd	d
dZy)HTTP3Transportz HTTP/3 transport implementation.	_protocolc                    || _         y Nr0   )selfprotocols     P/var/www/highfloat_scraper/venv/lib/python3.12/site-packages/sanic/http/http3.py__init__zHTTP3Transport.__init__C   s	    !    c                    | j                   S r3   r0   r4   s    r6   get_protocolzHTTP3Transport.get_protocolF   s    ~~r8   Nc                .   |dv r<| j                   j                  r&| j                   j                  j                  ||      S |dk(  r | j                   j                  j                  S |dk(  r*| j                   j
                  j                  j                  S |S )N)socketsocknamepeernamenetwork_pathsssl_context)r1   
_transportget_extra_info_quic_network_pathsappstatessl)r4   infodefaults      r6   rC   zHTTP3Transport.get_extra_infoI   s|    66))>>,,;;D'JJ_$>>''666]">>%%++///r8   )r5   r-   )returnr-   r3   )rI   strrJ   r   rK   r   )__name__
__module____qualname____doc__	__slots__r7   r;   rC    r8   r6   r/   r/   >   s    *I"
r8   r/   c                  4    e Zd ZU dZded<   ddZed        Zy)ReceiverzHTTP/3 receiver base class.zasyncio.Futurefuturec                .    || _         || _        || _        y r3   )transmitr5   request)r4   rW   r5   rX   s       r6   r7   zReceiver.__init__[   s      r8   c                   K   y wr3   rR   r:   s    r6   runzReceiver.run`   s	        N)rX   r+   rK   None)rM   rN   rO   rP   __annotations__r7   r   rZ   rR   r8   r6   rT   rT   V   s$    %
  r8   rT   c                       e Zd ZU dZded<   ded<   d fdZdddZddZ	 	 	 	 dd	Zdd
Z	ddZ
ddZddZddZ xZS )HTTPReceiverzHTTP/3 receiver implementation.r   stager+   rX   c                    t        |   |i | d | _        t        j                  | _        d| _        d | _        | j                  j                  | _	        d| _
        y )NFr   )superr7   request_bodyr   IDLEr`   headers_sentresponser5   request_max_sizerequest_bytes)r4   argskwargs	__class__s      r6   r7   zHTTPReceiver.__init__k   sQ    $)&) ZZ
!48 $ > >r8   c                  K   t         j                  | _        | j                  j                  j                         dk(  | _        |rgt        j                  t        j                   dt        j                   | t        j                   dddi       | j                  |       d{    nu	 t        j                  t        j                   dt        j                   d	| j                   ddi
       | j                  j                  | j                         d{    t         j$                  | _        y7 7 # t         $ r$}| j#                  |       d{  7   Y d}~Bd}~ww xY ww)z&Handle the request and response cycle.HEADz[exception]: T	verbosity   )exc_infoextraNz
[request]: rq   )r   HANDLERr`   rX   methodupper	head_onlyr   rI   r   BLUEREDENDerror_responser5   request_handler	ExceptionrZ   rd   )r4   	exceptiones      r6   rZ   zHTTPReceiver.runt   s    ]]
,,224>KK;;-}::,yk&**7"A&	 %%i000	"{{m:fjj\4<<.I&* mm33DLLAAA
 ZZ
 1 B " hhqk!!"s[   B%E,'D8(E,.A/D< D:D< "E,:D< <	E)E$EE$E,$E))E,c                   K   | j                   j                  }|j                  | j                  |       d{    y7 w)z*Handle response when exception encounteredN)r5   rF   handle_exceptionrX   )r4   r~   rF   s      r6   r{   zHTTPReceiver.error_response   s1      mm""4<<;;;s   6A >A c                   |j                   rt        |j                         nd}|j                  }|j                  }t	        |      s_|sd|v sd|v rU|j                  dd        |j                  dd        t        j                  d| j                  j                   d| d       nd|vr|r||d<   nd|d<   dt        |j                        j                         fg|j                  }|S )	Nr   zcontent-lengthtransfer-encodingz Message body set in response on z. A z) response may only have headers, no body.chunkeds   :status)bodylenheadersstatusr   popr   warningrX   pathrL   encodeprocessed_headers)r4   rf   sizer   r   s        r6   _prepare_headerszHTTPReceiver._prepare_headers   s     &.]]s8==!""'7*"g-KK($/KK+T2NN24<<3D3D2E FHEG W,,0()/8+, X__-4467
''
 r8   c                   t        j                  t        j                   dt        j                   dt        j
                   ddi       | j                  st        d      | j                  }| j                  |      }| j                  j                  j                  | j                  j                  |       d| _        t        j                   | _        | j                  j$                  r3| j&                  s'| j)                  | j                  j$                  d	       y
| j&                  r| j*                  j-                          y
y
)zSend response headers to client[send]: HEADERSrn      rs   zno response)	stream_idr   TFN)r   debugr   rx   GREENrz   rf   RuntimeErrorr   r5   
connectionsend_headersrX   r   re   r   RESPONSEr`   r   rw   _sendrU   cancel)r4   rf   r   s      r6   r   zHTTPReceiver.send_headers   s    {{m8FLL>E"	
 }}}--==''1  --ll,, 	. 	
 !^^
==dnnJJt}}))51^^KK  r8   c                P   t        j                  t        j                   dt        j                   d| ddi       | j
                  t        j                  ur t        j                  | _        t        d      | j                  d| j                  _        || c| _
        |_        |S )zPrepare response to clientz
[respond]:rr   rn   r   rs   zResponse already startedN)r   r   r   rx   rz   r`   r   rt   FAILEDr   rf   stream)r4   rf   s     r6   respondzHTTPReceiver.respond   s    {{m:fjj\8*="	

 ::U]]*DJ9:: ==$#'DMM )14&xr8   c                    | xj                   t        |      z  c_         | j                   | j                  kD  rt        d      | j                  xj
                  |z  c_        y)z Receive request body from clientz#Request body exceeds the size limitN)rh   r   rg   r   rX   r   )r4   datas     r6   receive_bodyzHTTPReceiver.receive_body   sL    c$i' 5 55!"GHHT!r8   c           
        K   t        j                  t        j                   dt        j                   d|j                          d| t        j                   ddi       | j                  ||       yw)zSend data to clientr   zdata=z end_stream=rn   r   rs   N)r   r   r   rx   r   decoderz   r   )r4   r   
end_streams      r6   sendzHTTPReceiver.send   sa     {{m8FLL>t{{}o F$fjj\3"	

 	

4$s   A2A4c                   | j                   s| j                          | j                  t        j                  urt        d| j                         | j                  rJ| j                  j                  j                  d      dk(  r"t        |      }|r|rd||fz  nd}n	|rd||fz  }t        j                  t        j                   dt        j                   dd	i
       | j                  j                   j#                  | j$                  j&                  ||       | j)                          |rt        j*                  | _        y y )Nznot ready to send: r   r   s   %x
%b
0

s   0

s   %x
%b
z[transmitting]rn   r   rs   )r   r   r   )re   r   r`   r   r   r   rf   r   getr   r   r   r   rx   rz   r5   r   	send_datarX   r   rW   rd   )r4   r   r   r   s       r6   r   zHTTPReceiver._send   s     ::U^^+ 3DJJ<@AA MM%%))*=>)Kt9D  -d|;% 
 &$5{{m>&**6"	
 	  **ll,,! 	+ 	

 	DJ r8   rK   r\   r3   )r~   zOptional[Exception])r~   r}   rK   r\   )rf   r,   rK   zList[Tuple[bytes, bytes]])rf   r,   rK   r,   )r   bytesrK   r\   )r   r   r   boolrK   r\   )rM   rN   rO   rP   r]   r7   rZ   r{   r   r   r   r   r   r   __classcell__)rk   s   @r6   r_   r_   e   sN    )L 4<(	"<!0&"%!$r8   r_   c                      e Zd ZdZd Zy)WebsocketReceiverz"Websocket receiver implementation.c                   K   y wr3   rR   r:   s    r6   rZ   zWebsocketReceiver.run  	     r[   NrM   rN   rO   rP   rZ   rR   r8   r6   r   r     s
    ,r8   r   c                      e Zd ZdZd Zy)WebTransportReceiverz%WebTransport receiver implementation.c                   K   y wr3   rR   r:   s    r6   rZ   zWebTransportReceiver.run  r   r[   Nr   rR   r8   r6   r   r     s
    /r8   r   c                  \    e Zd ZdZer
edededediZ		 	 	 	 	 	 ddZ
ddZddZddZdd	Zy
)Http3z>Internal helper for managing the HTTP/3 request/response cycler   flow_id
session_idc                .    || _         || _        i | _        y r3   )r5   rW   	receivers)r4   r5   rW   s      r6   r7   zHttp3.__init__,  s    
 ! .0r8   c                   t        j                  t        j                   dt        j                   | t        j
                   ddi       | j                  |      \  }}t        t        |      }t        |t              r+|r)t        j                  |j                               |_        y t        |t              r	 |j!                  |j"                         y 	 t        j                  t        j(                   dt        j
                   ddi       y # t$        $ rM}|j                  j'                          t        j                  |j                  |            |_        Y d }~y d }~ww xY w)Nz[http_event_received]: rn   r   rs   zDOING NOTHING)r   r   r   rx   YELLOWrz   get_or_make_receiverr   r_   
isinstancer&   asyncioensure_futurerZ   rU   r$   r   r   r}   r   ry   )r4   eventreceivercreated_newr   s        r6   http_event_receivedzHttp3.http_event_received5  s   {{m2}}oeWVZZL2"	

 !% 9 9% @+h/e_-+%33HLLNCHO|,I%%ejj1
 LL::,mFJJ<8"A&  I&&(")"7"7Q"HIs   =D 	E+AE&&E+c                d   t        |t              rn|j                  | j                  vrV| j	                  |      }t        | j                  | j                  |      }||_        || j                  |j                  <   |dfS t        || j                  t        |               }| j                  |   dfS )NTF)r   r&   r   r   _make_requestr_   rW   r5   r   getattrHANDLER_PROPERTY_MAPPINGtype)r4   r   rX   r   idents        r6   r   zHttp3.get_or_make_receiverM  s    uo.t~~5((/G#DMM4=='JH%GN.6DNN5??+T>!E4#@#@e#MNE>>%(%//r8   c                     | j                   |   S r3   )r   )r4   r   s     r6   get_receiver_by_stream_idzHttp3.get_receiver_by_stream_id\  s    ~~i((r8   c           	        	 t        d |j                  D              }|d   }|d   }|j	                  dd      }|j	                  dd      }|r||d<   	 |j                  d	      }t        | j                        }| j                  j                  ||d||| j                  j                  d      }	t        |      |	_        |j                  |	_        ||	_        |	S # t        $ r t        d      w xY w# t        $ r t        d
      w xY w)Nc              3  h   K   | ]*  \  }}|j                  d       |j                  d      f , yw)ASCIIsurrogateescape)errorsN)r   ).0kvs      r6   	<genexpr>z&Http3._make_request.<locals>.<genexpr>b  s6      1 XXg&8I(JKs   02z2Header names may only contain US-ASCII characters.z:methodz:pathz:scheme z
:authorityhostr   z)URL may only contain US-ASCII characters.3r8   )r   r   UnicodeDecodeErrorr   r   r   UnicodeEncodeErrorr/   r5   request_classrF   r   	conn_infor   
_stream_id_scheme)
r4   r   r   ru   r   scheme	authority	url_bytes	transportrX   s
             r6   r   zHttp3._make_request_  s!   
	 %G #wY+KKb1	'GFO	JG,I #4==1	----MM
 %Y/"__ ? " 	D 	 " 	JHII	Js   C C1 C.1DN)r5   r-   rW   zCallable[[], None]rK   r\   )r   r%   rK   r\   )r   r%   rK   zTuple[Receiver, bool])r   intrK   rT   )r   r&   rK   r+   )rM   rN   rO   rP   HTTP3_AVAILABLEr$   r&   r#   r'   r   r7   r   r   r   r   rR   r8   r6   r   r   !  sY    H+[i*L	$
 11 %1 
	100)'r8   r   c                  (    e Zd ZdZddZddZddZy)	SessionTicketStorez5
    Simple in-memory store for session tickets.
    c                    i | _         y r3   )ticketsr:   s    r6   r7   zSessionTicketStore.__init__  s	    35r8   c                6    || j                   |j                  <   y r3   )r   ticket)r4   r   s     r6   addzSessionTicketStore.add  s    &,V]]#r8   c                :    | j                   j                  |d       S r3   )r   r   )r4   labels     r6   r   zSessionTicketStore.pop  s    ||t,,r8   Nr   )r   r)   rK   r\   )r   r   rK   zOptional[SessionTicket])rM   rN   rO   rP   r7   r   r   rR   r8   r6   r   r     s    6--r8   r   c                   t        |t              rt        t        |j                  d         }| j
                  j                  t        j                  u rt        d      t        |t              st        d      t        t        t        z   dgz   dd      }| j
                  j                  xs d }|j                  |j                  d   |j                  d	   |
       |S )Nr   zSorry, you cannot currently use trustme as a local certificate generator for an HTTP/3 server. This is not yet supported. You should be able to use mkcert instead. For more information, see: https://github.com/aiortc/aioquic/issues/295.z!SSLContext is not SanicSSLContextsiduckFi   )alpn_protocols	is_clientmax_datagram_frame_sizecertkey)password)r   r   r   r   sanic_selectconfigLOCAL_CERT_CREATORr   TRUSTMEr   r(   r!   r   TLS_CERT_PASSWORDload_cert_chainsanic)rF   rH   r   r   s       r6   
get_configr     s     #|$?C$4$4Q$78
zz$$(8(@(@@<
 	
 c?+@AA(H:5 %F
 zz++3tH
		&399U+h   Mr8   )rF   r*   rH   z0Union[SanicSSLContext, CertSelector, SSLContext])N
__future__r   r   abcr   r   rH   r   typingr   r   r	   r
   r   r   r   r   r   sanic.compatr   sanic.constantsr   sanic.exceptionsr   r   r   r   sanic.helpersr   sanic.http.constantsr   sanic.http.streamr   sanic.http.tls.contextr   r   	sanic.logr   r   sanic.models.protocol_typesr   sanic.models.server_typesr   aioquic.h0.connectionr   r    aioquic.h3.connectionr!   r"   aioquic.h3.eventsr#   r$   r%   r&   r'   aioquic.quic.configurationr(   aioquic.tlsr)   r   ModuleNotFoundErrorr   r*   sanic.requestr+   sanic.responser,   $sanic.server.protocols.http_protocolr-   HttpConnectionr/   rT   r_   r   r   r   r   r   rR   r8   r6   <module>r     s   "  # 
 
 
   ,  + & $ @ $ 9 .;;  =)O %/B<56N& 0s k$8V k$\ 8 e eP- -	EM  Os   6,D D"!D"