
    h<                       d dl mZ d dlZd dlZd dlmZmZmZ 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 d dlmZ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'm(Z(m)Z) d dl*m+Z+  G d dejX                        Z-y)    )annotationsN)AnyLiteralcast)unquote)ConnectionTypeevents)ConnectionState)	ExtensionPerMessageDeflate)LocalProtocolErrorRemoteProtocolError)	ASGI3ApplicationASGISendEventWebSocketAcceptEventWebSocketCloseEventWebSocketEventWebSocketResponseBodyEventWebSocketResponseStartEventWebSocketScopeWebSocketSendEvent)Config)TRACE_LOG_LEVEL)ClientDisconnectedget_client_addrget_local_addrget_path_with_query_stringget_remote_addris_ssl)ServerStatec                      e Z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
dd
ZddZddZddZddZddZd dZddZddZd!dZd"dZy)#
WSProtocolNc                   |j                   s|j                          || _        t        t        |j
                        | _        |xs t        j                         | _	        t        j                  d      | _        |j                  | _        || _        |j                  | _        |j                   | _        |j"                  | _        d | _        d | _        d | _        d | _        t        j,                         | _        d| _        d| _        d| _        t7        j8                  t:        j<                        | _        d| _         t        jB                         | _"        | jD                  jG                          d| _$        d| _%        y )Nzuvicorn.errorF)connection_type     )&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bytestext)selfr)   server_stater3   _loops        ND:\jyotish\venv\Lib\site-packages\uvicorn/protocols/websockets/wsproto_impl.py__init__zWSProtocol.__init__'   s)    }}KKM(&*;*;<5W335	''8))" (33!''
+;; -1.2.2,0 5<MMO
"' !&((9N9NO	  
	r%   c                h   | j                   j                  |        || _        t        |      | _        t        |      | _        t        |      rdnd| _        | j                  j                  t        k  r?| j                  rd| j                  z  nd}| j                  j                  t        d|       y y )Nwssws%s:%d - r&   z%sWebSocket connection made)r4   addr7   r   r8   r   r9   r   r:   r1   levelr   log)rJ   r7   prefixs      rM   connection_madezWSProtocol.connection_madeW   s     	T""$Y/%i0%i0ed;;/15Z$++-"FKKOOO-JFS 0r%   c                   | j                   rdnd}| j                  j                  d|d       | j                  j	                  |        | j
                  j                  t        k  r>| j                  rd| j                  z  nd}| j
                  j                  t        d|       d| _         || j                  j                          y y )	Ni    websocket.disconnecttypecoderR   r&   z%sWebSocket connection lostT)r=   r<   
put_nowaitr4   remover1   rT   r   r9   rU   r7   close)rJ   excr]   rV   s       rM   connection_lostzWSProtocol.connection_lostd   s    ..tD

'=tLM%;;/15Z$++-"FKKOOO-JFS"&;NN  " r%   c                     y N rJ   s    rM   eof_receivedzWSProtocol.eof_receivedq   s    r%   c                8   	 | j                   j                  |       | j                          y # t        $ rb}| j                  j                  | j                   j                  |j                               | j                  j                          Y d }~y d }~ww xY wrd   )	rC   receive_datahandle_eventsr   r7   writesend
event_hintr`   )rJ   dataerrs      rM   data_receivedzWSProtocol.data_receivedt   so    	!II""4(   # 	#NN  !?@NN  ""	#s   . 	BABBc                   | j                   j                         D ]  }t        |t        j                        r| j	                  |       /t        |t        j
                        r| j                  |       [t        |t        j                        r| j                  |       t        |t        j                        r| j                  |       t        |t        j                        s| j                  |        y rd   )rC   r	   
isinstanceRequesthandle_connectTextMessagehandle_textBytesMessagehandle_bytesCloseConnectionhandle_closePinghandle_pingrJ   events     rM   rj   zWSProtocol.handle_events~   s    YY%%'E%0##E*E6#5#56  'E6#6#67!!%(E6#9#9:!!%(E6;;/  ' (r%   c                8    | j                   j                          y)z\
        Called by the transport when the write buffer exceeds the high water mark.
        N)rF   clearrf   s    rM   pause_writingzWSProtocol.pause_writing   s     	r%   c                8    | j                   j                          y)z_
        Called by the transport when the write buffer drops below the low water mark.
        N)rF   rG   rf   s    rM   resume_writingzWSProtocol.resume_writing   s     	r%   c                V   | j                   rs| j                  j                  ddd       | j                  j	                  t
        j                  j                  d            }| j                  j                  |       n| j                          | j                  j                          y )NrZ   i  r[   )r]   )r=   r<   r^   rC   rl   r@   r	   ry   r7   rk   send_500_responser`   )rJ   outputs     rM   shutdownzWSProtocol.shutdown   su    ""JJ!!+A4"PQYY^^GNN$B$B$B$MNFNN  (""$r%   c                :    | j                   j                  |       y rd   )r5   discard)rJ   tasks     rM   on_task_completezWSProtocol.on_task_complete   s    

