mirror of
https://github.com/Mikaela/Limnoria.git
synced 2025-02-04 16:44:11 +01:00
httpserver: Fix circular dependency when servers.http.keepAlive is true.
This commit is contained in:
parent
fd702a6a92
commit
5c5cad5851
@ -164,58 +164,6 @@ def get_template(filename):
|
|||||||
with open(path + '.example', 'r') as fd:
|
with open(path + '.example', 'r') as fd:
|
||||||
return fd.read()
|
return fd.read()
|
||||||
|
|
||||||
class RealSupyHTTPServer(HTTPServer):
|
|
||||||
# TODO: make this configurable
|
|
||||||
timeout = 0.5
|
|
||||||
running = False
|
|
||||||
|
|
||||||
def __init__(self, address, protocol, callback):
|
|
||||||
self.protocol = protocol
|
|
||||||
if protocol == 4:
|
|
||||||
self.address_family = socket.AF_INET
|
|
||||||
elif protocol == 6:
|
|
||||||
self.address_family = socket.AF_INET6
|
|
||||||
else:
|
|
||||||
raise AssertionError(protocol)
|
|
||||||
HTTPServer.__init__(self, address, callback)
|
|
||||||
self.callbacks = DEFAULT_CALLBACKS
|
|
||||||
|
|
||||||
def server_bind(self):
|
|
||||||
if self.protocol == 6:
|
|
||||||
v = conf.supybot.servers.http.singleStack()
|
|
||||||
self.socket.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, v)
|
|
||||||
HTTPServer.server_bind(self)
|
|
||||||
|
|
||||||
def hook(self, subdir, callback):
|
|
||||||
if subdir in self.callbacks:
|
|
||||||
log.warning(('The HTTP subdirectory `%s` was already hooked but '
|
|
||||||
'has been claimed by another plugin (or maybe you '
|
|
||||||
'reloaded the plugin and it didn\'t properly unhook. '
|
|
||||||
'Forced unhook.') % subdir)
|
|
||||||
self.callbacks[subdir] = callback
|
|
||||||
callback.doHook(self, subdir)
|
|
||||||
def unhook(self, subdir):
|
|
||||||
callback = self.callbacks.pop(subdir, None)
|
|
||||||
if callback:
|
|
||||||
callback.doUnhook(self)
|
|
||||||
return callback
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return 'server at %s %i' % self.server_address[0:2]
|
|
||||||
|
|
||||||
class TestSupyHTTPServer(RealSupyHTTPServer):
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
self.callbacks = {}
|
|
||||||
def serve_forever(self, *args, **kwargs):
|
|
||||||
pass
|
|
||||||
def shutdown(self, *args, **kwargs):
|
|
||||||
pass
|
|
||||||
|
|
||||||
if world.testing:
|
|
||||||
SupyHTTPServer = TestSupyHTTPServer
|
|
||||||
else:
|
|
||||||
SupyHTTPServer = RealSupyHTTPServer
|
|
||||||
|
|
||||||
class SupyHTTPRequestHandler(BaseHTTPRequestHandler):
|
class SupyHTTPRequestHandler(BaseHTTPRequestHandler):
|
||||||
def do_X(self, callbackMethod, *args, **kwargs):
|
def do_X(self, callbackMethod, *args, **kwargs):
|
||||||
if self.path == '/':
|
if self.path == '/':
|
||||||
@ -452,6 +400,62 @@ class SupyWellKnown(SupyHTTPServerCallback):
|
|||||||
handler.send_response(404)
|
handler.send_response(404)
|
||||||
self.end_headers()
|
self.end_headers()
|
||||||
|
|
||||||
|
|
||||||
|
DEFAULT_CALLBACKS = {'.well-known': SupyWellKnown()}
|
||||||
|
|
||||||
|
|
||||||
|
class RealSupyHTTPServer(HTTPServer):
|
||||||
|
# TODO: make this configurable
|
||||||
|
timeout = 0.5
|
||||||
|
running = False
|
||||||
|
|
||||||
|
def __init__(self, address, protocol, callback):
|
||||||
|
self.protocol = protocol
|
||||||
|
if protocol == 4:
|
||||||
|
self.address_family = socket.AF_INET
|
||||||
|
elif protocol == 6:
|
||||||
|
self.address_family = socket.AF_INET6
|
||||||
|
else:
|
||||||
|
raise AssertionError(protocol)
|
||||||
|
HTTPServer.__init__(self, address, callback)
|
||||||
|
self.callbacks = DEFAULT_CALLBACKS.copy()
|
||||||
|
|
||||||
|
def server_bind(self):
|
||||||
|
if self.protocol == 6:
|
||||||
|
v = conf.supybot.servers.http.singleStack()
|
||||||
|
self.socket.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, v)
|
||||||
|
HTTPServer.server_bind(self)
|
||||||
|
|
||||||
|
def hook(self, subdir, callback):
|
||||||
|
if subdir in self.callbacks:
|
||||||
|
log.warning(('The HTTP subdirectory `%s` was already hooked but '
|
||||||
|
'has been claimed by another plugin (or maybe you '
|
||||||
|
'reloaded the plugin and it didn\'t properly unhook. '
|
||||||
|
'Forced unhook.') % subdir)
|
||||||
|
self.callbacks[subdir] = callback
|
||||||
|
callback.doHook(self, subdir)
|
||||||
|
def unhook(self, subdir):
|
||||||
|
callback = self.callbacks.pop(subdir, None)
|
||||||
|
if callback:
|
||||||
|
callback.doUnhook(self)
|
||||||
|
return callback
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return 'server at %s %i' % self.server_address[0:2]
|
||||||
|
|
||||||
|
class TestSupyHTTPServer(RealSupyHTTPServer):
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
self.callbacks = {}
|
||||||
|
def serve_forever(self, *args, **kwargs):
|
||||||
|
pass
|
||||||
|
def shutdown(self, *args, **kwargs):
|
||||||
|
pass
|
||||||
|
|
||||||
|
if world.testing:
|
||||||
|
SupyHTTPServer = TestSupyHTTPServer
|
||||||
|
else:
|
||||||
|
SupyHTTPServer = RealSupyHTTPServer
|
||||||
|
|
||||||
http_servers = []
|
http_servers = []
|
||||||
|
|
||||||
def startServer():
|
def startServer():
|
||||||
@ -499,5 +503,3 @@ def unhook(subdir):
|
|||||||
and not configGroup.keepAlive():
|
and not configGroup.keepAlive():
|
||||||
server.shutdown()
|
server.shutdown()
|
||||||
http_servers.remove(server)
|
http_servers.remove(server)
|
||||||
|
|
||||||
DEFAULT_CALLBACKS = {'.well-known': SupyWellKnown()}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user