
    F jRL                    d   S SK J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J	r	  S SK
JrJrJr  S SKJr  S SKrS SKJrJr  S SKJr  S S	KJr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$  S SK%J&r&J'r'J(r(J)r)J*r*J+r+  S SK,J-r-   " S S\.5      r/ " S S5      r0 " S S\Rb                  5      r2g)    )annotationsN)TimerHandle)BytesIOStringIO)AnyLiteralcast)unquote)ConnectionTypeevents)ConnectionState)	ExtensionPerMessageDeflate)LocalProtocolErrorRemoteProtocolError)ASGI3ApplicationASGISendEventWebSocketEventWebSocketReceiveEventWebSocketScope)Config)TRACE_LOG_LEVEL)ClientDisconnectedget_client_addrget_local_addrget_path_with_query_stringget_remote_addris_ssl)ServerStatec                      \ rS rSrSrSrg)FrameTooLargeError    zERaised when accumulated websocket message bytes exceed `ws_max_size`. N)__name__
__module____qualname____firstlineno____doc____static_attributes__r#       Sc:\Py\emelo-reg\venv\Lib\site-packages\uvicorn/protocols/websockets/wsproto_impl.pyr!   r!       s    Or*   r!   c                  <    \ rS rSrSS jrS	S jrS
S jrSS jrSrg)WebsocketBuffer$   c                ,    S U l         SU l        Xl        g Nr   )valuelength
max_length)selfr3   s     r+   __init__WebsocketBuffer.__init__%   s    04
$r*   c                   U R                   c8  [        U[        R                  5      (       a
  [	        5       O	[        5       U l         U R                   R                  UR                  5        U =R                  [        U[        R                  5      (       a#  [        UR                  R                  5       5      O[        UR                  5      -  sl        U R                  U R                  :  a  [        eg N)r1   
isinstancer   TextMessager   r   writedatar2   lenencoder3   r!   r4   events     r+   extendWebsocketBuffer.extend*   s    ::'1%9K9K'L'LRYR[DJ

$:eVEWEW3X3Xs5::,,./^abgblbl^mm;;($$ )r*   c                     S U l         SU l        g r0   )r1   r2   r4   s    r+   clearWebsocketBuffer.clear3   s    
r*   c                    [        U R                  [        5      (       a  SU R                  R                  5       S.$ [        U R                  [        5      (       d   eSU R                  R                  5       S.$ )Nzwebsocket.receive)typetext)rH   bytes)r9   r1   r   getvaluer   rD   s    r+   
to_messageWebsocketBuffer.to_message7   sZ    djj(++/9L9L9NOO$**g....+djj6I6I6KLLr*   )r2   r3   r1   N)r3   intreturnNoner@   z(events.TextMessage | events.BytesMessagerO   rP   rO   rP   )rO   r   )	r$   r%   r&   r'   r5   rA   rE   rL   r)   r#   r*   r+   r-   r-   $   s    %
%Mr*   r-   c                     \ rS rSr S         SS jjrSS jrSS jrS S jrS!S jrS S jr	S S	 jr
S S
 jrS S jrS"S jrS#S jrS$S jrS%S jrS&S jrS'S jrS S jrS S jrS S jrS S jrS S jrS S jrS S jrS(S jrS)S jrSrg)*
WSProtocol>   Nc                   UR                   (       d  UR                  5         Xl        [        [        UR
                  5      U l        U=(       d    [        R                  " 5       U l	        [        R                  " S5      U l        UR                  U l        X0l        UR                  U l        UR                   U l        UR"                  U l        S U l        S U l        S U l        S U l        [        R,                  " 5       U l        SU l        SU l        SU l        [6        R8                  " [:        R<                  S9U l        SU l         [        RB                  " 5       U l"        U RD                  RG                  5         URH                  U l%        URL                  U l'        S U l(        S U l)        S U l*        SU l+        SU l,        [[        U R                  R\                  5      U l/        g )Nzuvicorn.errorF)connection_type        )0loadedloadconfigr	   r   
loaded_appappasyncioget_event_looplooplogging	getLoggerlogger	root_path	app_stateconnectionstasksdefault_headers	transportserverclientschemeQueuequeuehandshake_complete
close_sentresponse_startedwsprotoWSConnectionr   SERVERconnread_pausedEventwritablesetws_ping_intervalping_intervalws_ping_timeoutping_timeout
ping_timer
pong_timerpending_ping_payloadping_sent_atlast_ping_rttr-   ws_max_sizebuffer)r4   r[   server_statere   _loops        r+   r5   WSProtocol.__init__?   sq    }}KKM(&*;*;<5W335	''8))" (33!''
+;; -159.2,0 5<MMO
"' !&((9N9NO	  $44"22.2.226!#&$' &dkk&=&=>r*   c                |   U R                   R                  U 5        Xl        [        U5      U l        [        U5      U l        [        U5      (       a  SOSU l        U R                  R                  [        ::  aD  U R                  (       a  SU R                  -  OSnU R                  R                  [        SU5        g g )Nwssws%s:%d -  z%sWebSocket connection made)rf   addri   r   rj   r   rk   r   rl   rc   levelr   log)r4   ri   prefixs      r+   connection_madeWSProtocol.connection_madew   s    T""$Y/%i0%i00ed;;/15Z$++-"FKKOOO-JFS 0r*   c                   U R                  5         U R                  (       a  SOSnU R                  R                  SUS.5        U R                  R                  U 5        U R                  R                  [        ::  aC  U R                  (       a  SU R                  -  OSnU R                  R                  [        SU5        SU l        Uc  U R                  R                  5         g g )	Ni    websocket.disconnectrH   coder   r   z%sWebSocket connection lostT)stop_keepalivero   rn   
put_nowaitrf   removerc   r   r   rk   r   ri   close)r4   excr   r   s       r+   connection_lostWSProtocol.connection_lost   s    ..tD

'=tLM%;;/15Z$++-"FKKOOO-JFS"&;NN  " r*   c                    g r8   r#   rD   s    r+   eof_receivedWSProtocol.eof_received   s    r*   c                :    U R                   R                  U5        U R                  5         g ! [         ab  nU R                  R                  U R                   R                  UR                  5      5        U R                  R                  5          S nAg S nAff = fr8   )	ru   receive_datahandle_eventsr   ri   r;   send
event_hintr   )r4   r<   errs      r+   data_receivedWSProtocol.data_received   so    	!II""4(   # 	#NN  !?@NN  ""	#s   . 
BABBc                   U R                   R                  5        GH"  nU R                  (       a    g [        U[        R                  5      (       a  U R                  U5        MI  [        U[        R                  [        R                  45      (       a  U R                  U5        M  [        U[        R                  5      (       a  U R                  U5        M  [        U[        R                  5      (       a  U R                  U5        M  [        U[        R                  5      (       d  GM  U R                  U5        GM%     g r8   )ru   r   rp   r9   Requesthandle_connectr:   BytesMessagehandle_messageCloseConnectionhandle_closePinghandle_pingPonghandle_pongr?   s     r+   r   WSProtocol.handle_events   s    YY%%'E%00##E*EF$6$68K8K#LMM##E*E6#9#9::!!%(E6;;//  'E6;;//  ' (r*   c                8    U R                   R                  5         g)zL
Called by the transport when the write buffer exceeds the high water mark.
N)rx   rE   rD   s    r+   pause_writingWSProtocol.pause_writing   s     	r*   c                8    U R                   R                  5         g)zO
Called by the transport when the write buffer drops below the low water mark.
N)rx   ry   rD   s    r+   resume_writingWSProtocol.resume_writing   s     	r*   c                z   U R                  5         U R                  (       ap  U R                  R                  SSS.5        U R                  R                  [        R                  R                  SS95      nU R                  R                  U5        OU R                  5         U R                  R                  5         g )Nr   i  r   )r   )r   ro   rn   r   ru   r   rr   r   r   ri   r;   send_500_responser   )r4   outputs     r+   shutdownWSProtocol.shutdown   s    ""JJ!!+A4"PQYY^^GNN$B$B$B$MNFNN  (""$r*   c                :    U R                   R                  U5        g r8   )rg   discard)r4   tasks     r+   on_task_completeWSProtocol.on_task_complete   s    

4 r*   c                   SUR                   R                  5       4/nX!R                   VVs/ s H  u  p4UR                  5       U4PM     snn-  nUR                  R                  S5      u  pVn[        U5      nU R                  U-   n	U R                  R                  S5      UR                  S5      -   n
SU R                  R                  SS.SU R                  U R                  U R                  U R                  U	U
UR                  S5      UUR                  U R                  R                  5       S0 0S	.U l        U R"                  R%                  S
S05        U R&                  R)                  U R+                  5       5      nUR-                  U R.                  5        U R0                  R3                  U5        g s  snnf )Ns   host?ascii	websocketz2.4)versionspec_versionz1.1zwebsocket.http.response)rH   asgihttp_versionrl   rj   rk   rd   pathraw_pathquery_stringheaderssubprotocolsstate
extensionsrH   zwebsocket.connect)hostr>   extra_headerslowertarget	partitionr
   rd   r[   asgi_versionrl   rj   rk   r   re   copyscopern   r   r`   create_taskrun_asgiadd_done_callbackr   rg   r   )r4   r@   r   keyr1   r   _r   r   	full_pathfull_raw_pathr   s               r+   r   WSProtocol.handle_connect   sn   UZZ..012;N;NO;NZSSYY[%(;NOO$)LL$:$:3$?!\x NNT)	--g69QQ $ 8 8%P!kkkkkk%(//8!..^^((*4b9&

  	

v':;<yy$$T]]_5t445

t1 Ps   F;c           
         U R                   R                  U5        UR"                  (       a  U R                  R                  U R                   R%                  5       5        U R                   R'                  5         U R(                  (       d"  SU l        U R                  R+                  5         g g g ! [         a    SU l        SU R                  R
                   S3nU R                  R                  SSUS.5        U R                  R                  5       (       dj  U R                  R                  U R                  R                  [        R                  R                  SUS95      5        U R                  R!                  5          g f = f)NTz"Message exceeds the maximum size (z bytes)r   i  rH   r   reasonr   r   )r   rA   r!   rp   r[   r   rn   r   ri   
is_closingr;   ru   r   rr   r   r   r   message_finishedrL   rE   rv   pause_reading)r4   r@   r   s      r+   r   WSProtocol.handle_message   s&   		KKu% !!JJ!!$++"8"8":;KK###' ,,. $ " " 	"DO9$++:Q:Q9RRYZFJJ!!+A4[a"bc>>,,..$$TYY^^GNN4R4RX\ek4R4l%mn$$&	s   B0 0CFFc                r   U R                   R                  [        R                  :X  aB  U R                  R                  U R                   R                  UR                  5       5      5        U R                  R                  SUR                  UR                  S.5        U R                  R                  5         g )Nr   r   )ru   r   r   REMOTE_CLOSINGri   r;   r   responsern   r   r   r   r   r?   s     r+   r   WSProtocol.handle_close   ss    99??o<<<NN  0@!AB

'=uzz]b]i]ijkr*   c                    U R                   R                  U R                  R                  UR	                  5       5      5        g r8   )ri   r;   ru   r   r   r?   s     r+   r   WSProtocol.handle_ping   s(    TYY^^ENN,<=>r*   c                J   U R                   b#  [        UR                  5      U R                   :w  a  g U R                  R	                  5       U R
                  -
  U l        S U l         U R                  b2  U R                  R                  5         S U l        U R                  5         g g r8   )
r   rJ   payloadr`   timer   r   r   cancelschedule_pingr?   s     r+   r   WSProtocol.handle_pong   s    $$,emm0DHaHa0a!YY^^-0A0AA$(! ??&OO""$"DO  'r*   c                b    U R                   b"  U R                   S:  a  U R                  5         g g g r0   )r{   r   rD   s    r+   start_keepaliveWSProtocol.start_keepalive  s0    )d.@.@1.D  /E)r*   c                    U R                   b!  U R                   R                  5         S U l         U R                  b!  U R                  R                  5         S U l        S U l        g r8   )r~   r   r   r   rD   s    r+   r   WSProtocol.stop_keepalive  sL    ??&OO""$"DO??&OO""$"DO$(!r*   c                    U R                   c   e[        SU R                   U R                  -
  5      nU R                  R	                  XR
                  5      U l        g )NrX   )r{   maxr   r`   
call_latersend_keepalive_pingr~   )r4   delays     r+   r   WSProtocol.schedule_ping  sM    !!---C++d.@.@@A))..u6N6NOr*   c                j   S U l         U R                  (       d  U R                  R                  5       (       a  g [        R
                  " S[        R                  " S5      5      U l        U R                  R                  5       U l        U R                  R                  U R                  R                  [        R                   R#                  U R                  S95      5        U R$                  b6  U R                  R'                  U R$                  U R(                  5      U l        g U R-                  5         g )Nz!Ir"   )r   )r~   rp   ri   r   structpackrandomgetrandbitsr   r`   r   r   r;   ru   r   rr   r   r   r}   r   keepalive_timeoutr   r   rD   s    r+   r  WSProtocol.send_keepalive_ping  s    ??dnn7799$*KKf6H6H6L$M! IINN,TYY^^GNN,?,?HaHa,?,bcd("ii2243D3DdF\F\]DO r*   c           	     *   S U l         S U l        U R                  (       d  U R                  R	                  5       (       a  g U R
                  R                  [        ::  aC  U R                  (       a  SU R                  -  OSnU R
                  R                  [        SU5        SnU R                  R                  U R                  R                  [        R                  R                  SUS95      5        SU l        U R                  R!                  5         g )Nr   r   z"%sWebSocket keepalive ping timeoutzkeepalive ping timeouti  r   T)r   r   rp   ri   r   rc   r   r   rk   r   r;   ru   r   rr   r   r   r   )r4   r   r   s      r+   r	  WSProtocol.keepalive_timeout,  s    $(!??dnn7799;;/15Z$++-"FKKOOO-QSYZ)TYY^^GNN,J,JPT]c,J,defr*   c                h   U R                   (       d  U R                  (       a  g / SQnU R                  R                  [        R
                  R                  SUSS95      nX R                  R                  [        R
                  R                  SS95      -  nU R                  R                  U5        g )N))s   content-types   text/plain; charset=utf-8)s
   connections   close)s   content-lengths   21i  Tstatus_coder   has_bodys   Internal Server Errorr<   )
