Multiline specifications for pathod and pathoc.

This commit is contained in:
Aldo Cortesi 2012-07-22 15:26:05 +12:00
parent 30a6988392
commit 817e550aa1
3 changed files with 38 additions and 8 deletions

View File

@ -40,7 +40,7 @@ class Pathoc(tcp.TCPClient):
r = rparse.parse_request({}, i)
req = r.serve(self.wfile)
if reqdump:
print >> fp, "\n>>", req["method"], req["path"]
print >> fp, "\n>>", req["method"], repr(req["path"])
for a in req["actions"]:
print >> fp, "\t",
for x in a:

View File

@ -17,7 +17,7 @@ class ParseException(Exception):
return "%s\n%s"%(self.s, " "*(self.col-1) + "^")
def __str__(self):
return self.msg
return "%s at offset %s of %s"%(self.msg, self.col, repr(self.s))
class ServerError(Exception): pass
@ -101,15 +101,15 @@ v_integer = pp.Regex(r"[+-]?\d+")\
v_literal = pp.MatchFirst(
[
pp.QuotedString("\"", escChar="\\", unquoteResults=True),
pp.QuotedString("'", escChar="\\", unquoteResults=True),
pp.QuotedString("\"", escChar="\\", unquoteResults=True, multiline=True),
pp.QuotedString("'", escChar="\\", unquoteResults=True, multiline=True),
]
)
v_naked_literal = pp.MatchFirst(
[
v_literal,
pp.Word("".join(i for i in pp.printables if i not in ",:"))
pp.Word("".join(i for i in pp.printables if i not in ",:\n"))
]
)
@ -543,6 +543,8 @@ class Message:
return ret
Sep = pp.Optional(pp.Literal(":")).suppress()
class Response(Message):
comps = (
Body,
@ -571,7 +573,7 @@ class Response(Message):
resp = pp.And(
[
Code.expr(),
pp.ZeroOrMore(pp.Literal(":").suppress() + atom)
pp.ZeroOrMore(Sep + atom)
]
)
return resp
@ -610,9 +612,9 @@ class Request(Message):
resp = pp.And(
[
Method.expr(),
pp.Literal(":").suppress(),
Sep,
Path.expr(),
pp.ZeroOrMore(pp.Literal(":").suppress() + atom)
pp.ZeroOrMore(Sep + atom)
]
)
return resp

View File

@ -250,6 +250,34 @@ class TestParseRequest:
r = rparse.parse_request({}, 'GET:"/foo"')
assert str(r)
def test_multiline(self):
l = """
GET
"/foo"
ir,@1
"""
r = rparse.parse_request({}, l)
assert r.method == "GET"
assert r.path == "/foo"
assert r.actions
l = """
GET
"/foo
bar"
ir,@1
"""
r = rparse.parse_request({}, l)
assert r.method == "GET"
assert r.path.s.endswith("bar")
assert r.actions
class TestParseResponse:
def test_parse_err(self):