diff options
author | Rob Austein <sra@hactrn.net> | 2009-05-08 21:06:12 +0000 |
---|---|---|
committer | Rob Austein <sra@hactrn.net> | 2009-05-08 21:06:12 +0000 |
commit | 3a449c7e7ada7c0f58a2b45b1ad8b492f912bea3 (patch) | |
tree | c8dbdf053b41c1d79242ce31e95a975392e705cc | |
parent | 8d50115ec84fdc0576161213472f82e1c17bee16 (diff) |
Checkpoint
svn path=/rpkid/rpki/https.py; revision=2411
-rw-r--r-- | rpkid/rpki/https.py | 70 |
1 files changed, 35 insertions, 35 deletions
diff --git a/rpkid/rpki/https.py b/rpkid/rpki/https.py index 01098ff4..860b8d22 100644 --- a/rpkid/rpki/https.py +++ b/rpkid/rpki/https.py @@ -267,9 +267,9 @@ class http_stream(asynchat.async_chat): self.handle_message() def handle_error(self): - self.log("Error in HTTP stream handler") print traceback.format_exc() - #asyncore.close_all() + self.log("Error in HTTP stream handler, closing") + self.close() def handle_timeout(self): self.log("Timeout, closing") @@ -349,21 +349,30 @@ class http_listener(asyncore.dispatcher): def __init__(self, handlers, port = 80, host = ""): asyncore.dispatcher.__init__(self) self.handlers = handlers - self.create_socket(socket.AF_INET, socket.SOCK_STREAM) - self.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - self.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) - self.bind((host, port)) - self.listen(5) + try: + self.create_socket(socket.AF_INET, socket.SOCK_STREAM) + self.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) + self.bind((host, port)) + self.listen(5) + except asyncore.ExitNow: + raise + except: + self.handle_error() self.log("Listening on %r, handlers %r" % ((host, port), handlers)) def handle_accept(self): self.log("Accepting connection") - server = http_server(conn = self.accept()[0], handlers = self.handlers) + try: + http_server(conn = self.accept()[0], handlers = self.handlers) + except asyncore.ExitNow: + raise + except: + self.handle_error() def handle_error(self): self.log("Error in HTTP listener") print traceback.format_exc() - #asyncore.close_all() class http_client(http_stream): @@ -373,10 +382,16 @@ class http_client(http_stream): self.log("Creating new connection to %s" % repr(hostport)) http_stream.__init__(self) self.queue = queue + self.hostport = hostport self.state = "idle" self.expect_close = not want_persistent_client - self.create_socket(socket.AF_INET, socket.SOCK_STREAM) - self.connect(hostport) + + def start(self): + try: + self.create_socket(socket.AF_INET, socket.SOCK_STREAM) + self.connect(self.hostport) + except: + self.handle_error() def handle_no_content_length(self): self.set_terminator(None) @@ -457,6 +472,13 @@ class http_client(http_stream): http_stream.handle_timeout(self) self.queue.closing(self) + def handle_error(self): + http_stream.handle_error(self) + self.queue.closing(self) + # + # May need to call request's errback function here. + # This whole queuing business sure complicates matters. + class http_queue(object): log = logger @@ -474,6 +496,7 @@ class http_queue(object): if self.client is None: self.client = http_client(self, self.hostport) self.log("Spawned connection %r" % self.client) + self.client.start() elif need_kick: self.client.kickstart() @@ -494,6 +517,7 @@ class http_queue(object): self.log("Queue not empty but connection not usable, spawning") self.client = http_client(self, self.hostport) self.log("Spawned connection %r" % self.client) + self.client.start() return None def closing(self, client): @@ -501,30 +525,6 @@ class http_queue(object): self.log("Removing client") self.client = None - # This is both nasty and, perhaps, entirely unnecessary. I - # originally added it for retry of failed persistent - # connections, but am less and less convinced that it's useful. - # - # For the moment, I have persistent connections disabled, so - # disabling this code should be harmless. - - if True: - return - - if not self.queue: - self.log("Queue is empty") - else: - try: - self.queue[0].retry() - except asyncore.ExitNow: - raise - except: - self.log("Queue is not empty, but request has already been transmitted, giving up") - raise - else: - self.log("Queue is not empty, starting new client") - self.client = http_client(self, self.hostport) - queues = {} def default_client_errback(e): |