diff options
author | Aldo Cortesi <aldo@nullcube.com> | 2012-06-24 23:11:25 +1200 |
---|---|---|
committer | Aldo Cortesi <aldo@nullcube.com> | 2012-06-24 23:11:25 +1200 |
commit | 15c48cfc5e8bc48cc8739a8f5184b1fa18d39f36 (patch) | |
tree | ee7bc6ec93fba358b59529cb86c5d93552373236 /libpathod/pathod.py | |
parent | a747043cc81bd6413b6c85b2517530caf38e8a54 (diff) | |
download | mitmproxy-15c48cfc5e8bc48cc8739a8f5184b1fa18d39f36.tar.gz mitmproxy-15c48cfc5e8bc48cc8739a8f5184b1fa18d39f36.tar.bz2 mitmproxy-15c48cfc5e8bc48cc8739a8f5184b1fa18d39f36.zip |
Simple HTTP connection keep-alive for pathod.
Diffstat (limited to 'libpathod/pathod.py')
-rw-r--r-- | libpathod/pathod.py | 101 |
1 files changed, 51 insertions, 50 deletions
diff --git a/libpathod/pathod.py b/libpathod/pathod.py index e35769b1..bc2bf6af 100644 --- a/libpathod/pathod.py +++ b/libpathod/pathod.py @@ -14,59 +14,60 @@ class PathodHandler(tcp.BaseHandler): self.server.ssloptions["keyfile"], ) - line = self.rfile.readline() - if line == "\r\n" or line == "\n": # Possible leftover from previous message + while 1: line = self.rfile.readline() - if line == "": - return None - - method, path, httpversion = http.parse_init_http(line) - headers = http.read_headers(self.rfile) - content = http.read_http_body_request( - self.rfile, self.wfile, headers, httpversion, None + if line == "\r\n" or line == "\n": # Possible leftover from previous message + line = self.rfile.readline() + if line == "": + return None + + method, path, httpversion = http.parse_init_http(line) + headers = http.read_headers(self.rfile) + content = http.read_http_body_request( + self.rfile, self.wfile, headers, httpversion, None + ) + + crafted = None + for i in self.server.anchors: + if i[0].match(path): + crafted = i[1] + + if not crafted and path.startswith(self.server.prefix): + spec = urllib.unquote(path)[len(self.server.prefix):] + try: + crafted = rparse.parse_response(self.server.request_settings, spec) + except rparse.ParseException, v: + crafted = rparse.InternalResponse( + 800, + "Error parsing response spec: %s\n"%v.msg + v.marked() + ) + + if crafted: + ret = crafted.serve(self.wfile) + if ret["disconnect"]: + self.finish() + ret["request"] = dict( + path = path, + method = method, + headers = headers.lst, + #remote_address = self.request.connection.address, + #full_url = self.request.full_url(), + #query = self.request.query, + httpversion = httpversion, + #uri = self.request.uri, ) - - crafted = None - for i in self.server.anchors: - if i[0].match(path): - crafted = i[1] - - if not crafted and path.startswith(self.server.prefix): - spec = urllib.unquote(path)[len(self.server.prefix):] - try: - crafted = rparse.parse_response(self.server.request_settings, spec) - except rparse.ParseException, v: - crafted = rparse.InternalResponse( - 800, - "Error parsing response spec: %s\n"%v.msg + v.marked() + self.server.add_log(ret) + else: + cc = wsgi.ClientConn(self.client_address) + req = wsgi.Request(cc, "http", method, path, headers, content) + sn = self.connection.getsockname() + app = wsgi.WSGIAdaptor( + self.server.app, + sn[0], + self.server.port, + version.NAMEVERSION ) - - if crafted: - ret = crafted.serve(self.wfile) - if ret["disconnect"]: - self.finish() - ret["request"] = dict( - path = path, - method = method, - headers = headers.lst, - #remote_address = self.request.connection.address, - #full_url = self.request.full_url(), - #query = self.request.query, - httpversion = httpversion, - #uri = self.request.uri, - ) - self.server.add_log(ret) - else: - cc = wsgi.ClientConn(self.client_address) - req = wsgi.Request(cc, "http", method, path, headers, content) - sn = self.connection.getsockname() - app = wsgi.WSGIAdaptor( - self.server.app, - sn[0], - self.server.port, - version.NAMEVERSION - ) - app.serve(req, self.wfile) + app.serve(req, self.wfile) class Pathod(tcp.TCPServer): |