diff options
author | Aldo Cortesi <aldo@nullcube.com> | 2015-04-20 15:42:33 +1200 |
---|---|---|
committer | Aldo Cortesi <aldo@nullcube.com> | 2015-04-20 15:42:33 +1200 |
commit | 33820d9aeedc58e7d27118a545690571374e48be (patch) | |
tree | 7af9deabbfd37aa99ad55d0372fa0321da5b4c61 /libpathod/language.py | |
parent | be450cf9db1d819b1023029c8d403f401e010c98 (diff) | |
download | mitmproxy-33820d9aeedc58e7d27118a545690571374e48be.tar.gz mitmproxy-33820d9aeedc58e7d27118a545690571374e48be.tar.bz2 mitmproxy-33820d9aeedc58e7d27118a545690571374e48be.zip |
Whitespace, interface refcactoring, sketch websockets language
Diffstat (limited to 'libpathod/language.py')
-rw-r--r-- | libpathod/language.py | 113 |
1 files changed, 80 insertions, 33 deletions
diff --git a/libpathod/language.py b/libpathod/language.py index 5c53453d..b7b95ed8 100644 --- a/libpathod/language.py +++ b/libpathod/language.py @@ -34,7 +34,7 @@ class ParseException(Exception): self.col = col def marked(self): - return "%s\n%s"%(self.s, " "*(self.col - 1) + "^") + return "%s\n%s"%(self.s, " " * (self.col - 1) + "^") def __str__(self): return "%s at char %s"%(self.msg, self.col) @@ -46,9 +46,9 @@ def send_chunk(fp, val, blocksize, start, end): """ for i in range(start, end, blocksize): fp.write( - val[i:min(i+blocksize, end)] + val[i:min(i + blocksize, end)] ) - return end-start + return end - start def write_values(fp, vals, actions, sofar=0, blocksize=BLOCKSIZE): @@ -74,7 +74,7 @@ def write_values(fp, vals, actions, sofar=0, blocksize=BLOCKSIZE): v, blocksize, offset, - a[0]-sofar-offset + a[0] - sofar - offset ) if a[1] == "pause": time.sleep(a[2]) @@ -97,7 +97,7 @@ def write_values(fp, vals, actions, sofar=0, blocksize=BLOCKSIZE): return True -def serve(msg, fp, settings, request_host=None): +def serve(msg, fp, settings, **kwargs): """ fp: The file pointer to write to. @@ -107,7 +107,7 @@ def serve(msg, fp, settings, request_host=None): Calling this function may modify the object. """ - msg = msg.resolve(settings, request_host) + msg = msg.resolve(settings, **kwargs) started = time.time() vals = msg.values(settings) @@ -596,6 +596,7 @@ class Path(_Component): class Method(_Component): methods = [ + "ws", "get", "head", "post", @@ -845,31 +846,6 @@ class _Message(object): l += len(i.value.get_generator(settings)) return l - def resolve(self, settings, request_host): - tokens = self.tokens[:] - if not self.raw: - if not utils.get_header("Content-Length", self.headers): - if not self.body: - length = 0 - else: - length = len(self.body.value.get_generator(settings)) - tokens.append( - Header( - ValueLiteral("Content-Length"), - ValueLiteral(str(length)), - ) - ) - if request_host: - if not utils.get_header("Host", self.headers): - tokens.append( - Header( - ValueLiteral("Host"), - ValueLiteral(request_host) - ) - ) - intermediate = self.__class__(tokens) - return self.__class__([i.resolve(intermediate, settings) for i in tokens]) - @abc.abstractmethod def preamble(self, settings): # pragma: no cover pass @@ -907,8 +883,8 @@ class _Message(object): vals.append(self.body.value.get_generator(settings)) return vals - def freeze(self, settings, request_host=None): - r = self.resolve(settings, request_host=None) + def freeze(self, settings, **kwargs): + r = self.resolve(settings, **kwargs) return self.__class__([i.freeze(settings) for i in r.tokens]) def __repr__(self): @@ -957,6 +933,25 @@ class Response(_Message): ) return l + def resolve(self, settings): + tokens = self.tokens[:] + if not self.raw: + if not utils.get_header("Content-Length", self.headers): + if not self.body: + length = 0 + else: + length = len(self.body.value.get_generator(settings)) + tokens.append( + Header( + ValueLiteral("Content-Length"), + ValueLiteral(str(length)), + ) + ) + intermediate = self.__class__(tokens) + return self.__class__( + [i.resolve(intermediate, settings) for i in tokens] + ) + @classmethod def expr(klass): parts = [i.expr() for i in klass.comps] @@ -1009,6 +1004,32 @@ class Request(_Message): v.append(self.version) return v + def resolve(self, settings, **kwargs): + tokens = self.tokens[:] + if not self.raw: + if not utils.get_header("Content-Length", self.headers): + if self.body: + length = len(self.body.value.get_generator(settings)) + tokens.append( + Header( + ValueLiteral("Content-Length"), + ValueLiteral(str(length)), + ) + ) + request_host = kwargs.get("request_host") + if request_host: + if not utils.get_header("Host", self.headers): + tokens.append( + Header( + ValueLiteral("Host"), + ValueLiteral(request_host) + ) + ) + intermediate = self.__class__(tokens) + return self.__class__( + [i.resolve(intermediate, settings) for i in tokens] + ) + @classmethod def expr(klass): parts = [i.expr() for i in klass.comps] @@ -1027,6 +1048,32 @@ class Request(_Message): return ":".join([i.spec() for i in self.tokens]) +class WebsocketFrame(_Message): + comps = ( + Body, + PauseAt, + DisconnectAt, + InjectAt + ) + logattrs = ["body"] + + @classmethod + def expr(klass): + parts = [i.expr() for i in klass.comps] + atom = pp.MatchFirst(parts) + resp = pp.And( + [ + pp.Literal("ws"), + Sep, + pp.ZeroOrMore(Sep + atom) + ] + ) + return resp + + def spec(self): + return ":".join([i.spec() for i in self.tokens]) + + class PathodErrorResponse(Response): pass |