
    wg\jz                        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
r
SSKrSSKJr  SSKJr  SSKrSSKJr  SSKJr  SSKJrJr   " S S	\R0                  5      r " S
 S\R4                  5      rS r\
R:                  \
R<                  \
R>                  -  \
R@                  -  \
RB                  -  \
R<                  \
R>                  -  \
R@                  -  \
RB                  -  \
RD                  -  \
R<                  \
R>                  -  \
R@                  -  \
RB                  -  \
RD                  -  \
RF                  -  S.r$S r%S r& " S S\\5      r'\(S:X  a  \&" 5         gg)aV  
A WebSocket to TCP socket proxy with support for "wss://" encryption.
Copyright 2011 Joel Martin
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)ThreadingMixIn)
HTTPServer)websockifyserver)auth_plugins)parse_qsurlparsec                   @    \ rS rSrSrSrS rS rS rS r	S r
S	 rS
rg)ProxyRequestHandler      z
Traffic Legend:
    }  - Client receive
    }. - Client receive partial
    {  - Target receive

    >  - Target send
    >. - Target send partial
    <  - Client send
    <. - Client send partial
c                     U R                  UR                  UR                  5        U R                  SS5        UR                  R                  5        H  u  p#U R                  X#5        M     U R                  5         g )NzContent-Typez	text/html)send_responsecodemsgsend_headerheadersitemsend_headers)selfexnamevals       T/home/edenadmin/noVNC/venv/lib/python3.13/site-packages/websockify/websocketproxy.pysend_auth_error#ProxyRequestHandler.send_auth_error'   s_    277BFF+5))+IDT' , 	    c                     U R                   R                  (       d  g U R                  U R                   R                  5      u  pUS:X  a  X R                   l        g XR                   l        X R                   l        g )Nunix_socket)servertoken_plugin
get_targetunix_targettarget_hosttarget_port)r   hostports      r   validate_connection'ProxyRequestHandler.validate_connection/   sT    {{''__T[[%=%=>
= &*KK# '+KK#&*KK#r   c                    U R                   R                  (       d  g U R                   Vs/ s H  oR                  S5      (       d  M  UPM     nnU H  nU R                  U	 M      U R                  R                  5       nUS   n[        U Vs/ s H  oUS   PM	     sn5      nUS   U R                  S'    U R                   R                  R                  U R                  U R                   R                  U R                   R                  S9  g s  snf s  snf ! [        [        [        4 a     Nzf = f! [        R                   a+    [        R                   " 5       S   nU R#                  U5        e f = f)NSSL_subjectr   
commonNameSSL_CLIENT_S_DN_CN)r   r#   r$      )r   auth_pluginr   
startswithrequestgetpeercertdict	TypeErrorAttributeErrorKeyErrorauthenticater#   r$   authAuthenticationErrorsysexc_infor   )r   hssl_headersclient_cert_dataclient_cert_subjectxr   s          r   auth_connection#ProxyRequestHandler.auth_connection;   s@   {{&& $(<<I<a<<3G<IAQ 	#||779"29"="&6I'J6I!6I'J"K1D\1RDLL-.
	KK##00$++2I2I KK33 1 5% J (K >84 		 '' 	"B  $	s<   DD'(D DD 7AD4 D D10D14?E3c                 z   U R                   R                  (       aC  SSR                  U R                   R                  5      < SU R                   R                  < S3nOgU R                   R                  (       a  SU R                   R                  -  nO2SU R                   R
                  < SU R                   R                  < 3nU R                   R                  (       a  US-  nU R                  U5         [        R                  R                  U R                   R
                  U R                   R                  S	U R                   R                  U R                   R                  S
9nU R                   R                  (       d9  U R                  R                  [        R                   [        R"                  S5        U R                   R                  (       dJ  U R                   R                  (       d/  UR                  [        R                   [        R"                  S5        U R%                  U R&                  5         U R)                  U5        U(       a}  UR+                  [        R,                  5        UR/                  5         U R0                  (       a<  U R                  SU R                   R
                  U R                   R                  5        ggg! [         aS  nU R                  SU R                   R
                  U R                   R                  U5        U R                  SS5      eSnAff = f! U(       a}  UR+                  [        R,                  5        UR/                  5         U R0                  (       a<  U R                  SU R                   R
                  U R                   R                  5        f f f = f)z?
Called after a new WebSocket connection has been established.
zconnecting to command: ' ' (port )zconnecting to unix socket: %szconnecting to: : (using SSL)T)connectuse_sslr   zFailed to connect to %s:%s: %si  z&Failed to connect to downstream serverNr.   z%s:%s: Closed target)r   wrap_cmdjoinr$   r"   r#   
ssl_targetlog_messager   WebSockifyServersocket	ExceptionCCloseunix_listenr1   
setsockoptSOL_TCPTCP_NODELAYprint_traffictraffic_legenddo_proxyshutdown	SHUT_RDWRcloseverbose)r   r   tsockes       r   new_websocket_client(ProxyRequestHandler.new_websocket_client[   s    ;;=@XXdkkFZFZ=[]a]h]h]t]tuC[[$$1DKK4K4KKC % %)KK$;$;T[[=T=TVC ;;!!>!C		N$55<<T[[=T=T;?;;;R;RCGCG;;CYCYGK{{G^G^	 = `E {{&&LL##FNNF4F4FJ{{##DKK,C,CV^^V-?-?C4../	NMM% v//0<<$$%; KK33T[[5L5LN   #  	N=![[44dkk6M6MqR++d$LMM	N" v//0<<$$%; KK33T[[5L5LN   s'   8A1K >L4 
L1AL,,L14BN:c                    U R                   (       a7  U R                  R                  S5      nU(       a  UR                  S5      S   nOT[	        [        U R                  5      S   5      nSU;   a+  [        US   5      (       a  US   S   R                  S5      nOSnUc  U R                  R                  S5      eUR                  U5      nUb  U$ U R                  R                  S	U-  5      e)
z
Gets a token from either the path or the host,
depending on --host-token, and looks up a target
for that token using the token plugin. Used by
validate_connection() to set target_host and target_port.
HostrG   r      token
NzToken not presentzToken '%s' not found)
host_tokenr   get	partitionr   r   pathlenrstripr   ECloselookup)r   target_pluginre   argsresult_pairs        r   r!   ProxyRequestHandler.get_target   s     ??LL$$V,E
 ,Q/ HTYY/23D$3tG}#5#5Wa(//5=++$$%899#**51"++$$%;e%CDDr   c                 v   / nSn/ nU R                   U/nU R                  R                  (       a3  [        R                  " 5       nX`R                  R                  -   U l        OSU l         / nU R                  bQ  [        R                  " 5       nX`R                  :  a-  X`R                  R                  -   U l        U R	                  5         U(       a  UR                  U5        U(       d  U(       a  UR                  U R                   5         [        R                  " XW/ S5      u  pn
U
(       a  [        S5      eU R                   U	;   a  U R                  U5      n/ nU R                   U;   Ga  U R                  5       u  pUR!                  U5        U(       a  [#        U5      S:w  az  UR%                  S5      nUR'                  U5      nU[#        U5      :X  a  U R)                  S5        O&UR+                  SUUS 5        U R)                  S5        [#        U5      S:w  a  Mz  U R,                  (       a;  U R/                  S	U R                  R0                  U R                  R2                  5        U R5                  US
   US   5      eX;   ai  UR%                  S5      nUR'                  U5      nU[#        U5      :X  a  U R)                  S5        O&UR+                  SUUS 5        U R)                  S5        X;   a  UR7                  U R8                  5      n[#        U5      S:X  a  [#        U5      S:w  a%  SnU(       a  U R                  U5      nU(       a  M  / nU R,                  (       a;  U R/                  SU R                  R0                  U R                  R2                  5        U R5                  SS5      eUR                  U5        U R)                  S5        GMn  ! [         aU    [        R                  " 5       S   n[        US5      (       a  UR                  nOUS   nU[        R                  :w  a  e  GM  f = f)z1
Proxy client WebSocket to normal target socket.
r   NTr.   errnozSocket exception>z.>z%s:%s: Client closed connectionr   reasonz%s:%s: Target closed connectioni  zTarget closed{)r1   r   	heartbeattime	send_pingappendselectOSErrorr:   r;   hasattrrt   EINTRrQ   send_framesrecv_framesextendrk   popsendrW   insertr]   rN   r#   r$   rR   recvbuffer_size)r   targetcqueuec_pendtqueuerlistnowwlistinsoutsexceptsexcerrbufscloseddatsentbufs                     r   rY   ProxyRequestHandler.do_proxy   sc    v&;;  ))+C ;;#8#88DN!DNE~~)iik'%(;;+@+@%@DNNN$u||F+dll!;%+]]5Q%G"7 i(:;;||t#))&1||s"#//1d#v;!+$jjm%{{3/3s8+ ..s3 #MM!SZ8 ..t4 v;!+ ||(()J $ 7 79P9PR++fVnfX6FGG ~jjm{{3'3s8#&&s+ MM!SZ0&&t, }kk$"2"23s8q= 6{a'!%$%)%5%5f%=F %f "$||(()J $ 7 79P9PR++dO<<c"""3'u   
llnQ'3(())Ca&C%++%
s   O AP87P8)rx   N)__name__
__module____qualname____firstlineno__r   rX   r   r'   rA   r`   r!   rY   __static_attributes__ r   r   r
   r
      s2    K
N
+@/Nb%ENi(r   r
   c                   H   ^  \ rS rSrSrSr\4U 4S jjrS rS r	S r
SrU =r$ )	WebSocketProxyi  zU
Proxy traffic to and from a WebSockets client to a normal TCP
socket server target.
r   c                   > UR                  SS 5      U l        UR                  SS 5      U l        UR                  SS 5      U l        UR                  SS 5      U l        UR                  SS 5      U l        UR                  SS 5      U l        UR                  SS 5      U l        UR                  SS 5      U l        UR                  S	S 5      U l	        UR                  S
S 5      U l
        / SQU l        U R                  (       GaA  [        R                  R                  [        R                   S   5      n[        R                  R#                  USS5      [        R                  R#                  USSS5      [        R                  R#                  US5      U/nS U l        U HO  n[        R                  R#                  US5      n[        R                  R'                  U5      (       d  MI  Xpl          O   U R$                  (       d  [)        S5      e[        R                  R+                  U R$                  5      U l        SU l        [,        R,                  " [,        R.                  [,        R0                  5      nUR3                  S5        UR5                  5       S   U l        UR7                  5         [9        S U R$                  [        R:                  R=                  SS 5      /5      n	[        R:                  R?                  [        R@                  R#                  U	5      [C        US   5      [C        U R                  5      S.5        [D        T
U ]  " U/UQ70 UD6  g )Nr#   r$   rK   	wrap_moder"   rM   rx   r    rg   r/   )r   r   r   r   z..lib
websockifyz	rebind.soz1rebind.so not found, perhaps you need to run makez	127.0.0.1) r   r.   
LD_PRELOADlisten_port)r   REBIND_OLD_PORTREBIND_NEW_PORT)$r   r#   r$   rK   r   r"   rM   rx   r    rg   r/   
wrap_timesosrj   dirnamer:   argvrL   rebinderexistsrQ   abspathrP   AF_INETSOCK_STREAMbindgetsocknamer\   filterenvironrh   updatepathsepstrsuper__init__)r   RequestHandlerClassrp   kwargswsdirrebinder_pathrdirrpathsockld_preloads	__class__s             r   r   WebSocketProxy.__init__&  sm   $jj=$jj=$jjT:$jjd;$jj=$jjt<$jjd;"JJ~t< **\48!::mT: '===GGOOCHHQK0EWW\\%u=WW\\%ulKWW\\%6"$M !DM%T;777>>%(($)M	 & == STTGGOODMM:DM*D==1C1CDDIIg#//1!4DJJL !

|UY8Z'\]KJJ jjook:#&vm'<#=#&t'7'7#8: ;
 	,>t>v>r   c                 h   U R                  SSR                  U R                  5      5        U R                  R	                  [
        R
                  " 5       5        U R                  R                  S5        [        R                  " U R                  [        R                  [        S9U l        SU l        g )NzStarting '%s'rD   r   )env
preexec_fnT)r   rL   rK   r   r{   ry   r   
subprocessPopenr   r   _subprocess_setupcmdspawn_message)r   s    r   run_wrap_cmdWebSocketProxy.run_wrap_cmdZ  sr    #((4=="9:tyy{+A##2:::KM!r   c                 t   U R                   (       a/  SSR                  U R                   5      < SU R                  < S3nO;U R                  (       a  U R                  nOU R                  < SU R                  < 3nU R
                  S:w  a  SnOU R                  < SU R                  < 3nU R                  (       a(  SU< S	[        U R                  5      R                  < 3nO
SU< S
U< 3nU R                  (       a  US-  nU R                  SU5        U R                   (       a  U R                  5         gg)z?
Called after Websockets server startup (i.e. after daemonize)
'rD   rE   rF   rG   Ninetdz  - proxying from z to targets generated by z to rH   z%s)rK   rL   r$   r"   r#   	listen_fdlisten_hostr   r    typer   rM   r   r   )r   
dst_string
src_stringr   s       r   startedWebSocketProxy.startedb  s     ===-0XXdmm-DdFVFVWJ))J$($4$4d6F6FGJ>>T! J$($4$4d6F6FGJD!2!23<<>C 
 J(C ??>!Cs== r   c                    U R                   (       aL  U R                  (       a;  U R                  R                  5       nUS :w  a  U R                  SU-  5        S U l        U R                   (       a  U R                  S :X  a  U R                  S:X  a  g U R                  S:X  a  [
        R                  " W5        g U R                  S:X  a  [        R                  " 5       n[        U R                  5      [        U R                  5      -  nX#-
  S:  a+  U R                  (       a  U R                  S5        SU l        g g U R                  5         g g g g )Nz/Wrapped command exited (or daemon). Returned %signoreexitrespawn
   zCommand respawning too fastF)rK   r   pollvmsgr   r:   r   ry   sumr   rk   r   warnr   )r   retr   avgs       r   r   WebSocketProxy.poll  s     ==TXX((--/Cd{		KcQR==TXX-~~)6)9,iik$//*3t+??I#))		"?@-2* * %%' - .=r   )r/   r   rx   rg   r   r   rM   r#   r$   r    r"   rK   r   r   )r   r   r   r   __doc__r   r
   r   r   r   r   r   __classcell__r   s   @r   r   r     s-    
 K+> 2?h" B( (r   r   c                  j    [         R                   " [         R                  [         R                  5        g )N)signalSIGPIPESIG_DFLr   r   r   r   r     s     MM&..&..1r   defaulttlsv1_1tlsv1_2tlsv1_3c                 
   U [         ;   a	  [         U    $ [        [         R                  5       5      nUR                  5         US   n[        R
                  " [        R                  5      nUR                  SX5        [         U   $ )zTReturns SSL options for the most secure TSL version available on this
Python versionz.TLS version %s unsupported. Falling back to %s)	SSL_OPTIONSlistkeyssortlogging	getLoggerr   
log_prefixr   )versionr   fallbackloggers       r   select_ssl_versionr     ss     +7## K$$&'		8"">#<#<=D	' 8$$r   c            	      0   [         R                  " 5       n U R                  [         R                  5        [         R                  " S5      nU R                  U5        [         R                  " 5       nUR                  U 5        UR                  [         R                  5        SnUS-  nUS-  nUS-  nUS-  nUS-  nUS-  nUS-  n[        R                  " US9nUR                  SS	S
SS9  UR                  SS
SS9  UR                  SSSS9  UR                  SSSS
SS9  UR                  SS
SS9  UR                  S[        SSS9  UR                  S[        SSS9  UR                  S S!S"S#9  UR                  S$S S%S#9  UR                  S&S S'S#9  UR                  S(S
S)S9  UR                  S*S
S+S9  UR                  S,S
S-S9  UR                  S.SS/S09  UR                  S1S2S3/ S4QS5S6S79  UR                  S8S5S9S9  UR                  S:S;SS S<9  UR                  S=S S>S#9  UR                  S?S@SS9  UR                  SASBS
SC9  UR                  SDS SESFSG9  UR                  SHS
SIS9  UR                  SJSKSL/ SMQSNSO9  UR                  SPSQS
SRSSST9  UR                  SUS
SVS9  UR                  SWSSXSYSZ9  UR                  S[S S\S]SG9  UR                  S^S S_S`SG9  UR                  SaS
SbS9  UR                  ScS S\SdSG9  UR                  SeS S_SfSG9  UR                  Sg[        SShSiSj9  UR                  SkSSlSmSZ9  UR                  SnS SoSpSG9  UR                  SqS
SrS9  UR                  SsS
StS9  UR                  5       u  pVUR                  (       a"  UR                  (       d  UR!                  Su5        UR"                  (       a"  UR                  (       d  UR!                  Sv5        UR$                  (       a"  UR&                  (       d  UR!                  Sw5        UR(                  (       a"  UR&                  (       d  UR!                  Sx5        UR(                  (       a"  UR*                  (       d  UR!                  Sy5        UR,                  (       a"  UR.                  (       d  UR!                  Sz5        [1        UR2                  5      Ul        U?UR6                  (       a  [8        R:                  R=                  UR6                  5      Ul        [         R>                  " UR6                  5      nUR                  [         R                  5        UR                  U5        [         R                  " 5       nUR                  U5        U?UR.                  (       Ga  UR.                  RA                  S{5      (       a.  UR.                  RC                  S{S|5      u  p [        U	5      n	X4n
O)[8        R:                  R=                  UR.                  5      n
SS~K#J$n  URJ                  (       a  URL                  nOURN                  nU" U
USUR,                  S9nUR                  [         R                  5        UR                  U5        [         R                  " 5       nUR                  U5        U?U?URP                  (       a4  [         R                  " 5       nUR                  [         R                  5        URR                  (       a.  [8        R:                  R=                  URR                  5      Ul)        URR                  (       a  SUl        URR                  Ul        U?)[T        RV                  RA                  S5      (       a  US|S  Ul,        OS Ul,        [Z        R\                  (       d"  UR^                  (       a  UR!                  S5        UR`                  (       aL  [8        R:                  Rc                  URd                  5      (       d  UR!                  SURd                  -  5        URf                  (       a%  [T        Rh                  Rk                  5       Ul6        GOURn                  (       aU  URp                  (       a   [        URp                  S5      Ul8        O[r        Rt                  [r        Rv                  -  Ul8        O[y        U5      S|:  a  UR!                  S5        UR{                  S5      nURA                  S{5      S:  a@  URC                  S{S|5      u  Ul>        Ul?        UR|                  R                  S5      Ul>        OSUsUl>        Ul?         [        UR~                  5      Ul?        U?3URX                  (       d"  UR                  (       d  UR                  (       a  S UlB        S UlC        O[y        U5      S|:  a  UR!                  S5        UR{                  S5      nURA                  S{5      S:  a@  URC                  S{S|5      u  UlB        UlC        UR                  R                  S5      UlB        OUR!                  S5         [        UR                  5      UlC        [y        U5      S:  a!  URX                  S :X  a  UR!                  S5        UR                  b  SUR                  ;  a  SUR                  -  Ul        UR                  RC                  SS|5      u  nn[        U5        [        [T        R                  U   U5      nU" UR                  5      Ul        U?UR&                  b  SUR&                  ;  a  SUR&                  -  Ul        UR&                  RC                  SS|5      u  nn[        U5        [        [T        R                  U   U5      nU" UR$                  5      Ul        U?UR                  nU?GU(       a&  [        S0 UR                  D6nUR                  5         g [        S0 UR                  D6nUR                  5         g ! [D         a    UR!                  S}5         GNVf = f! [D         a    UR!                  S5         GNf = f! [D         a    UR!                  S5         GNf = f! [D         a    UR!                  S5         GN7f = f)Nz%(message)sz
    %prog [options]z2 [source_addr:]source_port target_addr:target_portz/ --token-plugin=CLASS [source_addr:]source_portz- --unix-target=FILE [source_addr:]source_portz/ [source_addr:]source_port -- WRAP_COMMAND_LINE)usagez	--verbosez-v
store_truezverbose messages)actionhelpz	--trafficzper frame trafficz--recordz(record sessions to FILE.[session_number]FILE)r  metavarz--daemonz-Ddaemonz$become a daemon (background process))destr  r  z
--run-oncez-handle a single WebSocket connection and exitz	--timeoutr   z-after TIMEOUT seconds exit when not connected)r   r   r  z--idle-timeoutzEserver exits after TIMEOUT seconds if there are no active connectionsz--certzself.pemzSSL certificate file)r   r  z--keyz$SSL key file (if separate from cert)z--key-passwordzSSL key passwordz
--ssl-onlyz)disallow non-encrypted client connectionsz--ssl-targetz#connect to SSL target as SSL clientz--verify-clientzlrequire encrypted client to present a valid certificate (needs Python 2.7.9 or newer or Python 3.4 or newer)z--cafilezfile of concatenated certificates of authorities trusted for validating clients (only effective with --verify-client). If omitted, system default list of CAs is used.)r  r  z--ssl-versionchoicer   r   storez?minimum TLS version to use (default, tlsv1_1, tlsv1_2, tlsv1_3))r   r   choicesr  r  z--ssl-ciphersz]list of ciphers allowed for connection. For a list of supported ciphers run `openssl ciphers`z--unix-listenzlisten to unix socket)r  r  r   z--unix-listen-modez/specify mode for unix socket (defaults to 0600)z--unix-targetzconnect to unix socket targetz--inetdz/inetd mode, receive listening socket from stdin)r  r  z--webDIRz1run webserver on same port. Serve files from DIR.)r   r  r  z
--web-authz+require authentication to access webserver.z--wrap-moder   MODE)r   r   r   z\action to take when the wrapped program exits or daemonizes: exit (default), ignore, respawn)r   r  r  r  z--prefer-ipv6z-6source_is_ipv6z&prefer IPv6 when resolving source_addr)r  r  r  z--libserverz&use Python library SocketServer enginez--target-config
target_cfgzConfiguration file containing valid targets in the form 'token: host:port' or, alternatively, a directory containing configuration files of this form (DEPRECATED: use `--token-plugin TokenFile --token-source  path/to/token/file` instead))r  r  r  z--token-pluginCLASSzxuse a Python class, usually one from websockify.token_plugins, such as TokenFile, to process tokens into host:port pairsz--token-sourceARGz=an argument to be passed to the token plugin on instantiationz--host-tokenzJuse the host HTTP header as token instead of the token URL query parameterz--auth-pluginz|use a Python class, usually one from websockify.auth_plugins, such as BasicHTTPAuth, to determine if a connection is allowedz--auth-sourcez<an argument to be passed to the auth plugin on instantiationz--heartbeatINTERVALz0send a ping to the client every INTERVAL seconds)r   r   r  r  z
--log-filelog_filezFile where logs will be savedz--syslogSERVERz\Log to syslog server. SERVER can be local socket, such as /dev/log, or a UDP host:port pair.z--legacy-syslogzoUse the old syslog protocol instead of RFC 5424. Use this if the messages produced by websockify seem abnormal.z--file-onlyz5use this to disable directory listings in web server.z1You must use --token-plugin to use --token-sourcez/You must use --token-plugin to use --host-tokenz/You must use --auth-plugin to use --auth-sourcez,You must use --auth-plugin to use --web-authz$You must use --web to use --web-authz,You must use --syslog to use --legacy-syslogrG   r.   zError parsing syslog port)WebsockifySysLogHandlerr   )addressfacilityidentlegacy	TokenFilez--z6SSL target requested and Python SSL module not loaded.zSSL only and %s not found   z%Error parsing listen unix socket modezToo few argumentsz[]r   zError parsing listen portzError parsing targetzError parsing target portzToo many arguments.zwebsockify.token_plugins.%szwebsockify.auth_plugins.%sr   )Mr   StreamHandlersetLevelDEBUG	FormattersetFormatterr   
addHandlerINFOoptparseOptionParser
add_optionint
parse_argstoken_sourcer    errorrg   auth_sourcer/   web_authweblegacy_syslogsyslogr   ssl_versionssl_optionsr  r   rj   r   FileHandlercountrsplit
ValueErrorwebsockify.sysloghandlerr  r  
LOG_DAEMONLOG_USERr]   r  r:   r   rK   r   sslrM   ssl_onlyr   certr   stdinfilenor   rS   unix_listen_modestatS_IREADS_IWRITErk   r   r   r   stripr"   r#   r$   
__import__getattrmodules	libserverLibProxyServer__dict__serve_foreverr   start_server)stderr_handlerlog_formatterrootr  parseroptsrp   log_file_handlersyslog_hostsyslog_portsyslog_destr  syslog_facilitysyslog_handlerargtoken_plugin_moduletoken_plugin_clsauth_plugin_moduleauth_plugin_clsrF  r   s                        r   websockify_initr[    s   **,NGMM*%%m4M.DOON#MM',, $E	AAE	$$E	>>E	$$E	<<E	$$E	>>E""/F
k4#  %
k,$  &
j;V  M
j$,7  9 l<@  B
kQ@  B
&S!&  ' h
'  )
gt7  9
&#  %
l<<  >
n\6  8
'C  D j&>  ? oHi@R  T og6  7 o(&$  H
*DB  D
o0&  B
iB<  Y
gtUD  F
l<>  @
mVV1=  > ot&69  ; mL9  ;
',  - &gW  X &e.  / n\7  8 otW\  ] otU.  / m#q*C  E
lF0  2 j$>  ? '\  ] mLR  T $$&LT
 !2!2HIt00FG 0 0FG}}T--CD}}TXX;<$++CD *$*:*:;D }}6"..t}}=!!'--0%%m4  "(){{{;;S!!'+{{'9'9#q'A$K:!+. '4K ''//$++6KD ;;5@@O5>>O 1:I7C8<8J8JL 	.##M2  "'||  "gmm$ ''//$//:' OO
xx~~dQRDOOMN}}RWW^^DII660499<=zz))+			  F(+D,A,A1(E%
 %)LL4==$@D!t9q=LL,-hhqk99S>A14C1C.Dd.#//55d;D13S.Dd.	6"4#3#34D 	
}}((D,=,=t9q=LL,-hhqk99S>A14C1C.Dd.#//55d;DLL/0	6"4#3#34D 4y1}$.)*$d'''-0A0AA  150A0A0H0Ha0P--&'"3;;/B#CEUV,T->->?#d&&&;d>N>NND.2.>.>.E.Ec1.M+O%&!#++.@"A?S*4+;+;< I0$--0  0$--0]  :89:z  FDEF$  	6LL45	6(  	6LL45	6sH   p 4p2 q q6 p/.p/2qqq32q36rrc                   >   ^  \ rS rSrSr\4U 4S jjrU 4S jrSrU =r	$ )rG  i  zL
Just like WebSocketProxy, but uses standard Python SocketServer
framework.
c                   > UR                  SS 5      U l        UR                  SS 5      U l        UR                  SS 5      U l        UR                  SS 5      U l        UR                  SS 5      U l        UR                  SS 5      U l        UR                  SS 5      U l        UR                  SS 5      U l        UR                  S	S 5      U l	        S U l        S U l        S
U l
        UR                  SS5      nUR                  SS 5      nUR                  SS5      nU(       + U l        UR                  SS
5      U l        UR                  SS5      nU(       a$  [        R                  R                  U5      U l        UR                  SS
5      U l        SU l        UR'                  5        H  n[)        SU-  5        M     U(       a  [        R*                  " U5        [,        TU ]]  X44U5        g )Nr#   r$   rK   r   r"   rM   r    r/   rx   Fr   r   r   r-  r]   recordrun_oncer   z1warning: option %s ignored when using --libserver)r   r#   r$   rK   r   r"   rM   r    r/   rx   r  only_upgrader]   r   rj   r   r^  r_  
handler_idr   printchdirr   r   )	r   r   r   r   r   r-  r^  rV  r   s	           r   r   LibProxyServer.__init__  s   $jj=$jj=$jjT:$jjd;$jj=$jjt<$jj>$jj=$jjd;   M26M48E2. #&gIu5Hb)''//&1DKJ6;;=CEKL ! HHSM+35HIr   c                 N   > U =R                   S-  sl         [        TU ]	  X5        g)z/Override process_request to implement a counterr.   N)ra  r   process_request)r   r1   client_addressr   s      r   rf  LibProxyServer.process_request  s    18r   )r/   r  ra  rx   r`  r^  r_  rM   r#   r$   r    r"   r]   rK   r   )
r   r   r   r   r   r
   r   rf  r   r   r   s   @r   rG  rG    s    
 ,? $JN9 9r   rG  __main__))r   r   rP   r$  ry   r   r:   r   r   rt   r9  r?  socketserverr   http.serverr   r|   r   r   r   r8   urllib.parser   r   WebSockifyRequestHandlerr
   rO   r   r   OP_ALLPROTOCOL_SSLv23OP_NO_SSLv2OP_NO_SSLv3OP_NO_TLSv1OP_NO_TLSv1_1OP_NO_TLSv1_2r   r   r[  rG  r   r   r   r   <module>ru     sA  	 V U U U U U ' "  ' + +E(*CC E(N}(%66 }(@2 zz""S__4sFOO""S__4sFOO''(""S__4sFOO''(*-*;*;<%"pf	09^Z 09f z r   