aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libpathod/language.py48
-rw-r--r--libpathod/pathod.py2
-rw-r--r--test/test_language.py8
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())