2020
2121coloredlogs .install ()
2222
23-
2423class NewWebSocketHandler (WebSocketHandler ):
2524 def read_http_headers (self ):
2625 headers = {}
27- # first line should be HTTP GET
2826 http_get = self .rfile .readline ().decode ().strip ()
29-
27+
3028 if not http_get .upper ().startswith ('GET' ):
31- logging .warning ("Unsupported HTTP method" )
32- response = 'HTTP/1.1 400 Bad Request\r \n \r \n '
33- with self ._send_lock :
34- self .request .sendall (response .encode ())
35- self .keep_alive = False
36- return headers
37-
38-
39- #assert http_get.upper().startswith('GET')
40- # remaining should be headers
29+ logging .info ("Unsupported HTTP method" )
30+ response = 'HTTP/1.1 405 Method Not Allowed\r \n Connection: close\r \n Content-Length: 0\r \n \r \n '
31+ try :
32+ with self ._send_lock :
33+ self .request .sendall (response .encode ())
34+ except BrokenPipeError :
35+ logging .debug ("Client closed before error response could be sent." )
36+ except Exception as e :
37+ logging .debug ("Failed to send error response: %s" , e )
38+ finally :
39+ self .keep_alive = False
40+ return headers
41+
42+ # headers lesen
4143 while True :
4244 header = self .rfile .readline ().decode ().strip ()
4345 if not header :
4446 break
45- head , value = header .split (':' , 1 )
46- headers [head .lower ().strip ()] = value .strip ()
47+ try :
48+ head , value = header .split (':' , 1 )
49+ headers [head .lower ().strip ()] = value .strip ()
50+ except ValueError :
51+ logging .debug ("Malformed header line ignored: %r" , header )
4752 return headers
4853
4954 def handshake (self ):
@@ -64,36 +69,51 @@ def handshake(self):
6469 return
6570
6671 response = self .make_handshake_response (key )
67- with self ._send_lock :
68- self .handshake_done = self .request .send (response .encode ())
72+ try :
73+ with self ._send_lock :
74+ self .handshake_done = self .request .send (response .encode ())
75+ except BrokenPipeError :
76+ logging .debug ("Client closed during handshake response." )
77+ self .keep_alive = False
78+ return
6979 self .valid_client = True
7080 self .server ._new_client_ (self )
7181 else :
72- # timeStr = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
73- # print(f"请升级到ws协议{timeStr}")
74- response = 'HTTP/1.1 400 Bad Request\r \n \r \n '
75-
76- with self ._send_lock :
77- self .request .sendall (response .encode ())
78- self .keep_alive = False
82+ # Health-Check: freundlich 200 OK und schließen
83+ body = b"OK\n "
84+ response = (
85+ 'HTTP/1.1 200 OK\r \n '
86+ 'Content-Type: text/plain; charset=utf-8\r \n '
87+ f'Content-Length: { len (body )} \r \n '
88+ 'Connection: close\r \n \r \n '
89+ ).encode () + body
90+ try :
91+ with self ._send_lock :
92+ self .request .sendall (response )
93+ except BrokenPipeError :
94+ logging .debug ("Client closed before health-check response." )
95+ except Exception as e :
96+ logging .debug ("Failed to send health-check response: %s" , e )
97+ finally :
98+ self .keep_alive = False
99+
79100
80101class Server (WebsocketServer ):
81102 def __init__ (self , host = '127.0.0.1' , port = 0 , loglevel = logging .WARNING , key = None , cert = None ):
82103 #logging.setLevel(loglevel)
83104 TCPServer .__init__ (self , (host , port ), NewWebSocketHandler )
84105 self .host = host
85106 self .port = self .socket .getsockname ()[1 ]
86-
87107 self .key = key
88108 self .cert = cert
89-
90109 self .clients = []
91110 self .id_counter = 0
92111 self .thread = None
93-
94112 self ._deny_clients = False
95113
96-
114+ def handle_error (self , request , client_address ):
115+ # Unterdrücke laute Tracebacks von erwartbaren Client-Abbrüchen
116+ logging .debug ("Suppressed client error from %s" , client_address )
97117
98118
99119class Process :
@@ -511,31 +531,6 @@ def stop(error_message: str | None = None, images=[], videos=[], files=[]):
511531 server .send_message (client , json .dumps ({"ok" : True , "service" : "stop" , "uid" : message ["uid" ]}))
512532
513533
514- def handshake (self ):
515- headers = self .read_http_headers ()
516- if 'upgrade' in headers :
517-
518- try :
519- assert headers ['upgrade' ].lower () == 'websocket'
520- except AssertionError :
521- self .keep_alive = False
522- return
523-
524- try :
525- key = headers ['sec-websocket-key' ]
526- except KeyError :
527- logger .warning ("Client tried to connect but was missing a key" )
528- self .keep_alive = False
529- return
530-
531- response = self .make_handshake_response (key )
532- with self ._send_lock :
533- self .handshake_done = self .request .send (response .encode ())
534- self .valid_client = True
535- self .server ._new_client_ (self )
536- else :
537- print ("upgrade to ws" )
538-
539534if __name__ == "__main__" :
540535 argv = sys .argv [1 :]
541536
@@ -569,7 +564,6 @@ def handshake(self):
569564 server .set_fn_new_client (new_client )
570565 server .set_fn_client_left (client_left )
571566 server .set_fn_message_received (message_received )
572- server .handshake = (handshake )
573567
574568 logging .basicConfig (level = logging .DEBUG )
575569
0 commit comments