Change response spec format to code[:features]

Reason message is now specified as just another feature with the "m" mnemonic.
This commit is contained in:
Aldo Cortesi 2012-10-28 22:18:06 +13:00
parent 07560ffe30
commit 61f8992fbf
6 changed files with 43 additions and 34 deletions

View File

@ -586,7 +586,8 @@ class Reason(_Component):
@classmethod @classmethod
def expr(klass): def expr(klass):
e = Value.copy() e = pp.Literal("m").suppress()
e = e + Value
return e.setParseAction(lambda x: klass(*x)) return e.setParseAction(lambda x: klass(*x))
def values(self, settings): def values(self, settings):
@ -724,7 +725,8 @@ class Response(Message):
InjectAt, InjectAt,
ShortcutContentType, ShortcutContentType,
ShortcutLocation, ShortcutLocation,
Raw Raw,
Reason
) )
logattrs = ["code", "reason", "version", "body"] logattrs = ["code", "reason", "version", "body"]
def __init__(self): def __init__(self):
@ -749,7 +751,6 @@ class Response(Message):
resp = pp.And( resp = pp.And(
[ [
Code.expr(), Code.expr(),
pp.Optional(Reason.expr()),
pp.ZeroOrMore(Sep + atom) pp.ZeroOrMore(Sep + atom)
] ]
) )

View File

@ -17,17 +17,10 @@
<div class="tab-pane active" id="specifying_responses"> <div class="tab-pane active" id="specifying_responses">
<p>The general form of a response is as follows:</p> <p>The general form of a response is as follows:</p>
<pre class="example">code[MESSAGE]:[colon-separated list of features]</pre></p> <pre class="example">code:[colon-separated list of features]</pre></p>
<table class="table table-bordered"> <table class="table table-bordered">
<tbody > <tbody >
<tr>
<td> h<a href="#valuespec">VALUE</a>=<a href="#valuespec">VALUE</a> </td>
<td>
Set a header.
</td>
</tr>
<tr> <tr>
<td> b<a href="#valuespec">VALUE</a> </td> <td> b<a href="#valuespec">VALUE</a> </td>
<td> <td>
@ -44,6 +37,21 @@
</td> </td>
</tr> </tr>
<tr>
<td> d<a href="#offsetspec">OFFSET</a> </td>
<td>
Disconnect after OFFSET bytes.
</td>
</tr>
<tr>
<td> h<a href="#valuespec">VALUE</a>=<a href="#valuespec">VALUE</a> </td>
<td>
Set a header.
</td>
</tr>
<tr> <tr>
<td> i<a href="#offsetspec">OFFSET</a>,<a href="#valuespec">VALUE</a> </td> <td> i<a href="#offsetspec">OFFSET</a>,<a href="#valuespec">VALUE</a> </td>
<td> <td>
@ -60,9 +68,10 @@
</tr> </tr>
<tr> <tr>
<td> d<a href="#offsetspec">OFFSET</a> </td> <td> m<a href="#valuespec">VALUE</a> </td>
<td> <td>
Disconnect after OFFSET bytes. HTTP Reason message. Automatically chosen according to
the response code if not specified.
</td> </td>
</tr> </tr>
@ -94,13 +103,6 @@
<table class="table table-bordered"> <table class="table table-bordered">
<tbody > <tbody >
<tr>
<td> h<a href="#valuespec">VALUE</a>=<a href="#valuespec">VALUE</a> </td>
<td>
Set a header.
</td>
</tr>
<tr> <tr>
<td> b<a href="#valuespec">VALUE</a> </td> <td> b<a href="#valuespec">VALUE</a> </td>
<td> <td>
@ -118,16 +120,23 @@
</tr> </tr>
<tr> <tr>
<td> i<a href="#offsetspec">OFFSET</a>,<a href="#valuespec">VALUE</a> </td> <td> d<a href="#offsetspec">OFFSET</a> </td>
<td> <td>
Inject the specified value at the offset. Disconnect after OFFSET bytes.
</td> </td>
</tr> </tr>
<tr> <tr>
<td> d<a href="#offsetspec">OFFSET</a> </td> <td> h<a href="#valuespec">VALUE</a>=<a href="#valuespec">VALUE</a> </td>
<td> <td>
Disconnect after OFFSET bytes. Set a header.
</td>
</tr>
<tr>
<td> i<a href="#offsetspec">OFFSET</a>,<a href="#valuespec">VALUE</a> </td>
<td>
Inject the specified value at the offset.
</td> </td>
</tr> </tr>

