Switch from gevent-websocket to gevent-ws (#2439)

* Switch from gevent-websocket to gevent-ws

* Return error handling, add gevent_ws source to lib
This commit is contained in:
Ivanq 2020-02-28 03:20:04 +03:00 committed by GitHub
parent 2862587c15
commit 219b90668f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 268 additions and 24 deletions

View file

@ -814,7 +814,7 @@ class UiRequest(object):
# Remove websocket from every site (admin sites allowed to join other sites event channels)
if ui_websocket in site_check.websockets:
site_check.websockets.remove(ui_websocket)
return "Bye."
return [b"Bye."]
else: # No site found by wrapper key
ws.send(json.dumps({"error": "Wrapper key not found: %s" % wrapper_key}))
return self.error403("Wrapper key not found: %s" % wrapper_key)

View file

@ -5,8 +5,7 @@ import socket
import gevent
from gevent.pywsgi import WSGIServer
from gevent.pywsgi import WSGIHandler
from geventwebsocket.handler import WebSocketHandler
from lib.gevent_ws import WebSocketHandler
from .UiRequest import UiRequest
from Site import SiteManager
@ -27,7 +26,7 @@ class LogDb(logging.StreamHandler):
# Skip websocket handler if not necessary
class UiWSGIHandler(WSGIHandler):
class UiWSGIHandler(WebSocketHandler):
def __init__(self, *args, **kwargs):
self.server = args[2]
@ -46,24 +45,14 @@ class UiWSGIHandler(WSGIHandler):
self.write(block)
def run_application(self):
if "HTTP_UPGRADE" in self.environ: # Websocket request
try:
ws_handler = WebSocketHandler(*self.args, **self.kwargs)
ws_handler.__dict__ = self.__dict__ # Match class variables
ws_handler.run_application()
except (ConnectionAbortedError, ConnectionResetError) as err:
logging.warning("UiWSGIHandler websocket connection error: %s" % err)
except Exception as err:
logging.error("UiWSGIHandler websocket error: %s" % Debug.formatException(err))
self.handleError(err)
else: # Standard HTTP request
try:
super(UiWSGIHandler, self).run_application()
except (ConnectionAbortedError, ConnectionResetError) as err:
logging.warning("UiWSGIHandler connection error: %s" % err)
except Exception as err:
logging.error("UiWSGIHandler error: %s" % Debug.formatException(err))
self.handleError(err)
err_name = "UiWSGIHandler websocket" if "HTTP_UPGRADE" in self.environ else "UiWSGIHandler"
try:
super(UiWSGIHandler, self).run_application()
except (ConnectionAbortedError, ConnectionResetError) as err:
logging.warning("%s connection error: %s" % (err_name, err))
except Exception as err:
logging.warning("%s error: %s" % (err_name, Debug.formatException(err)))
self.handleError(err)
def handle(self):
# Save socket to be able to close them properly on exit