
    wg\j                     ~   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rSSK	r	SSK
Jr  S H  u  rr \" \5      \" 5       \'   M     \R$                  S:X  a  SSKr	SSKJrJr  SS	KJr   " S
 S\R2                  5      r " S S\\5      r " S S5      rg! \ a    S\" 5       \'   \" S\< S\< 35         M  f = f)ap  
Python WebSocket server base with support for "wss://" encryption.
Copyright 2011 Joel Martin
Copyright 2016 Pierre Ossman
Licensed under LGPL version 3 (see docs/LICENSE.LGPL-3)

You can make a cert/key with openssl using:
openssl req -new -x509 -days 365 -nodes -out self.pem -keyout self.pem
as taken from http://docs.python.org/dev/library/ssl.html#certificates

    N)SimpleHTTPRequestHandler))sslzTLS/SSL/wss is disabled)resourcezdaemonizing is disabledzWARNING: no 'z
' module, win32)WebSocketWantReadErrorWebSocketWantWriteError)WebSocketRequestHandlerMixInc                       \ rS rSrS rSrg)CompatibleWebSocket#   c                     SU;   a  gg)Nbinary  )self	protocolss     V/home/edenadmin/noVNC/venv/lib/python3.13/site-packages/websockify/websockifyserver.pyselect_subprotocol&CompatibleWebSocket.select_subprotocol$   s    y     r   N)__name__
__module____qualname____firstlineno__r   __static_attributes__r   r   r   r   r   #   s    r   r   c                     ^  \ rS rSrSrSrSr\r " S S\	5      r
U 4S jrS rSS	 jrS
 rS rS rSS jrS rS S jrS!S jrS!S jrU 4S jrS rU 4S jrU 4S jrS rS rS rU 4S jrU 4S jrU 4S jrS"U 4S jjr Sr!U =r"$ )#WebSockifyRequestHandler,   av  
WebSocket Request Handler Class, derived from SimpleHTTPRequestHandler.
Must be sub-classed with new_websocket_client method definition.
The request handler can be configured by setting optional
attributes on the server object:

* only_upgrade: If true, SimpleHTTPRequestHandler will not be enabled,
  only websocket is allowed.
* verbose: If true, verbose logging is activated.
* daemon: Running as daemon, do not write to console etc
* record: Record raw frame data as JavaScript array into specified filename
* run_once: Handle a single request
* handler_id: A sequence number for this connection, appended to record filename

