aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rpkid/rpki/exceptions.py3
-rw-r--r--rpkid/rpki/https.py27
2 files changed, 26 insertions, 4 deletions
diff --git a/rpkid/rpki/exceptions.py b/rpkid/rpki/exceptions.py
index c3638375..f5aca3aa 100644
--- a/rpkid/rpki/exceptions.py
+++ b/rpkid/rpki/exceptions.py
@@ -145,3 +145,6 @@ class BadExtension(RPKI_Exception):
class ForbiddenURI(RPKI_Exception):
"""Forbidden URI, does not start with correct base URI."""
+
+class HTTPSRetryFailure(RPKI_Exception):
+ """HTTPS connection failed and request has already been retried."""
diff --git a/rpkid/rpki/https.py b/rpkid/rpki/https.py
index 45f2a213..97c3678d 100644
--- a/rpkid/rpki/https.py
+++ b/rpkid/rpki/https.py
@@ -137,6 +137,13 @@ class http_request(http_message):
self.cmd = cmd
self.path = path
self.callback = callback
+ self.retried = False
+
+ def retry(self):
+ if self.retried:
+ raise rpki.exceptions.HTTPSRetryFailure
+ else:
+ self.retried = True
def parse_first_line(self, cmd, path, version):
self.parse_version(version)
@@ -214,7 +221,6 @@ class http_stream(asynchat.async_chat):
elif not isinstance(self.get_terminator(), str):
self.handle_body()
else:
- self.log("Got headers")
self.msg = self.parse_type.parse_from_wire(self.get_buffer())
if self.msg.version == (1, 1) and "chunked" in self.msg.headers.get("Transfer-Encoding", "").lower():
self.msg.body = []
@@ -304,7 +310,10 @@ class http_server(http_stream):
elif handler is None:
error = 404, "No handler for URL %s" % self.msg.path
if error is None:
- handler(self.msg.body, self.msg.path, self.send_reply)
+ try:
+ handler(self.msg.body, self.msg.path, self.send_reply)
+ except Exception, edata:
+ self.send_error(500, "Unhandled exception %s" % edata)
else:
self.send_error(*error)
@@ -475,8 +484,18 @@ class http_queue(object):
def closing(self, client):
if client is self.client:
self.log("Removing client")
- self.client = None
-
+ if not self.queue:
+ self.log("Queue is empty")
+ self.client = None
+ else:
+ try:
+ self.queue[0].retry()
+ 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 = {}