diff options
-rw-r--r-- | libpathod/language.py | 48 | ||||
-rw-r--r-- | libpathod/pathod.py | 2 | ||||
-rw-r--r-- | test/test_language.py | 8 |
3 files changed, 24 insertions, 34 deletions
diff --git a/libpathod/language.py b/libpathod/language.py index 03cf66c7..706dd6b7 100644 --- a/libpathod/language.py +++ b/libpathod/language.py @@ -88,14 +88,7 @@ def serve(msg, fp, settings, request_host=None): msg = msg.resolve(settings, request_host) started = time.time() - hdrs = msg.headervals(settings, request_host) - - vals = msg.preamble(settings) - vals.append("\r\n") - vals.extend(hdrs) - vals.append("\r\n") - if msg.body: - vals.append(msg.body.value.get_generator(settings)) + vals = msg.values(settings) vals.reverse() actions = msg.actions[:] @@ -222,7 +215,7 @@ class _Token(object): """ return None - def resolve(self, msg, settings, request_host): # pragma: no cover + def resolve(self, msg, settings): # pragma: no cover """ Resolves this token to ready it for transmission. This means that the calculated offsets of actions are fixed. @@ -553,13 +546,13 @@ class _Action(_Token): def __init__(self, offset): self.offset = offset - def resolve(self, msg, settings, request_host): + def resolve(self, msg, settings): """ Resolves offset specifications to a numeric offset. Returns a copy of the action object. """ c = copy.copy(self) - l = msg.length(settings, request_host) + l = msg.length(settings) if c.offset == "r": c.offset = random.randrange(l) elif c.offset == "a": @@ -677,18 +670,11 @@ class _Message(object): def headers(self): return self._get_tokens(_Header) - def length(self, settings, request_host): + def length(self, settings): """ Calculate the length of the base message without any applied actions. """ - l = sum(len(x) for x in self.preamble(settings)) - l += 2 - for h in self.headervals(settings, request_host): - l += len(h) - l += 2 - if self.body: - l += len(self.body.value.get_generator(settings)) - return l + return sum(len(x) for x in self.values(settings)) def preview_safe(self): """ @@ -697,11 +683,11 @@ class _Message(object): tokens = [i for i in self.tokens if not isinstance(i, PauseAt)] return self.__class__(tokens) - def maximum_length(self, settings, request_host): + def maximum_length(self, settings): """ Calculate the maximum length of the base message with all applied actions. """ - l = self.length(settings, request_host) + l = self.length(settings) for i in self.actions: if isinstance(i, InjectAt): l += len(i.value.get_generator(settings)) @@ -734,13 +720,7 @@ class _Message(object): ) ) intermediate = self.__class__(tokens) - return self.__class__([i.resolve(intermediate, settings, request_host) for i in tokens]) - - def headervals(self, settings, request_host): - values = [] - for h in self.headers: - values.extend(h.values(settings)) - return values + return self.__class__([i.resolve(intermediate, settings) for i in tokens]) @abc.abstractmethod def preamble(self, settings): # pragma: no cover @@ -768,6 +748,16 @@ class _Message(object): ret["spec"] = self.spec() return ret + def values(self, settings): + vals = self.preamble(settings) + vals.append("\r\n") + for h in self.headers: + vals.extend(h.values(settings)) + vals.append("\r\n") + if self.body: + vals.append(self.body.value.get_generator(settings)) + return vals + Sep = pp.Optional(pp.Literal(":")).suppress() diff --git a/libpathod/pathod.py b/libpathod/pathod.py index b3a32ef9..fb6a7725 100644 --- a/libpathod/pathod.py +++ b/libpathod/pathod.py @@ -217,7 +217,7 @@ class Pathod(tcp.TCPServer): A policy check that verifies the request size is withing limits. """ try: - l = req.maximum_length(settings, None) + l = req.maximum_length(settings) except language.FileAccessDenied, v: return "File access denied." if self.sizelimit and l > self.sizelimit: diff --git a/test/test_language.py b/test/test_language.py index 0711a02e..688dfc8c 100644 --- a/test/test_language.py +++ b/test/test_language.py @@ -260,7 +260,7 @@ class Test_Action: def test_resolve(self): r = language.parse_request({}, 'GET:"/foo"') e = language.DisconnectAt("r") - ret = e.resolve(r, {}, None) + ret = e.resolve(r, {}) assert isinstance(ret.offset, int) def test_repr(self): @@ -444,7 +444,7 @@ class TestParseResponse: def test_parse_stress(self): r = language.parse_response({}, "400:b@100g") - assert r.length({}, None) + assert r.length({}) def test_spec(self): def rt(s): @@ -583,7 +583,7 @@ class TestResponse: def testlen(x): s = cStringIO.StringIO() language.serve(x, s, {}) - assert x.length({}, None) == len(s.getvalue()) + assert x.length({}) == len(s.getvalue()) testlen(language.parse_response({}, "400:m'msg':r")) testlen(language.parse_response({}, "400:m'msg':h'foo'='bar':r")) testlen(language.parse_response({}, "400:m'msg':h'foo'='bar':b@100b:r")) @@ -591,7 +591,7 @@ class TestResponse: def test_maximum_length(self): def testlen(x): s = cStringIO.StringIO() - m = x.maximum_length({}, None) + m = x.maximum_length({}) language.serve(x, s, {}) assert m >= len(s.getvalue()) |