rq   ro   ru   r   rr   r   RejectConnection
RejectDatari   r;   )r4   r   r   s      r+   r   WSProtocol.send_500_response9  s      D$;$;.

  ? ?CY`ko ? pq))..!:!:@X!:!YZZV$r*   c                  #     U R                  U R                  U R                  U R                  5      I S h  vN nU R                  (       d,  U R
                  R                  S5        U R                  5         OUb  U R
                  R                  SU5        U R                  R                  5         g  N{! [         a     N)[         a.    U R
                  R                  S5        U R                  5          N_f = f7f)Nz4ASGI callable returned without completing handshake.z4ASGI callable should return None, but returned '%s'.zException in ASGI application
)r]   r   receiver   ro   rc   errorr   r   BaseException	exceptionri   r   )r4   results     r+   r   WSProtocol.run_asgiE  s     	b88DJJdiiHHF **!!"XY&&(#!!"XZ`a I! 	 	%KK!!"CD""$	%sD   C<4B6 B4B6 A7C<4B6 6
C9 C<4C96C<8C99C<c                .  #    U R                   R                  5       I S h  vN   U R                  (       Gd  US   S:X  Ga=  U R                  R	                  S[        U R                  5      [        U R                  5      5        UR                  S5      nU R                  [        UR                  S/ 5      5      -   n/ nU R                  R                  (       a  UR                  [        5       5        U R                  R!                  5       (       dk  SU l        U R"                  R%                  [&        R(                  R+                  UUUS95      nU R                  R-                  U5        U R/                  5         g g US   S:X  a  U R0                  R3                  S	S
S.5        U R                  R	                  S[        U R                  5      [        U R                  5      5        SU l        SU l        [(        R6                  " S/ S9nU R"                  R%                  U5      nU R                  R-                  U5        U R                  R9                  5         g US   S:X  a  SUS   s=::  a  S:  d  O  Sn[;        XqS   -  5      eU R                  R	                  S[        U R                  5      [        U R                  5      US   5        SU l        [(        R6                  " US   [        US   5      SS9nU R"                  R%                  U5      nU R                  R-                  U5        SU l        g [;        SUS    S35      eU R4                  (       Gd  U R<                  (       Gd   US   S:X  a  UR                  S5      nUR                  S5      n	Uc  U	OUn
U R"                  R%                  [&        R(                  R?                  U
S95      nU R                  R!                  5       (       d  U R                  R-                  U5        g g US   S:X  a  SU l        UR                  SS5      nUR                  SS5      =(       d    SnU R0                  R3                  S	XS .5        U R"                  R%                  [&        R(                  RA                  XS!95      nU R                  R!                  5       (       d6  U R                  R-                  U5        U R                  R9                  5         g g [;        S"US    S35      eU R<                  (       a  US   S#:X  a  UR                  S$S%5      (       + n[(        RF                  " US&   US'9nU R"                  R%                  U5      nU R                  R-                  U5        U(       a@  U R0                  R3                  S	S
S.5        SU l        U R                  R9                  5         g g [;        S(US    S35      e[;        S)US    S*35      e GN! [B         a  n[D        UeS nAff = f7f)+NrH   zwebsocket.acceptz%s - "WebSocket %s" [accepted]subprotocolr   T)r  r   r   zwebsocket.closer   r   r   z%s - "WebSocket %s" 403i  )r  r   zwebsocket.http.response.startd   statusiX  z*Invalid HTTP status code '%d' in response.z%s - "WebSocket %s" %dr  zhExpected ASGI message 'websocket.accept', 'websocket.close' or 'websocket.http.response.start' but got 'z'.zwebsocket.sendrJ   rI   r  r   i  r   r   r   r   zFExpected ASGI message 'websocket.send' or 'websocket.close', but got 'zwebsocket.http.response.body	more_bodyFbody)r<   body_finishedz>Expected ASGI message 'websocket.http.response.body' but got 'zUnexpected ASGI message 'z#', after sending 'websocket.close'.)$rx   waitro   rc   infor   r   r   getrh   listr[   ws_per_message_deflateappendr   ri   r   ru   r   rr   r   AcceptConnectionr;   r   rn   r   rp   r  r   RuntimeErrorrq   Messager   r   r   r  )r4   messager  r   r   r   r@   msg
bytes_data	text_datar<   r   r   r   r"  reject_datas                   r+   r   WSProtocol.sendU  s7    mm  """&&&v"44  4#DJJ/.tzz:
 &kk-8 $ 4 4tGKK	SU<V7W W.0
;;55%%&7&9:~~0022.2D+!YY^^77(3'1*7 8 F NN((0((* 3 $55

%%/Et&TU  -#DJJ/.tzz:
 +/'"&//CL.$$V,$$&$CCwx0636FC&sX->'>??  ,#DJJ/.tzz:H%	 +/'// ' 1 !34!
 .$$V,(,% #CCJ6?BSSUW 
 )>)>)>26?&66!(W!5J 'F 3I(2(:9
D!YY^^GNN,B,B,B,MNF>>4466,,V4 7 V_(99&*DO";;vt4D$[[26<"FJJ))3ISW*jk!YY^^GNN,J,JPT,J,deF>>4466,,V4,,. 7
 '`ahioap`qqst 
 ""v"@@$+KKU$C C$//WV_Tab4$$V, JJ))3ISW*XY&*DONN((* ! #%cdklrdscttv#wxx !:76?:KKnopp[ 	#v & 2(c12sO   XW9MX1B"W< XC%W< :X<W< C,X<
XXXXc                   #    U R                   R                  5       I S h  vN nU R                  (       a@  U R                   R                  5       (       a!  SU l        U R                  R                  5         U$  NW7f)NF)rn   r%  rv   emptyri   resume_reading)r4   r,  s     r+   r  WSProtocol.receive  sU     

((

 0 0 2 2$DNN))+	 )s   A:A8AA:)r]   re   r   rk   rp   r[   ru   rf   rh   ro   r   rc   r`   r   r{   r   r}   r~   r   rn   rv   rq   rd   rl   r   rj   rg   ri   rx   r8   )
r[   r   r   r   re   zdict[str, Any]r   z asyncio.AbstractEventLoop | NonerO   rP   )ri   zasyncio.TransportrO   rP   )r   zException | NonerO   rP   rR   )r<   rJ   rO   rP   )r   zasyncio.Task[None]rO   rP   )r@   zevents.RequestrO   rP   rQ   )r@   zevents.CloseConnectionrO   rP   )r@   zevents.PingrO   rP   )r@   zevents.PongrO   rP   )r,  r   rO   rP   )rO   r   )r$   r%   r&   r'   r5   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r	  r   r   r   r  r)   r#   r*   r+   rT   rT   >   s     374?4? "4? "	4?
 04? 
4?p	T#!(!
8/$?!!)P
!
% nq`r*   rT   )3
__future__r   r^   ra   r  r  r   ior   r   typingr   r   r	   urllib.parser
   rr   r   r   wsproto.connectionr   wsproto.extensionsr   r   wsproto.utilitiesr   r   uvicorn._typesr   r   r   r   r   uvicorn.configr   uvicorn.loggingr   uvicorn.protocols.utilsr   r   r   r   r   r   uvicorn.serverr   	Exceptionr!   r-   ProtocolrT   r#   r*   r+   <module>rD     s{    "        % %    * . ; E q q ! +  'P PM M4L!! Lr*   