mirror of
https://github.com/Grasscutters/mitmproxy.git
synced 2024-11-23 08:11:00 +00:00
60 lines
2.1 KiB
Python
60 lines
2.1 KiB
Python
import urllib
|
|
from netlib import tcp, protocol, odict, wsgi
|
|
import version, app, rparse
|
|
|
|
|
|
class PathodHandler(tcp.BaseHandler):
|
|
def handle(self):
|
|
if self.server.ssloptions:
|
|
self.convert_to_ssl(
|
|
self.server.ssloptions["certfile"],
|
|
self.server.ssloptions["keyfile"],
|
|
)
|
|
|
|
line = self.rfile.readline()
|
|
if line == "\r\n" or line == "\n": # Possible leftover from previous message
|
|
line = self.rfile.readline()
|
|
if line == "":
|
|
return None
|
|
|
|
method, path, httpversion = protocol.parse_init_http(line)
|
|
headers = odict.ODictCaseless(protocol.read_headers(self.rfile))
|
|
content = protocol.read_http_body_request(
|
|
self.rfile, self.wfile, headers, httpversion, None
|
|
)
|
|
if path.startswith(self.server.prefix):
|
|
spec = urllib.unquote(path)[len(self.server.prefix):]
|
|
try:
|
|
presp = rparse.parse({}, spec)
|
|
except rparse.ParseException, v:
|
|
presp = rparse.InternalResponse(
|
|
800,
|
|
"Error parsing response spec: %s\n"%v.msg + v.marked()
|
|
)
|
|
ret = presp.serve(self.wfile)
|
|
if ret["disconnect"]:
|
|
self.close()
|
|
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)
|
|
|
|
|
|
class Pathod(tcp.TCPServer):
|
|
def __init__(self, addr, ssloptions=None, prefix="/p/"):
|
|
tcp.TCPServer.__init__(self, addr)
|
|
self.ssloptions = ssloptions
|
|
self.prefix = prefix
|
|
self.app = app.app
|
|
self.app.config["pathod"] = self
|
|
|
|
def handle_connection(self, request, client_address):
|
|
PathodHandler(request, client_address, self)
|