From 5386364c8dc6d7c6c553d25919bfe8e5d2dcb2c9 Mon Sep 17 00:00:00 2001 From: kanjieater <32607317+kanjieater@users.noreply.github.com> Date: Mon, 28 Dec 2020 15:57:22 -0600 Subject: [PATCH] Server no longer hangs on client disconnects (#217) * Server no longer hangs on client disconnects * Changed timeout and am now catching errors explicitly Co-authored-by: KanjiEater --- plugin/web.py | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/plugin/web.py b/plugin/web.py index b8bd217..6c5b523 100644 --- a/plugin/web.py +++ b/plugin/web.py @@ -19,7 +19,6 @@ import socket from . import web, util - # # WebRequest # @@ -47,27 +46,38 @@ class WebClient: return False rlist, wlist = select.select([self.sock], [self.sock], [], 0)[:2] + self.sock.settimeout(5.0) if rlist: - msg = self.sock.recv(recvSize) - if not msg: - self.close() - return False + while True: + try: + msg = self.sock.recv(recvSize) + except (ConnectionResetError, socket.timeout): + self.close() + return False + if not msg: + self.close() + return False + self.readBuff += msg + + req, length = self.parseRequest(self.readBuff) + if req is not None: + self.readBuff = self.readBuff[length:] + self.writeBuff += self.handler(req) + break - self.readBuff += msg - req, length = self.parseRequest(self.readBuff) - if req is not None: - self.readBuff = self.readBuff[length:] - self.writeBuff += self.handler(req) if wlist and self.writeBuff: - length = self.sock.send(self.writeBuff) - self.writeBuff = self.writeBuff[length:] - if not self.writeBuff: + try: + length = self.sock.send(self.writeBuff) + self.writeBuff = self.writeBuff[length:] + if not self.writeBuff: + self.close() + return False + except: self.close() return False - return True @@ -200,3 +210,4 @@ class WebServer: client.close() self.clients = [] + \ No newline at end of file