diff options
author | Aldo Cortesi <aldo@nullcube.com> | 2012-06-24 17:01:04 +1200 |
---|---|---|
committer | Aldo Cortesi <aldo@nullcube.com> | 2012-06-24 17:01:04 +1200 |
commit | d4ad3f0b2cc5ae878108e13e86679fac2abaedb2 (patch) | |
tree | 5341869d10a041fb785f576418a5bc032341730b /libpathod | |
parent | 05f5e772c3f59c9be40132eb7afd4f049ced140a (diff) | |
download | mitmproxy-d4ad3f0b2cc5ae878108e13e86679fac2abaedb2.tar.gz mitmproxy-d4ad3f0b2cc5ae878108e13e86679fac2abaedb2.tar.bz2 mitmproxy-d4ad3f0b2cc5ae878108e13e86679fac2abaedb2.zip |
Refactor to extract ready_actions and write_values.
Diffstat (limited to 'libpathod')
-rw-r--r-- | libpathod/pathod.py | 4 | ||||
-rw-r--r-- | libpathod/rparse.py | 95 |
2 files changed, 53 insertions, 46 deletions
diff --git a/libpathod/pathod.py b/libpathod/pathod.py index ba537768..c84be420 100644 --- a/libpathod/pathod.py +++ b/libpathod/pathod.py @@ -33,7 +33,7 @@ class PathodHandler(tcp.BaseHandler): if not crafted and path.startswith(self.server.prefix): spec = urllib.unquote(path)[len(self.server.prefix):] try: - crafted = rparse.parse(self.server.request_settings, spec) + crafted = rparse.parse_response(self.server.request_settings, spec) except rparse.ParseException, v: crafted = rparse.InternalResponse( 800, @@ -95,7 +95,7 @@ class Pathod(tcp.TCPServer): except re.error: raise PathodError("Invalid regex in anchor: %s"%i[0]) try: - aresp = rparse.parse(self.request_settings, i[1]) + aresp = rparse.parse_response(self.request_settings, i[1]) except rparse.ParseException, v: raise PathodError("Invalid page spec in anchor: '%s', %s"%(i[1], str(v))) self.anchors.append((arex, aresp)) diff --git a/libpathod/rparse.py b/libpathod/rparse.py index 8a407388..91ba6356 100644 --- a/libpathod/rparse.py +++ b/libpathod/rparse.py @@ -2,6 +2,8 @@ import operator, string, random, mmap, os, time import contrib.pyparsing as pp from netlib import http_status +BLOCKSIZE = 1024 + class ParseException(Exception): def __init__(self, msg, s, col): Exception.__init__(self) @@ -19,6 +21,52 @@ class ParseException(Exception): class ServerError(Exception): pass +def ready_actions(l, lst): + ret = [] + for i in lst: + itms = list(i) + if i[0] == "r": + itms[0] = random.randrange(l) + if i[0] == "a": + itms[0] = l+1 + ret.append(tuple(itms)) + ret.sort() + return ret + + +def write_values(fp, vals, actions, sofar=0, skip=0, blocksize=BLOCKSIZE): + """ + vals: A list of values, which may be strings or Value objects. + actions: A list of (offset, action, arg) tuples. Action may be "pause" or "disconnect". + + Return True if connection should disconnect. + """ + while vals: + part = vals.pop() + for i in range(skip, len(part), blocksize): + d = part[i:i+blocksize] + if actions and actions[-1][0] < (sofar + len(d)): + p = actions.pop() + offset = p[0]-sofar + vals.append(part) + if p[1] == "pause": + fp.write(d[:offset]) + time.sleep(p[2]) + return write_values( + fp, vals, actions, + sofar=sofar+offset, + skip=i+offset, + blocksize=blocksize + ) + elif p[1] == "disconnect": + fp.write(d[:offset]) + return True + fp.write(d) + sofar += len(d) + skip = 0 + + + DATATYPES = dict( ascii_letters = string.ascii_letters, ascii_lowercase = string.ascii_lowercase, @@ -328,7 +376,6 @@ class Code: return e.setParseAction(lambda x: klass(*x)) -BLOCKSIZE = 1024 class Response: comps = ( Body, @@ -375,46 +422,6 @@ class Response: l += len(self.body) return l - def ready_actions(self, l, lst): - ret = [] - for i in lst: - itms = list(i) - if i[0] == "r": - itms[0] = random.randrange(l) - if i[0] == "a": - itms[0] = l+1 - ret.append(tuple(itms)) - ret.sort() - return ret - - def write_values(self, fp, vals, actions, sofar=0, skip=0, blocksize=BLOCKSIZE): - """ - Return True if connection should disconnect. - """ - while vals: - part = vals.pop() - for i in range(skip, len(part), blocksize): - d = part[i:i+blocksize] - if actions and actions[-1][0] < (sofar + len(d)): - p = actions.pop() - offset = p[0]-sofar - vals.append(part) - if p[1] == "pause": - fp.write(d[:offset]) - time.sleep(p[2]) - return self.write_values( - fp, vals, actions, - sofar=sofar+offset, - skip=i+offset, - blocksize=blocksize - ) - elif p[1] == "disconnect": - fp.write(d[:offset]) - return True - fp.write(d) - sofar += len(d) - skip = 0 - def serve(self, fp): started = time.time() if self.body and not self.get_header("Content-Length"): @@ -443,9 +450,9 @@ class Response: if self.body: vals.append(self.body) vals.reverse() - actions = self.ready_actions(self.length(), self.actions) + actions = ready_actions(self.length(), self.actions) actions.reverse() - disconnect = self.write_values(fp, vals, actions[:]) + disconnect = write_values(fp, vals, actions[:]) duration = time.time() - started return dict( disconnect = disconnect, @@ -498,7 +505,7 @@ class InternalResponse(Response): return d -def parse(settings, s): +def parse_response(settings, s): try: return CraftedResponse(settings, s, Response.expr().parseString(s, parseAll=True)) except pp.ParseException, v: |