1
0
mirror of https://github.com/webrecorder/pywb.git synced 2025-03-28 00:25:21 +01:00
pywb/pywb/utils/geventserver.py
John Berlin 3e7ec05cfe Updated the gevent requirement: (#347)
- Removed strict version limit (1.2.2), using latest gevent
- changed the import "gevent.wsgi" to "gevent.pywsgi" (needed in latest gevent)
- Installing with extra requirement gevent[dnspython] (existing dns resolver in gevent considered deprecated)
2018-07-09 11:28:11 -07:00

48 lines
1.5 KiB
Python

from gevent.pywsgi import WSGIServer, WSGIHandler
from gevent import spawn
import logging
# ============================================================================
class GeventServer(object):
def __init__(self, app, port=0, hostname='localhost', handler_class=None,
direct=False):
self.port = port
self.make_server(app, port, hostname, handler_class, direct=direct)
def stop(self):
if self.server:
logging.debug('stopping server on ' + str(self.port))
self.server.stop()
def _run(self, server, port):
logging.debug('starting server on ' + str(port))
try:
server.serve_forever()
except Exception as e:
logging.debug('server failed to start on ' + str(port))
traceback.print_exc()
def make_server(self, app, port, hostname, handler_class, direct=False):
server = WSGIServer((hostname, port), app, handler_class=handler_class)
server.init_socket()
self.port = server.address[1]
self.server = server
if direct:
self.ge = None
self._run(server, self.port)
else:
self.ge = spawn(self._run, server, self.port)
def join(self):
self.ge.join()
# ============================================================================
class RequestURIWSGIHandler(WSGIHandler):
def get_environ(self):
environ = super(RequestURIWSGIHandler, self).get_environ()
environ['REQUEST_URI'] = self.path
return environ