Skip to content

Commit 796602d

Browse files
fixed: loud error logs
1 parent fbfbf35 commit 796602d

2 files changed

Lines changed: 54 additions & 59 deletions

File tree

README.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ window.CodeRunner = {
1717
error: "",
1818
url: "",
1919
firstConnection: true,
20+
pingTimer: null,
2021
2122
init(url, step = 0) {
2223
this.url = url
@@ -39,11 +40,10 @@ window.CodeRunner = {
3940
this.ws.onopen = function () {
4041
clearTimeout(connectionTimeout);
4142
self.log("connections established");
42-
4343
self.connected = true
44-
45-
setInterval(function() {
46-
self.ws.send("ping")
44+
if (self.pingTimer) clearInterval(self.pingTimer)
45+
self.pingTimer = setInterval(function() {
46+
try { self.ws.send("ping") } catch (_) {}
4747
}, 15000);
4848
}
4949
this.ws.onmessage = function (e) {
@@ -61,16 +61,17 @@ window.CodeRunner = {
6161
}
6262
this.ws.onclose = function () {
6363
clearTimeout(connectionTimeout);
64+
if (self.pingTimer) { clearInterval(self.pingTimer); self.pingTimer = null }
6465
self.connected = false
6566
self.warn("connection closed ... reconnecting")
66-
6767
setTimeout(function(){
6868
console.warn("....", step+1)
6969
self.init(url, step+1)
7070
}, 1000)
7171
}
7272
this.ws.onerror = function (e) {
7373
clearTimeout(connectionTimeout);
74+
if (self.pingTimer) { clearInterval(self.pingTimer); self.pingTimer = null }
7475
self.warn("an error has occurred")
7576
}
7677
},

server.py

Lines changed: 48 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -20,30 +20,35 @@
2020

2121
coloredlogs.install()
2222

23-
2423
class 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\nConnection: close\r\nContent-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

80101
class 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

99119
class 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-
539534
if __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

Comments
 (0)