WebSockifyzHTTP/1.1c                       \ rS rSrSrg)WebSockifyRequestHandler.CCloseB   r   Nr   r   r   r   r   r   r   r   CCloser!   B       r   r$   c                   > [        USS5      U l        [        USS5      U l        [        USS5      U l        [        USS5      U l        [        USS5      U l        S U l        [        USS5      U l        [        USS5      U l        [        US	S5      U l	        [        US
S5      U l
        [        USS5      U l        [        USS 5      U l        U R                  c  [        R                  5       U l        [        TU ]A  XU5        g )Nonly_upgradeFverbosedaemonrecordrun_once
handler_id	file_onlytrafficweb_auth
host_tokenlogger)getattrr'   r(   r)   r*   r+   recr,   r-   r.   r/   r0   r1   WebSockifyServer
get_loggersuper__init__)r   reqaddrserver	__class__s       r   r7   !WebSockifyRequestHandler.__init__E   s    #FNEBvy%8fh6fh6
E:!&,> e<vy%8
E:!&,>fh5;;*557DKF+r   c                     U R                   R                  U R                  S   < SU R                  5       < SX-  < 35        g )Nr   z - - [z] )r1   infoclient_addresslog_date_time_string)r   formatargss      r   log_message$WebSockifyRequestHandler.log_messageY   s3    T-@-@-CTE^E^E`bhbopqr   c                     U R                   (       a>  [        R                  R                  U5        [        R                  R	                  5         gg)zShow traffic flow mode. N)r.   sysstdoutwriteflush)r   tokens     r   print_traffic&WebSockifyRequestHandler.print_traffic`   s0    <<JJU#JJ r   c                     SU R                   -  nU R                  R                  " [        R                  U< U< 3/UQ70 UD6  g)z'Output message with handler_id prefix. % 3d: N)r,   r1   logloggingINFOr   msgrB   kwargsprefixs        r   rS   WebSockifyRequestHandler.msgf   5    DOO+&<NtNvNr   c                     SU R                   -  nU R                  R                  " [        R                  U< U< 3/UQ70 UD6  g)Same as msg() but as debug. rN   N)r,   r1   rO   rP   DEBUGrR   s        r   vmsgWebSockifyRequestHandler.vmsgk   s5    DOO+'=OOOr   c                     SU R                   -  nU R                  R                  " [        R                  U< U< 3/UQ70 UD6  g)Same as msg() but as warning. rN   N)r,   r1   rO   rP   WARNrR   s        r   warnWebSockifyRequestHandler.warnp   rW   r   c                    [        [        R                  " 5       S-  5      U R                  -
  nU(       a  U H  nU R                  (       ai  UR	                  S5      R                  S5      R	                  S5      R                  SS5      nU R                  R                  SR                  X$5      5        U R                  R                  U5        M     U R                  (       ah   U R                  R                  U R                  S   5        U R                  R                  S5        U R                  S5        U R                  (       a  Mh  g! [         a    U R                  S	5         g
f = f)a  Encode and send WebSocket frames. Any frames already
queued will be sent first. If buf is not set then only queued
frames will be sent. Returns True if any frames could not be
fully sent, in which case the caller should call again when
the socket is ready.   latin1unicode_escapeascii'\'z'{{{0}{{{1}',
r   z<.T<F)inttime
start_timer3   decodeencodereplacerH   rA   
send_partsappendrequestsendmsgr   rK   pop)r   bufstdeltabufbufstrs        r   send_frames$WebSockifyRequestHandler.send_framesx   s    TYY[%&888 ZZ1889IJQQRYZbbcfhmnFHHNN#4#;#;F#KL&&s+  oo$$T__Q%78 OO"s# ooo  + ""4(s   &(E E,+E,c                    Sn/ n[        [        R                  " 5       S-  5      U R                  -
  n  U R                  R	                  5       nUc0  U R                  R                  U R                  R                  S.nX!4$ U R                  S5        U R                  (       ai  UR                  S5      R                  S5      R                  S5      R                  S	S
5      nU R                  R                  SR                  X55      5        UR                  U5        U R                  R!                  5       (       d   X!4$ GM  ! [
         a    U R                  S5         X!4$ f = f)zNReceive and decode WebSocket frames.

Returns:
    (bufs_list, closed_string)
Frc   z}.)codereason}rd   re   rf   rg   rh   z'}}{0}}}{1}',
)rj   rk   rl   rr   recvmsgr   rK   
close_codeclose_reasonr3   rm   rn   ro   rH   rA   rq   pending)r   closedru   rv   rw   rx   s         r   recv_frames$WebSockifyRequestHandler.recv_frames   s6    TYY[%&8ll**,
 {"&,,"9"9$(LL$=$=?|#s#xxH-445EFMMgV^^_bdij077GHKK<<''))|1  * ""4(& |+s   E E$#E$c                 X    U R                   R                  [        R                  X5        g)z&Send a WebSocket orderly close frame. N)rr   shutdownsocket	SHUT_RDWR)r   r|   r}   s      r   
send_close#WebSockifyRequestHandler.send_close   s    f..=r   c                 :    U R                   R                  U5        g)zSend a WebSocket pong frame. N)rr   pongr   datas     r   	send_pong"WebSockifyRequestHandler.send_pong       $r   c                 :    U R                   R                  U5        g)zSend a WebSocket ping frame. N)rr   pingr   s     r   	send_ping"WebSockifyRequestHandler.send_ping   r   r   c                 b   > U R                  5         U R                  5         [        TU ]  5         g N)validate_connectionauth_connectionr6   handle_upgrader   r;   s    r   r   'WebSockifyRequestHandler.handle_upgrade   s&      " r   c                 `   SU R                   l        / U l        S U l        [	        [
        R
                  " 5       S-  5      U l        SnSn U R                  S   nU R                  S   nU(       a  SU l	        OSU l	        U R                  S	UU R                  5        U R                  S
:w  a  U R                  SXR                  5        U R                  (       a[  U R                  < SU R                  < 3nU R                  SU5        [        US5      U l        U R                  R!                  S5         U R#                  5         g ! [         a     Nf = f! U R$                   aG    [&        R(                  " 5       u  pEnU R+                  UR,                  S   UR,                  S   5         g f = f)NTrc   r   Fr      zSSL/TLS (wss://)zPlain non-SSL (ws://)z%s: %s WebSocket connection/z%s: Path: '%s'.zopening record file: %szw+zvar VNC_frame_data = [
   )r:   ws_connectionrp   	recv_partrj   rk   rl   r?   
IndexErrorstyperC   pathr*   r,   openr3   rH   new_websocket_clientr$   rF   exc_infor   rB   )r   client_addris_sslfname_excs         r   handle_websocket)WebSockifyRequestHandler.handle_websocket   sd   $(!diik$./ 	--a0K((+F +DJ0DJ6	%99-{IIF;;#{{#0E6>E4(DHHHNN56	6%%'-  		. {{ 	6IAAOOCHHQK!5	6s%   E 5E 
EEAF-,F-c                    > U R                   (       a  U R                  5         U R                  (       a  U R                  S5        g [        TU ]  5         g Ni  )r/   r   r'   
send_errorr6   do_GETr   s    r   r   WebSockifyRequestHandler.do_GET   s5    ==  "OOC GNr   c                 h   > U R                   (       a  U R                  S5        g [        TU ]  U5      $ )Ni  )r-   r   r6   list_directory)r   r   r;   s     r   r   'WebSockifyRequestHandler.list_directory  s&    >>OOC 7)$//r   c                     [        S5      e)2Do something with a WebSockets client connection. zAWebSocketRequestHandler.new_websocket_client() must be overloaded)	Exceptionr   s    r   r   -WebSockifyRequestHandler.new_websocket_client  s    [\\r   c                     g)zBEnsure that the connection has a valid token, and set the target. Nr   r   s    r   r   ,WebSockifyRequestHandler.validate_connection      r   c                     g)z*Ensure that the connection is authorized. Nr   r   s    r   r   (WebSockifyRequestHandler.auth_connection  r   r   c                    > U R                   (       a  U R                  5         U R                  (       a  U R                  S5        g [        TU ]  5         g r   )r/   r   r'   r   r6   do_HEADr   s    r   r    WebSockifyRequestHandler.do_HEAD  s5    ==  "OOC GOr   c                    > U R                   (       a5  U R                   R                  S5        U R                   R                  5         [        TU ]  5         g )Nz'EOF'];
)r3   rH   closer6   finishr   s    r   r   WebSockifyRequestHandler.finish  s2    88HHNN;'HHNNr   c                 f   > U R                   (       a  U R                  5         g [        TU ]  5         g r   )r+   handle_one_requestr6   handler   s    r   r   WebSockifyRequestHandler.handle"  s"     ==##%GNr   c                 H   > U R                   (       a  [        TU ]	  X5        g g r   )r(   r6   log_request)r   r|   sizer;   s      r   r   $WebSockifyRequestHandler.log_request+  s    <<G+ r   )r)   r-   r,   r0   r1   r'   r3   r*   r   r+   rp   rl   r   r.   r(   r/   )r   r   )rc   r   )r   )-r   )#r   r   r   r   __doc__server_versionprotocol_versionr   SocketClassr   r$   r7   rC   rK   rS   r[   r`   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r;   s   @r   r   r   ,   s     "N!%K ,(rO
P
O:#J>  !(6T0], ,r   r   c                       \ rS rSrSrSrSr " S S\5      r " S S\5      r	          SS
 jr
\S 5       r\    SS j5       r\SS j5       rS rS rS rS rS rS rS rS rS rS rS rS rS rS rSrg	) r4   i0  z[
WebSockets server class.
As an alternative, the standard library SocketServer can be used
zY<cross-domain-policy><allow-access-from domain="*" to-ports="*" /></cross-domain-policy>
	websocketc                       \ rS rSrSrg)WebSockifyServer.EClosei:  r   Nr#   r   r   r   ECloser   :  r%   r   r   c                       \ rS rSrSrg)WebSockifyServer.Terminatei=  r   Nr#   r   r   r   	Terminater   =  r%   r   r   Nc                 N   Xl         X`l        X l        UU l        UU l        X0l        X@l        XPl        Xl        UU l	        UU l
        Xl        Xl        UU l        UU l        UU l        UU l        UU l        UU l        [&        R&                  " 5       U l        SU l        SU l        SU l        U R1                  5       U l        UU l        UU l        UU l        UU l        S U l        Xl        [@        RB                  RE                  U5      U l#        S=U l$        =U l%        U l&        U(       a$  [@        RB                  RE                  U5      U l        U(       a$  [@        RB                  RE                  U5      U l$        U(       a$  [@        RB                  RE                  U5      U l%        U(       a$  [@        RB                  RE                  U5      U l&        U RH                  (       a   [@        RN                  " U RH                  5        U RH                  (       + U l(        [R        (       d  U R                  (       a  [U        S5      eU R                  (       a  [V        (       d  [U        S5      eU RY                  S5        U R                  S :w  a  U RY                  S5        OTU R                  S :w  a  U RY                  SU R                  5        O'U RY                  S	U R
                  U R                  5        U RH                  (       aJ  U R"                  (       a  U RY                  S
U RH                  5        OU RY                  SU RH                  5        [R        (       at  [@        RB                  R[                  U RF                  5      (       a4  U RY                  S5        U R                  (       a  U RY                  S5        O#U RY                  S5        OU RY                  S5        U R                  (       a  U RY                  S5        U RJ                  (       a  U RY                  SU RJ                  5        g g )NFr   r   z&No 'ssl' module and SSL-only specifiedz'Module 'resource' required to daemonizezWebSocket server settings:z   - Listen for inetd connectionsz  - Listen on unix socket %sz  - Listen on %s:%sz4  - Web server (no directory listings). Web root: %sz  - Web server. Web root: %sz  - SSL/TLS supportz   - Deny non-SSL/TLS connectionsz%  - No SSL/TLS support (no cert file)z(  - No SSL/TLS support (no 'ssl' module)z  - Backgrounding (daemon)z  - Recording to '%s.*').RequestHandlerClassr(   	listen_fdunix_listenunix_listen_modelisten_hostlisten_portprefer_ipv6ssl_onlyssl_ciphersssl_optionsverify_clientr)   r+   timeoutidle_timeoutr.   r-   r/   rk   launch_timer   r,   terminatingr5   r1   tcp_keepalivetcp_keepcnttcp_keepidletcp_keepintvlkeykey_passwordosr   abspathcertwebr*   cafilechdirr'   r   r   r   rS   exists)r   r   r   r   r   source_is_ipv6r(   r   r   r   r   r   r   r)   r*   r   r/   r-   r+   r   r   r.   r   r   r   r   r   r   r   r   s                                 r   r7   WebSockifyServer.__init__@  s    $7 #*#,#.#3#.#.#1#+#.#.#0#)#+#*#/#*#,#+#'99;#(#$#(#'??#4#0#.#/#0 ( GGOOD)	/1114;wws+DHwws+DH''//&1DK''//&1DK88HHTXX $L st}}DEE;;xxEFF 	-.>>T!HH78%HH3T5E5EFHH*$$d&6&6888~~OQUQYQYZ7B3ww~~dii((./==HH?@@AHH?@;;HH12;;HH.< r   c                      [         R                  " [        R                  < S[        R                  R
                  < 35      $ )Nr   )rP   	getLoggerr4   
log_prefixr;   r   r   r   r   r5   WebSockifyServer.get_logger  s2      ''&&//"1 2 	2r   c                 T   SnU S:X  a  Sn U(       a  U(       d  U(       d  [        S5      eU(       a  [        (       d  [        S5      eU(       d  U(       a  [        S5      eU(       d  U[        R                  -  nU(       Gd  [        R                  " XS[        R
                  [        R                  U5      nU(       d  [        SU -  5      eUR                  S S	9  U(       a  UR                  5         [        R                  " US   S   US   S
   5      nU(       a  UR                  [        R                  [        R                  S
5        U	(       a/  UR                  [        R                  [        R                  U	5        U
(       a/  UR                  [        R                  [        R                  U
5        U(       a/  UR                  [        R                  [        R                  U5        U(       aC  UR!                  US   S   5        U(       a#  [        R#                  5       nUR%                  XS9nU$ UR                  [        R                  [        R&                  S
5        UR)                  US   S   5        UR+                  S5         U$ U(       a   [,        R.                  " U5        [        R                  " [        R2                  [        R
                  5      n[,        R4                  " SU-  5      n UR)                  U5        [,        R4                  " U5        UR+                  S5        U$ [        R                  " [        R2                  [        R
                  5      nUR!                  U5        U$ ! [0         a     Nf = f! [,        R4                  " U5        f = f)zResolve a host (and optional port) to an IPv4 or IPv6
address. Create a socket. Bind to it if listen is set,
otherwise connect to it. Return the socket.
r   r   NzConnect mode requires a portz6SSL socket requested but Python SSL module not loaded.z,SSL only supported in connect mode (for now)zCould not resolve host '%s'c                     U S   $ )Nr   r   )xs    r   <lambda>)WebSockifyServer.socket.<locals>.<lambda>  s    QqTr   )r   r      )server_hostnamed   i  )r   r   r   
AI_PASSIVEgetaddrinfoSOCK_STREAMIPPROTO_TCPsortreverse
setsockopt
SOL_SOCKETSO_KEEPALIVESOL_TCPTCP_KEEPCNTTCP_KEEPIDLETCP_KEEPINTVLconnectcreate_default_contextwrap_socketSO_REUSEADDRbindlistenr   unlinkFileNotFoundErrorAF_UNIXumask)hostportr  r   unix_socketunix_socket_modeunix_socket_listenuse_sslr   r   r   r   flagsaddrssockcontextoldmasks                    r   r   WebSockifyServer.socket  s    2:DDK:;;33TUU7JKKF---E&&t1f6H6H&&/E = DEEJJ>J*==q!eAhqk:D 1 163F3FJOOFNNF4F4F$/1OOFNNF4G4G$02 OOFNNF4H4H$13 U1Xa[)!88:G"..t.JD. +  1 163F3FJ		%(1+&C & # "IIk* }}V^^V5G5GH((5+;#;<&IIk*HHW%C 
  }}V^^V5G5GH[) )  HHW%s   M? ?N ?
NNN'c                    U c  / n [         R                  " S5        U(       a  [         R                  " U5        O[         R                  " S5        [         R                  " [         R                  " 5       5        [         R
                  " [         R                  " 5       5        [         R                  " 5       S:  a  [         R                  " S5        [         R                  " 5         [         R                  " 5       S:  a  [         R                  " S5        [        R                  " [        R                  [        R                  5        [        R                  " [        R                  [        R                  5        [        R                  [        R                   5      S   nU[        R"                  :X  a  Sn[%        ['        U5      5       H!  n X0;  a  [         R(                  " U5        M!  M#     [         R4                  " [         R6                  " [         R8                  [         R:                  5      [,        R<                  R?                  5       5        [         R4                  " [         R6                  " [         R8                  [         R:                  5      [,        R@                  R?                  5       5        [         R4                  " [         R6                  " [         R8                  [         R:                  5      [,        RB                  R?                  5       5        g ! [*         a<    [,        R.                  " 5       u  pEnUR0                  [0        R2                  :w  a  e  GM  f = f)Nr   r   r      )"r   r"  r   setgidgetgidsetuidgetuidfork_exitsetsidsignalSIGTERMSIG_IGNSIGINTr   	getrlimitRLIMIT_NOFILERLIM_INFINITYreversedranger   OSErrorrF   r   errnoEBADFdup2r   devnullO_RDWRstdinfilenorG   stderr)keepfdr   maxfdfdr   r   s         r   	daemonizeWebSockifyServer.daemonize  s    >F
HHUOHHSM
		"))+
		"))+ 779q="((1+
		779q="((1+ 	fnnfnn5fmmV^^4 ""8#9#9:1=H***CE5<(B3#HHRL $ ) 	

BII.		0@0@0BC


BII.

0A0A0CD


BII.

0A0A0CD  3LLN	99+U+3s   LAM#"M#c                    [         R                   " U// / S5      S   nU(       d  U R                  S5      eUR                  S[        R                  5      nU(       d  U R                  S5      eUS   S;   Gar  [
        (       d  U R                  S5      e[        R                  R                  U R                  5      (       d  U R                  SU R                  -  5      eSn [
        R                  [
        R                  R                  5      nU R                  b  UR                  U R                  5        U R                  Ul        UR#                  U R                  U R$                  U R&                  S	9  U R(                  (       aP  [
        R*                  Ul        U R.                  (       a  UR1                  U R.                  S
9  OUR3                  5         UR5                  USS9nO$U RB                  (       a  U R                  S5      eUn[A        U5      S:X  a  US   US   XQ:g  4nU RE                  XRU 5        U$ ! [
        R6                   a    [8        R:                  " 5       u  pxnUR<                  S   [
        R>                  :X  aH  [A        UR<                  5      S:  a  U R                  UR<                  S   5      eU R                  S5      ee f = f)a  
do_handshake does the following:
- Peek at the first few bytes from the socket.
- If the connection is an HTTPS/SSL/TLS connection then SSL
  wrap the socket.
- Read from the (possibly wrapped) socket.
- If we have received a HTTP GET request and the webserver
  functionality is enabled, answer it, close the socket and
  return.
- Assume we have a WebSockets connection, parse the client
  handshake data.
- Send a WebSockets handshake server response.
- Return the socket for this WebSocket client.
   r   r   i   )      z"SSL connection but no 'ssl' modulez!SSL connection but '%s' not foundN)certfilekeyfilepassword)r   T)server_sider   zGot SSL_ERROR_EOFz*non-SSL connection received but disallowedr   )#selectr   recvr   MSG_PEEKr   r   r   r   r   r  PurposeCLIENT_AUTHr   set_ciphersr   optionsload_cert_chainr   r   r   CERT_REQUIREDverify_moder   load_verify_locationsset_default_verify_pathsr  SSLErrorrF   r   rB   SSL_ERROR_EOFlenr   r   )	r   r+  addressready	handshakeretsockr,  r   r  s	            r   do_handshakeWebSockifyServer.do_handshake  sN    tfb"a03++b/! IIdFOO4	 ++b/!q\Y&3kk"FGG77>>$)),,kk"E$(II#. / /G44S[[5L5LM##/''(8(89"&"2"2''DHHW[WhWh'i%%*-*;*;G'{{55T[[5I88:!--$( . * ]]++JKK G
 w<1qz71:AG  48 3 << ,,.a66!9 1 11166{Q"kk!&&)44"kk*=>>s   #DH> >BKc                 `    U R                   R                  " [        R                  /UQ70 UD6  g)zOutput message as info N)r1   rO   rP   rQ   r   rB   rT   s      r   rS   WebSockifyServer.msgl       6t6v6r   c                 `    U R                   R                  " [        R                  /UQ70 UD6  g)rY   N)r1   rO   rP   rZ   rm  s      r   r[   WebSockifyServer.vmsgp  s     777r   c                 `    U R                   R                  " [        R                  /UQ70 UD6  g)r^   N)r1   rO   rP   r_   rm  s      r   r`   WebSockifyServer.warnt  ro  r   c                 &    U R                  S5        g)z Called after WebSockets startup zWebSockets server startedN)r[   r   s    r   startedWebSockifyServer.started|  s    		-.r   c                     g)z0Run periodically while waiting for connections. Nr   r   s    r   pollWebSockifyServer.poll  s     	r   c                 T    U R                   (       d  SU l         U R                  5       eg )NT)r   r   r   s    r   	terminateWebSockifyServer.terminate  s%    #D..""  r   c                 .    [         R                  " 5         g r   )multiprocessingactive_childrenr   sigstacks      r   multiprocessing_SIGCHLD(WebSockifyServer.multiprocessing_SIGCHLD  s     	'')r   c                     [         R                  " S[         R                  5      nUS   (       aI  U R                  SUS   -  5        [         R                  " S[         R                  5      nUS   (       a  MH  g g ! [         a     g f = f)Nr   zReaped child process %s)r   waitpidWNOHANGr[   rA  )r   r  r  results       r   fallback_SIGCHLD!WebSockifyServer.fallback_SIGCHLD  sk    	ZZBJJ/F)		3fQi?@B

3 ))  		s   A5A; ;
BBc                 $    U R                  5         g r   r{  r  s      r   	do_SIGINTWebSockifyServer.do_SIGINT       	r   c                 $    U R                  5         g r   r  r  s      r   
do_SIGTERMWebSockifyServer.do_SIGTERM  r  r   c                 L   Sn  U R                  X5      nU(       a  X1:w  a  UR                  5         ggg! U R                   aW    [        R                  " 5       u  pEnUR                  S   (       a(  U R                  US   < SUR                  S   < 35         N[        R                   a    e [         aH    [        R                  " 5       u  pEnU R                  S[        U5      -  5        U R                  SSS9   Nf = f! U(       a  X1:w  a  UR                  5         f f f = f)r   Nr   z: handler exception: %s	exceptionTr   )rj  r   rF   r   rB   rS   r4   r   r   strr[   r   )r   	startsockrf  clientr   r   s         r   top_new_clientWebSockifyServer.top_new_client  s     	6**9> &-  .v ;; CLLN	88A;HHSXXa[AB#--  6LLN	03s8;<		+	56 &-  .vs/   5 A$D D A"D =D ?D  D  D#c                     / nU R                   R                  R                   HM  n[        U[        R
                  5      (       d  M$  UR                  UR                  R                  5       5        MO     U$ )z]
Get file descriptors for the loggers.
They should not be closed when the process is forked.
)	r1   parenthandlers
isinstancerP   FileHandlerrq   streamrH  )r   descriptorshandlers      r   
get_log_fdWebSockifyServer.get_log_fd  sY    
 {{))22G'7#6#677""7>>#8#8#:; 3 r   c                 ~    U R                   S:w  a?  [        R                  " U R                   [        R                  [        R                  5      nOU R
                  S:w  a'  U R                  SU R
                  U R                  SS9nO]U R                  U R                  U R                  SU R                  U R                  U R                  U R                  U R                  S9n U R(                  (       aH  U R+                  5       nUR-                  WR/                  5       5        U R1                  X0R2                  S	9  U R5                  5         [6        R8                  [6        R:                  " [6        R8                  5      [6        R<                  [6        R:                  " [6        R<                  5      0n[?        [6        S
S5      b5  [6        R:                  " [6        R@                  5      U[6        R@                  '   [6        R6                  " [6        R8                  U RB                  5        [6        R6                  " [6        R<                  U RD                  5        [?        [6        S
S5      b/  [6        R6                  " [6        R@                  U RF                  5        U RH                  n    SnS=pxSn	[K        [L        RN                  " 5       5      n	[P        RP                  " 5       U RH                  -
  n
U RR                  (       aH  XRR                  :  a9  U R                  SU RR                  -  5         U(       Ga  URU                  5         GOU RV                  (       a  SnU	S:X  a  [P        RP                  " 5       U-
  nOSn[P        RP                  " 5       nXRV                  :  a?  U	S:X  a9  U R                  SU RV                  -  5         U(       Gam  URU                  5         GO[ U RY                  5         [Z        RZ                  " W// / S5      S   nX;   a0  UR]                  5       u  pmU R
                  S:w  a  U R
                  /nO U(       d  GM  URU                  5         GM  U Rl                  (       aS  U Ro                  Xm5        U Rp                  (       a0  U R                  SUS   -  5         U(       a  URU                  5         OwOGU R#                  SUS   -  5        [L        Rr                  " U Rn                  Xm4S9nURu                  5         U =Rv                  S-  sl;        W(       a  URU                  5         GM  U R#                  SU R                  U R                  5        WRU                  5         UR                  5        H  u  nn[6        R6                  " UU5        M     g! [         aK  nU R                  S[!        U5      5        U R#                  SSS9  [$        R&                  " 5          SnAGNSnAff = f! U R^                   a    e [`         a    [$        Rb                  " 5       u  pn[e        US5      (       a  URf                  nO&[e        US5      (       a  URh                  S   nOUS   nU[f        Rj                  :X  a/  U R#                  S5         U(       d  GM  URU                  5         GM  e f = f! U R^                  [x        [z        4 a    U R                  S5        U Rl                  (       dL  [L        RN                  " 5       nU H1  nU R                  SUR|                  -  5        UR                  5         M3      W(       d  GM  URU                  5         GM&  [`         aG    [$        Rb                  " 5       S   nU R                  S[!        U5      5        U R#                  SSS9   GNf = f! W(       a  URU                  5         f f = f! U R#                  SU R                  U R                  5        WRU                  5         UR                  5        H  u  nn[6        R6                  " UU5        M     f = f)z
Daemonize if requested. Listen for for connections. Run
do_handshake() method for each connection. If the connection
is a WebSockets client then call new_websocket_client() method (which must
be overridden) for each new client connection.
NT)r#  r%  r&  r'  F)r   r   r   r   zOpenening socket failed: %sr  r  )rJ  r   SIGCHLDr   z!listener exit due to --timeout %sz&listener exit due to --idle-timeout %sr   rB  rB   zIgnoring interrupted syscallz%s: exiting due to --run-oncez%s: new handler Process)targetrB   zIn exitzTerminating child %sr  z!Closing socket listening at %s:%s)Ar   r   fromfdAF_INETr  r   r   r   r   r   r   r   r   r   rA  rS   r  r[   rF   exitr)   r  rq   rH  rM  r   ru  r8  r;  	getsignalr9  r2   r  r  r  r  r   re  r~  r  rk   r   r   r   rx  rW  acceptr   r   r   hasattrrB  rB   EINTRr+   r  r   Processstartr,   
SystemExitKeyboardInterruptpidr{  items)r   lsockerJ  original_signalslast_active_timer  r  errchild_counttime_elapsed	idle_timerg  rf  r   r   pchildrenchildr  funcs                        r   start_serverWebSockifyServer.start_server  sY   	~~%dnnfnnfFXFXY!!T)040@0@595J5J7; $ =
 D$4$4d6F6F$($4$4262D2D040@0@151B1B262D2D $ F ;;__&FMM%,,.)NN&N9 MM6++FMM:NNF,,V^^<
 69d+7/5/?/?/OV^^,fmmT^^4fnndoo6 69d+7MM&..$*F*FG++f	)[*V>$(	$%&' '*/*I*I*K&L'+yy{T5E5E'E<<L<<,G HH%H&*ll&3 4!Z !!)Y  ,,()I*a/,0IIK:J,J	,-	3799; 0(+<+<<PQAQ $)Q.2.?.?*@ !A %@ !!)& IIK$*MM5'2r1$Ea$HE$~5:\\^ 2	#'#3#3t#;040@0@.BG (h !y!)I  == //	C#11 $)H*1!**5 !6 %: !!)C  2
 !II&?'!*&LM / 7 7+/+>+>*3)=!?A GGI 1,& !!)y ~ II9&&(8(8:KKM .335	Tc4( 6A  	HH2CF;IIkDI1HHJJ	H  $~~ "!( &(+IAA&sG44&)ii!(f!5!5&)hhqk&)!f"ekk1 $		*H I (N !y!)M !&&@ !NNJ8IJ 
+#}}'6'F'F'HH)1 $)?%)))K L % 1 *2  !y!) % >!llnQ/!8#c(C		+	=> !!) ! II9&&(8(8:KKM .335	Tc4( 6s   AV% 6V% AV% '_ *BZ; 0_ 8_ 
A<Z; _ _ "A!W= Z; _ _ "A
Z; -_ 4_ AZ; "_ %
W:/A W55W:=BZ8Z; _ #_ 6Z88Z; ;B	^2^5 _ _ "A^2.^5 1^22^5 5__ A*`<)#r   r   r   r)   r-   r,   r   r   r   r   r   r   r   r1   r'   r   r*   r+   r   r   r   r   r   r   r   r   r   r.   r   r   r(   r   r   r/   r   )Nr   NFFr   r   NNFNFr   r   FFFr   r   FTNNNNr   NN)NFFNNFFTNNN)Nr   )r   r   r   r   r   policy_responser  r   r   r   r7   staticmethodr5   r   rM  rj  rS   r[   r`   ru  rx  r{  r  r  r  r  r  r  r  r   r   r   r   r4   r4   0  s    
 wOJ I  7;=BHL(,6;?D?C>?/3_=J 2 2
 ;@KP>B04E EN $E $ELLd787/
#
*



2
X)r   r4   )r   r   rF   rk   rB  r8  r   rW  rP   r~  http.serverr   modrS   
__import__globalsImportErrorprintplatformmultiprocessing.reductionwebsockify.websocketr   r   websockify.websocketserverr	   r   r   r   r4   r   r   r   <module>r     s   
 = < < <  0:HC:#C	#: <<7$ P C6BB A,;=U A,Hr) r)q  :	#sC89:s   B B<;B<