View File

@ -31,7 +31,7 @@
name="spec" name="spec"
class="input-medium search-query" class="input-medium search-query"
value="{{spec}}" value="{{spec}}"
placeholder="code[msg]:[features]" placeholder="code:[features]"
> >
<a id="gopublic" class="btn">go</a> <a id="gopublic" class="btn">go</a>
</p> </p>

View File

@ -5,7 +5,7 @@
name="spec" name="spec"
class="input-medium search-query" class="input-medium search-query"
value="{{spec}}" value="{{spec}}"
placeholder="code[msg]:[features]" placeholder="code:[features]"
> >
<input type="submit" class="btn" value="preview"> <input type="submit" class="btn" value="preview">
{% if not nocraft %} {% if not nocraft %}

View File

@ -498,11 +498,11 @@ class TestResponse:
assert r.code.string() == "202" assert r.code.string() == "202"
def test_response(self): def test_response(self):
r = language.parse_response({}, "400'msg'") r = language.parse_response({}, "400:m'msg'")
assert r.code.string() == "400" assert r.code.string() == "400"
assert r.reason.string() == "msg" assert r.reason.string() == "msg"
r = language.parse_response({}, "400'msg':b@100b") r = language.parse_response({}, "400:m'msg':b@100b")
assert r.reason.string() == "msg" assert r.reason.string() == "msg"
assert r.body.values({}) assert r.body.values({})
assert str(r) assert str(r)
@ -514,7 +514,7 @@ class TestResponse:
def test_render(self): def test_render(self):
s = cStringIO.StringIO() s = cStringIO.StringIO()
r = language.parse_response({}, "400'msg'") r = language.parse_response({}, "400:m'msg'")
assert r.serve(s, {}) assert r.serve(s, {})
def test_raw(self): def test_raw(self):
@ -537,9 +537,9 @@ class TestResponse:
s = cStringIO.StringIO() s = cStringIO.StringIO()
x.serve(s, {}) x.serve(s, {})
assert x.length({}, None) == len(s.getvalue()) assert x.length({}, None) == len(s.getvalue())
testlen(language.parse_response({}, "400'msg'")) testlen(language.parse_response({}, "400:m'msg'"))
testlen(language.parse_response({}, "400'msg':h'foo'='bar'")) testlen(language.parse_response({}, "400:m'msg':h'foo'='bar'"))
testlen(language.parse_response({}, "400'msg':h'foo'='bar':b@100b")) testlen(language.parse_response({}, "400:m'msg':h'foo'='bar':b@100b"))
def test_maximum_length(self): def test_maximum_length(self):
def testlen(x, actions): def testlen(x, actions):
@ -548,7 +548,7 @@ class TestResponse:
x.serve(s, {}) x.serve(s, {})
assert m >= len(s.getvalue()) assert m >= len(s.getvalue())
r = language.parse_response({}, "400'msg':b@100") r = language.parse_response({}, "400:m'msg':b@100")
actions = [ actions = [
language.DisconnectAt(0) language.DisconnectAt(0)

View File

@ -40,7 +40,6 @@ class TestTimeout(tutils.DaemonTests):
# FIXME: Add float values to spec language, reduce test timeout to # FIXME: Add float values to spec language, reduce test timeout to
# increase test performance # increase test performance
assert self.get("200:p1,1").status_code == 200 assert self.get("200:p1,1").status_code == 200
print self.d.last_log()
assert self.d.last_log()["type"] == "timeout" assert self.d.last_log()["type"] == "timeout"