aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libpathod/language/http2.py85
-rw-r--r--test/test_language_http2.py8
2 files changed, 56 insertions, 37 deletions
diff --git a/libpathod/language/http2.py b/libpathod/language/http2.py
index b206c0cf..6dd93d5f 100644
--- a/libpathod/language/http2.py
+++ b/libpathod/language/http2.py
@@ -104,7 +104,6 @@ class Header(_HeaderMixin, base.KeyValue):
preamble = "h"
-
class ShortcutContentType(_HeaderMixin, base.Value):
preamble = "c"
key = base.TokValueLiteral("content-type")
@@ -143,33 +142,24 @@ class Times(base.Integer):
preamble = "x"
-class Request(_HTTP2Message):
+class Response(_HTTP2Message):
+ unique_name = None
comps = (
Header,
+ Body,
ShortcutContentType,
- ShortcutUserAgent,
+ ShortcutLocation,
Raw,
- # NestedResponse,
- Body,
- Times,
)
- logattrs = ["method", "path"]
def __init__(self, tokens):
- super(Request, self).__init__(tokens)
+ super(Response, self).__init__(tokens)
self.rendered_values = None
+ self.stream_id = 0
@property
- def method(self):
- return self.tok(Method)
-
- @property
- def path(self):
- return self.tok(Path)
-
- @property
- def times(self):
- return self.tok(Times)
+ def code(self):
+ return self.tok(Code)
@classmethod
def expr(cls):
@@ -177,9 +167,7 @@ class Request(_HTTP2Message):
atom = pp.MatchFirst(parts)
resp = pp.And(
[
- Method.expr(),
- base.Sep,
- Path.expr(),
+ Code.expr(),
pp.ZeroOrMore(base.Sep + atom)
]
)
@@ -196,9 +184,9 @@ class Request(_HTTP2Message):
if body:
body = body.string()
- self.rendered_values = settings.protocol.create_request(
- self.method.string(),
- self.path.string(),
+ self.rendered_values = settings.protocol.create_response(
+ self.code.string(),
+ self.stream_id,
headers,
body)
return self.rendered_values
@@ -207,24 +195,42 @@ class Request(_HTTP2Message):
return ":".join([i.spec() for i in self.tokens])
-class Response(_HTTP2Message):
- unique_name = None
+class NestedResponse(base.NestedMessage):
+ preamble = "s"
+ nest_type = Response
+
+
+class Request(_HTTP2Message):
comps = (
Header,
- Body,
ShortcutContentType,
- ShortcutLocation,
+ ShortcutUserAgent,
Raw,
+ NestedResponse,
+ Body,
+ Times,
)
+ logattrs = ["method", "path"]
def __init__(self, tokens):
- super(Response, self).__init__(tokens)
+ super(Request, self).__init__(tokens)
self.rendered_values = None
- self.stream_id = 0
@property
- def code(self):
- return self.tok(Code)
+ def method(self):
+ return self.tok(Method)
+
+ @property
+ def path(self):
+ return self.tok(Path)
+
+ @property
+ def nested_response(self):
+ return self.tok(NestedResponse)
+
+ @property
+ def times(self):
+ return self.tok(Times)
@classmethod
def expr(cls):
@@ -232,7 +238,9 @@ class Response(_HTTP2Message):
atom = pp.MatchFirst(parts)
resp = pp.And(
[
- Code.expr(),
+ Method.expr(),
+ base.Sep,
+ Path.expr(),
pp.ZeroOrMore(base.Sep + atom)
]
)
@@ -243,15 +251,19 @@ class Response(_HTTP2Message):
if self.rendered_values:
return self.rendered_values
else:
+ path = self.path.string()
+ if self.nested_response:
+ path += self.nested_response.parsed.spec()
+
headers = [header.values(settings) for header in self.headers]
body = self.body
if body:
body = body.string()
- self.rendered_values = settings.protocol.create_response(
- self.code.string(),
- self.stream_id,
+ self.rendered_values = settings.protocol.create_request(
+ self.method.string(),
+ path,
headers,
body)
return self.rendered_values
@@ -259,7 +271,6 @@ class Response(_HTTP2Message):
def spec(self):
return ":".join([i.spec() for i in self.tokens])
-
def make_error_response(reason, body=None):
tokens = [
Code("800"),
diff --git a/test/test_language_http2.py b/test/test_language_http2.py
index b25ad43c..3b36c01b 100644
--- a/test/test_language_http2.py
+++ b/test/test_language_http2.py
@@ -132,6 +132,14 @@ class TestRequest:
default_settings(),
)
+ def test_nested_response(self):
+ l = "get:/p/:s'200'"
+ r = parse_request(l)
+ assert len(r.tokens) == 3
+ assert isinstance(r.tokens[2], http2.NestedResponse)
+ assert r.values(default_settings())
+
+
def test_render_with_body(self):
s = cStringIO.StringIO()
r = parse_request("GET:'/foo':bfoobar")