4 r%   c                   d|j                   j                         fg}||j                  D cg c]  \  }}|j                         |f c}}z  }|j                  j                  d      \  }}}t        |      }| j                  |z   }	| j                  j                  d      |j                  d      z   }
d| j                  j                  ddd| j                  | j                  | j                  | j                  |	|
|j                  d      ||j                  | j                  j                         di id	| _        | j"                  j%                  d
di       | j&                  j)                  | j+                               }|j-                  | j.                         | j0                  j3                  |       y c c}}w )Ns   host?ascii	websocketz2.4)versionspec_versionz1.1zwebsocket.http.response)r\   asgihttp_versionr:   r8   r9   r2   pathraw_pathquery_stringheaderssubprotocolsstate
extensionsr\   zwebsocket.connect)hostencodeextra_headerslowertarget	partitionr   r2   r)   asgi_versionr:   r8   r9   r   r3   copyscoper<   r^   r.   create_taskrun_asgiadd_done_callbackr   r5   rS   )rJ   r~   r   keyvaluer   _r   r   	full_pathfull_raw_pathr   s               rM   rt   zWSProtocol.handle_connect   st   UZZ..0125;N;NO;NZS%SYY[%(;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                   | xj                   |j                  z  c_         |j                  r^| j                  j	                  d| j                   d       d| _         | j
                  s"d| _        | j                  j                          y y y )Nwebsocket.receive)r\   rI   r&   T)rI   rn   message_finishedr<   r^   rD   r7   pause_readingr}   s     rM   rv   zWSProtocol.handle_text   sk    		UZZ	!!JJ!!+>		"RSDI###' ,,. $ "r%   c                   | xj                   |j                  z  c_         |j                  r^| j                  j	                  d| j                   d       d| _         | j
                  s"d| _        | j                  j                          y y y )Nr   )r\   rH   r%   T)rH   rn   r   r<   r^   rD   r7   r   r}   s     rM   rx   zWSProtocol.handle_bytes   sk    

ejj 
!!JJ!!+>"TUDJ###' ,,. $ "r%   c                p   | j                   j                  t        j                  k(  rB| j                  j                  | j                   j                  |j                                      | j                  j                  d|j                  |j                  d       | j                  j                          y )NrZ   r\   r]   reason)rC   r   r
   REMOTE_CLOSINGr7   rk   rl   responser<   r^   r]   r   r`   r}   s     rM   rz   zWSProtocol.handle_close   ss    99??o<<<NN  0@!AB

'=uzz]b]i]ijkr%   c                    | j                   j                  | j                  j                  |j	                                      y rd   )r7   rk   rC   rl   r   r}   s     rM   r|   zWSProtocol.handle_ping   s(    TYY^^ENN,<=>r%   c                b   | j                   s| j                  ry g d}| j                  j                  t        j
                  j                  d|d            }|| j                  j                  t        j
                  j                  d            z  }| j                  j                  |       y )N))s   content-types   text/plain; charset=utf-8)s
   connections   close)s   content-lengths   21i  Tstatus_coder   has_bodys   Internal Server Errorrn   )
r?   r=   rC   rl   r@   r	   RejectConnection
RejectDatar7   rk   )rJ   r   r   s      rM   r   zWSProtocol.send_500_response   s      D$;$;.

  ? ?CY`ko ? pq$))..!:!:@X!:!YZZV$r%   c                  K   	 | j                  | j                  | j                  | j                         d {   }| j                  sF| j
                  j                  d       | j                          | j                  j                          y |7| j
                  j                  d|       | j                  j                          y y 7 # t        $ r | j                  j                          Y y t        $ rH | j
                  j                  d       | j                          | j                  j                          Y y w xY ww)Nz4ASGI callable returned without completing handshake.z4ASGI callable should return None, but returned '%s'.zException in ASGI application
)r+   r   receiverl   r=   r1   errorr   r7   r`   r   BaseException	exception)rJ   results     rM   r   zWSProtocol.run_asgi   s     	'88DJJdiiHHF **!!"XY&&($$&#!!"XZ`a$$& $ I! 	#NN  " 	#KK!!"CD""$NN  "	#sE   E4C C	C BE	C #E .E0AE =E?E  Ec                (  K   | j                   j                          d {    |d   }| j                  s|dk(  r6t        t        |      }| j
                  j                  dt        | j                        t        | j                               |j                  d      }| j                  t        |j                  dg             z   }g }| j                  j                  r|j                  t!                      | j"                  j%                         s5d| _        | j&                  j)                  t*        j,                  j/                  |||            }| j"                  j1                  |       y |dk(  r| j2                  j5                  d	d
d       | j
                  j                  dt        | j                        t        | j                               d| _        d| _        t-        j8                  dg       }| j&                  j)                  |      }| j"                  j1                  |       | j"                  j;                          y |dk(  rt        t<        |      }d|d   cxk  rdk  sn d}t?        ||d   z        | j
                  j                  dt        | j                        t        | j                        |d          d| _        t-        j8                  |d   t        |d         d      }| j&                  j)                  |      }| j"                  j1                  |       d| _         y d}t?        ||z        y | j6                  s| j@                  s	 |dk(  rt        tB        |      }|j                  d      }	|j                  d      }
