mitmproxy/libpathod/language/__init__.py

89 lines
2.2 KiB
Python
Raw Normal View History

import time
import pyparsing as pp
from . import base, http, websockets, writer, exceptions
from exceptions import *
class Settings:
def __init__(
self,
staticdir = None,
unconstrained_file_access = False,
request_host = None,
websocket_key = None
):
self.staticdir = staticdir
self.unconstrained_file_access = unconstrained_file_access
self.request_host = request_host
self.websocket_key = websocket_key
def parse_response(s):
"""
May raise ParseException
"""
try:
s = s.decode("ascii")
except UnicodeError:
raise exceptions.ParseException("Spec must be valid ASCII.", 0, 0)
try:
return http.Response.expr().parseString(s, parseAll=True)[0]
except pp.ParseException, v:
raise exceptions.ParseException(v.msg, v.line, v.col)
def parse_requests(s):
"""
May raise ParseException
"""
try:
s = s.decode("ascii")
except UnicodeError:
raise exceptions.ParseException("Spec must be valid ASCII.", 0, 0)
try:
return pp.OneOrMore(
pp.Or(
[
websockets.WebsocketFrame.expr(),
http.Request.expr(),
]
)
).parseString(s, parseAll=True)
except pp.ParseException, v:
raise exceptions.ParseException(v.msg, v.line, v.col)
def serve(msg, fp, settings):
"""
fp: The file pointer to write to.
request_host: If this a request, this is the connecting host. If
None, we assume it's a response. Used to decide what standard
modifications to make if raw is not set.
Calling this function may modify the object.
"""
msg = msg.resolve(settings)
started = time.time()
vals = msg.values(settings)
vals.reverse()
actions = msg.actions[:]
actions.sort()
actions.reverse()
actions = [i.intermediate(settings) for i in actions]
disconnect = writer.write_values(fp, vals, actions[:])
duration = time.time() - started
ret = dict(
disconnect = disconnect,
started = started,
duration = duration,
)
ret.update(msg.log(settings))
return ret