diff options
author | Aldo Cortesi <aldo@nullcube.com> | 2012-04-28 14:43:57 +1200 |
---|---|---|
committer | Aldo Cortesi <aldo@nullcube.com> | 2012-04-28 14:43:57 +1200 |
commit | 5fc2a63781e554030da9877e8ee56eccc4c873f6 (patch) | |
tree | 797fb8ccb74a577b11ad2f8ef577e68d0b31ab0b /libpathod/rparse.py | |
parent | 2c8f17eae7b23b7c252bead15ba9bf043f03e8d2 (diff) | |
download | mitmproxy-5fc2a63781e554030da9877e8ee56eccc4c873f6.tar.gz mitmproxy-5fc2a63781e554030da9877e8ee56eccc4c873f6.tar.bz2 mitmproxy-5fc2a63781e554030da9877e8ee56eccc4c873f6.zip |
Better internal error pages.
Diffstat (limited to 'libpathod/rparse.py')
-rw-r--r-- | libpathod/rparse.py | 47 |
1 files changed, 32 insertions, 15 deletions
diff --git a/libpathod/rparse.py b/libpathod/rparse.py index d1714fb8..5c6d0257 100644 --- a/libpathod/rparse.py +++ b/libpathod/rparse.py @@ -5,7 +5,17 @@ import tornado.ioloop TESTING = False -class ParseException(Exception): pass +class ParseException(Exception): + def __init__(self, msg, s, col): + Exception.__init__(self) + self.msg = msg + self.s = s + self.col = col + + def marked(self): + return "%s\n%s"%(self.s, " "*(self.col-1) + "^") + + class ServerError(Exception): pass @@ -304,19 +314,9 @@ class Response: code = 200 msg = LiteralGenerator(http.RESPONSES[code]) body = LiteralGenerator("OK") - def __init__(self, settings, tokens): - self.tokens = tokens + def __init__(self): self.headers = [] self.pauses = [] - for i in tokens: - i.mod_response(settings, self) - if self.body and not self.get_header("Content-Length"): - self.headers.append( - ( - LiteralGenerator("Content-Length"), - LiteralGenerator(str(len(self.body))), - ) - ) def get_header(self, hdr): for k, v in self.headers: @@ -393,6 +393,14 @@ class Response: fp.finish() def render(self, fp): + if self.body and not self.get_header("Content-Length"): + self.headers.append( + ( + LiteralGenerator("Content-Length"), + LiteralGenerator(str(len(self.body))), + ) + ) + hdrs = [] for k, v in self.headers: hdrs.extend([ @@ -423,8 +431,17 @@ class Response: return "\n".join(parts) -class StubResponse: +class CraftedResponse(Response): + def __init__(self, settings, tokens): + Response.__init__(self) + self.tokens = tokens + for i in tokens: + i.mod_response(settings, self) + + +class InternalResponse(Response): def __init__(self, code, body): + Response.__init__(self) self.code = code self.msg = LiteralGenerator(http.RESPONSES.get(code, "Unknown error")) self.body = LiteralGenerator(body) @@ -442,6 +459,6 @@ class StubResponse: def parse(settings, s): try: - return Response(settings, Response.expr().parseString(s, parseAll=True)) + return CraftedResponse(settings, Response.expr().parseString(s, parseAll=True)) except pp.ParseException, v: - raise ParseException(v) + raise ParseException(v.msg, v.line, v.col) |