mitmproxy/pathod/app.py

181 lines
4.8 KiB
Python
Raw Normal View History

import logging
import pprint
2016-05-10 20:37:57 +00:00
import io
import copy
from flask import Flask, jsonify, render_template, request, abort, make_response
from . import version, language
2015-07-15 20:04:25 +00:00
from netlib.http import user_agents
from netlib import strutils
2012-06-21 04:25:27 +00:00
logging.basicConfig(level="DEBUG")
2015-04-22 19:29:55 +00:00
EXAMPLE_HOST = "example.com"
EXAMPLE_WEBSOCKET_KEY = "examplekey"
2015-06-18 16:05:09 +00:00
# pylint: disable=unused-variable
2015-06-18 16:12:11 +00:00
def make_app(noapi, debug):
app = Flask(__name__)
app.debug = debug
2012-06-19 04:57:57 +00:00
if not noapi:
@app.route('/api/info')
def api_info():
return jsonify(
2015-06-18 16:12:11 +00:00
version=version.IVERSION
)
2012-06-19 04:57:57 +00:00
@app.route('/api/log')
def api_log():
return jsonify(
2015-06-18 16:12:11 +00:00
log=app.config["pathod"].get_log()
)
2012-06-19 01:23:07 +00:00
@app.route('/api/clear_log')
def api_clear_log():
app.config["pathod"].clear_log()
return "OK"
2012-06-19 01:23:07 +00:00
def render(s, cacheable, **kwargs):
kwargs["noapi"] = app.config["pathod"].noapi
kwargs["nocraft"] = app.config["pathod"].nocraft
kwargs["craftanchor"] = app.config["pathod"].craftanchor
resp = make_response(render_template(s, **kwargs), 200)
if cacheable:
resp.headers["Cache-control"] = "public, max-age=4320"
return resp
2012-07-24 10:27:04 +00:00
@app.route('/')
@app.route('/index.html')
def index():
return render(
"index.html",
True,
section="main",
version=version.VERSION
)
2012-07-24 23:55:44 +00:00
@app.route('/download')
@app.route('/download.html')
def download():
return render(
"download.html", True, section="download", version=version.VERSION
)
2012-08-23 00:54:58 +00:00
@app.route('/about')
@app.route('/about.html')
def about():
return render("about.html", True, section="about")
@app.route('/docs/pathod')
def docs_pathod():
return render(
"docs_pathod.html", True, section="docs", subsection="pathod"
)
2012-06-28 23:53:59 +00:00
@app.route('/docs/language')
def docs_language():
2013-05-01 21:11:16 +00:00
return render(
"docs_lang.html", True,
2015-07-15 20:04:25 +00:00
section="docs", uastrings=user_agents.UASTRINGS,
2013-05-01 21:11:16 +00:00
subsection="lang"
)
2012-07-22 10:24:16 +00:00
@app.route('/docs/pathoc')
def docs_pathoc():
return render(
"docs_pathoc.html", True, section="docs", subsection="pathoc"
)
2012-06-28 23:53:59 +00:00
2016-02-16 19:59:33 +00:00
@app.route('/docs/lib_pathod')
def docs_lib_pathod():
return render(
2016-02-16 19:59:33 +00:00
"docs_lib_pathod.html", True, section="docs", subsection="pathod"
)
2012-10-03 23:17:35 +00:00
@app.route('/docs/test')
def docs_test():
return render(
"docs_test.html", True, section="docs", subsection="test"
)
@app.route('/log')
def log():
if app.config["pathod"].noapi:
abort(404)
return render(
"log.html",
False,
section="log",
log=app.config["pathod"].get_log()
)
2012-06-21 04:25:27 +00:00
@app.route('/log/<int:lid>')
def onelog(lid):
item = app.config["pathod"].log_by_id(int(lid))
if not item:
abort(404)
l = pprint.pformat(item)
return render("onelog.html", False, section="log", alog=l, lid=lid)
def _preview(is_request):
if is_request:
template = "request_preview.html"
else:
template = "response_preview.html"
spec = request.args["spec"]
args = dict(
2015-06-18 16:12:11 +00:00
spec=spec,
section="main",
syntaxerror=None,
error=None,
)
if not spec.strip():
args["error"] = "Can't parse an empty spec."
return render(template, False, **args)
try:
if is_request:
r = language.parse_pathoc(spec).next()
else:
2015-06-07 04:11:32 +00:00
r = language.parse_pathod(spec).next()
2015-05-30 00:03:13 +00:00
except language.ParseException as v:
args["syntaxerror"] = str(v)
args["marked"] = v.marked()
return render(template, False, **args)
2016-05-10 20:37:57 +00:00
s = io.BytesIO()
2015-04-22 19:29:55 +00:00
2015-06-18 16:05:09 +00:00
settings = copy.copy(app.config["pathod"].settings)
settings.request_host = EXAMPLE_HOST
settings.websocket_key = EXAMPLE_WEBSOCKET_KEY
2015-04-22 19:29:55 +00:00
safe = r.preview_safe()
err, safe = app.config["pathod"].check_policy(
safe,
2015-06-18 16:05:09 +00:00
settings
)
if err:
args["error"] = err
return render(template, False, **args)
if is_request:
2015-06-18 16:05:09 +00:00
settings.request_host = EXAMPLE_HOST
language.serve(safe, s, settings)
else:
2015-06-18 16:05:09 +00:00
settings.websocket_key = EXAMPLE_WEBSOCKET_KEY
language.serve(safe, s, settings)
2012-10-27 20:06:55 +00:00
args["output"] = strutils.bytes_to_escaped_str(s.getvalue())
return render(template, False, **args)
@app.route('/response_preview')
def response_preview():
return _preview(False)
@app.route('/request_preview')
def request_preview():
return _preview(True)
return app