|	|
n|	}| j&                  j)                  t*        j,                  jE                  |            }| j"                  j%                         s| j"                  j1                  |       n|dk(  rt        tF        |      }d| _        |j                  dd      }|j                  dd      xs d}| j2                  j5                  d	||d       | j&                  j)                  t*        j,                  jI                  ||             }| j"                  j%                         sG| j"                  j1                  |       | j"                  j;                          nd!}t?        ||z        y y y y | j@                  r|d"k(  rt        d#|      }|j                  d$d%       }t-        jN                  |d&   |'      }| j&                  j)                  |      }| j"                  j1                  |       |rP| j2                  j5                  d	d
d       d| _        | j"                  j;                          y d(}t?        ||z        y d)}t?        ||z        7 # tJ        $ r}tL        |d }~ww xY ww)*Nr\   zwebsocket.acceptz%s - "WebSocket %s" [accepted]subprotocolr   T)r   r   r   zwebsocket.closerZ   rY   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   zlExpected ASGI message 'websocket.accept', 'websocket.close' or 'websocket.http.response.start' but got '%s'.zwebsocket.sendrH   rI   r   r]   i  r   r&   r   )r]   r   zJExpected ASGI message 'websocket.send' or 'websocket.close', but got '%s'.zwebsocket.http.response.bodyr   	more_bodyFbody)rn   body_finishedzBExpected ASGI message 'websocket.http.response.body' but got '%s'.z>Unexpected ASGI message '%s', after sending 'websocket.close'.)(rF   waitr=   r   r   r1   infor   r   r   getr6   listr)   ws_per_message_deflateappendr   r7   
is_closingrC   rl   r@   r	   AcceptConnectionrk   r<   r^   r>   r   r`   r   RuntimeErrorr?   r   Messager   ry   r   r   r   )rJ   messagemessage_typer   r   r   r   r~   msg
bytes_data	text_datarn   r]   r   ra   r   reject_datas                    rM   rl   zWSProtocol.send   s8    mm  """v&&113W=  4#DJJ/.tzz:
 &kk-8 $ 4 4tGKK	SU<V7W W.0
;;55%%&7&9:~~002.2D+!YY^^77(3'1*7 8 F NN((0!22

%%/Et&TU  -#DJJ/.tzz:
 +/'"&//CL.$$V,$$&!@@:GDwx0636FC&sWX->'>??  ,#DJJ/.tzz:H%	 +/'// ' 1 !34!
 .$$V,(,%$ 
 #3#566k 3n )>)>2#33"#5w?G!(W!5J 'F 3I(2(:9
D!YY^^GNN,B,B,B,MNF>>446,,V4!%66"#6@G&*DO";;vt4D$[[26<"FJJ))3ISWci*jk!YY^^GNN,J,JPT]c,J,deF>>446,,V4,,. gC&s\'9::	 / 7 5 7& ""==;WE$+KKU$C C$//WV_Tab4$$V, JJ))3ISW*XY&*DONN((* ["3#566 ! SCs\122m 	#B & 2(c12s6   XW7MX&F*W: C(X:	XX

XXc                   K   | j                   j                          d {   }| j                  r;| j                   j                         r!d| _        | j                  j                          |S 7 Mw)NF)r<   r   rD   emptyr7   resume_reading)rJ   r   s     rM   r   zWSProtocol.receivet  sS     

((

 0 0 2$DNN))+	 )s   A0A.AA0rd   )
r)   r   rK   r    r3   zdict[str, Any]rL   z asyncio.AbstractEventLoop | NonereturnNone)r7   zasyncio.Transportr   r   )ra   zException | Noner   r   )r   r   )rn   rH   r   r   )r   zasyncio.Task[None]r   r   )r~   zevents.Requestr   r   )r~   zevents.TextMessager   r   )r~   zevents.BytesMessager   r   )r~   zevents.CloseConnectionr   r   )r~   zevents.Pingr   r   )r   r   r   r   )r   r   )__name__
__module____qualname__rN   rW   rb   rg   rp   rj   r   r   r   r   rt   rv   rx   rz   r|   r   r   rl   r   re   r%   rM   r"   r"   &   s     37,, ", "	,
 0, 
,`T*T	T#!(!
8//?
%'$w3rr%   r"   ).
__future__r   r,   r/   typingr   r   r   urllib.parser   r@   r   r	   wsproto.connectionr
   wsproto.extensionsr   r   wsproto.utilitiesr   r   uvicorn._typesr   r   r   r   r   r   r   r   r   uvicorn.configr   uvicorn.loggingr   uvicorn.protocols.utilsr   r   r   r   r   r   uvicorn.serverr    Protocolr"   re   r%   rM   <module>r      s`    "   % %    * . ; E
 
 
 " +  'S!! Sr%   