Unify offset specifications, and document them.

This commit is contained in:
Aldo Cortesi 2012-07-23 17:19:25 +12:00
parent 2880fee4e3
commit 091d90011b
2 changed files with 197 additions and 165 deletions

View File

@ -96,12 +96,8 @@ DATATYPES = dict(
ascii_uppercase = string.ascii_uppercase, ascii_uppercase = string.ascii_uppercase,
digits = string.digits, digits = string.digits,
hexdigits = string.hexdigits, hexdigits = string.hexdigits,
letters = string.letters,
lowercase = string.lowercase,
octdigits = string.octdigits, octdigits = string.octdigits,
printable = string.printable,
punctuation = string.punctuation, punctuation = string.punctuation,
uppercase = string.uppercase,
whitespace = string.whitespace, whitespace = string.whitespace,
ascii = string.printable, ascii = string.printable,
bytes = "".join(chr(i) for i in range(256)) bytes = "".join(chr(i) for i in range(256))
@ -288,6 +284,15 @@ NakedValue = pp.MatchFirst(
) )
Offset = pp.MatchFirst(
[
v_integer,
pp.Literal("r"),
pp.Literal("a")
]
)
class ShortcutContentType: class ShortcutContentType:
def __init__(self, value): def __init__(self, value):
self.value = value self.value = value
@ -402,13 +407,7 @@ class PauseAt:
] ]
) )
e += pp.Literal(",").suppress() e += pp.Literal(",").suppress()
e += pp.MatchFirst( e += Offset
[
v_integer,
pp.Literal("r"),
pp.Literal("a"),
]
)
return e.setParseAction(lambda x: klass(*x)) return e.setParseAction(lambda x: klass(*x))
def accept(self, settings, r): def accept(self, settings, r):
@ -441,13 +440,7 @@ class InjectAt:
@classmethod @classmethod
def expr(klass): def expr(klass):
e = pp.Literal("i").suppress() e = pp.Literal("i").suppress()
e = e + pp.MatchFirst( e += Offset
[
v_integer,
pp.Literal("r"),
pp.Literal("a")
]
)
e += pp.Literal(",").suppress() e += pp.Literal(",").suppress()
e += Value e += Value
return e.setParseAction(lambda x: klass(*x)) return e.setParseAction(lambda x: klass(*x))

View File

@ -9,6 +9,7 @@
</div> </div>
<section id="specifying_responses">
<div class="page-header"> <div class="page-header">
<h1>Responses</h1> <h1>Responses</h1>
</div> </div>
@ -17,107 +18,114 @@
<pre class="example">code[MESSAGE]:[colon-separated list of features]</pre></p> <pre class="example">code[MESSAGE]:[colon-separated list of features]</pre></p>
<table class="table table-bordered"> <table class="table table-bordered">
<tbody > <tbody >
<tr> <tr>
<td> <td>
hKEY=VALUE h<a href="#valuespec">VALUE</a>=<a href="#valuespec">VALUE</a>
</td> </td>
<td> <td>
Set a header. Both KEY and VALUE are full <a href=#valuespec>Value Specifiers</a>. Set a header.
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
bVALUE b<a href="#valuespec">VALUE</a>
</td> </td>
<td> <td>
Set the body. VALUE is a <a href=#valuespec>Value Set the body. When the body is set, pathod will
Specifier</a>. When the body is set, pathod will
automatically set the appropriate Content-Length header. automatically set the appropriate Content-Length header.
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
cVALUE c<a href="#valuespec">VALUE</a>
</td> </td>
<td> <td>
A shortcut for setting the Content-Type header. Equivalent to: A shortcut for setting the Content-Type header. Equivalent to
h"Content-Type"=VALUE
<pre>h"Content-Type"=VALUE</pre>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
iOFFSET,VALUE i<a href="#offsetspec">OFFSET</a>,<a href="#valuespec">VALUE</a>
</td> </td>
<td> <td>
Inject the specified value at the offset. OFFSET can be an Inject the specified value at the offset.
integer, or "r" to generate a random offset or "a" for an
offset just after all data has been sent.
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
lVALUE l<a href="#valuespec">VALUE</a>
</td> </td>
<td> <td>
A shortcut for setting the Location header. Equivalent to: A shortcut for setting the Location header. Equivalent to
h"Location"=VALUE
<pre>h"Location"=VALUE</pre>
</td>
</tr>
<tr>
<td>
dOFFSET
</td>
<td>
Disconnect after OFFSET bytes. The offset can also be "r", in which case pathod
will disconnect at a random point in the response.
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
pSECONDS,OFFSET d<a href="#offsetspec">OFFSET</a>
</td> </td>
<td> <td>
Pause for SECONDS seconds after OFFSET bytes. SECONDS can also be "f" to pause Disconnect after OFFSET bytes.
forever. OFFSET can also be "r" to generate a random offset, or "a" for an </td>
offset just after all data has been sent. </tr>
<tr>
<td>
pSECONDS,<a href="#offsetspec">OFFSET</a>
</td>
<td>
Pause for SECONDS seconds after OFFSET bytes. SECONDS can
be an integer or "f" to pause forever.
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</section>
<section id="specifying_requests">
<div class="page-header"> <div class="page-header">
<h1>Requests</h1> <h1>Requests</h1>
</div> </div>
</section>
<section id="specifying_requests">
<div class="page-header"> <div class="page-header">
<h1>Executing specs from file</h1> <h1>Executing specs from file</h1>
</div> </div>
<pre class="example">+./path/to/spec</pre> <pre class="example">+./path/to/spec</pre>
</section>
<section id="specifying_requests">
<div class="page-header"> <div class="page-header">
<h1>Components</h1> <h1>Features</h1>
</div> </div>
<a id="offsetspec"></a>
<h2>OFFSET</h2>
<p>Offsets are calculated relative to the base message, before any
injections or other transforms are applied. They have 3 flavors:</p>
<ul>
<li>An integer byte offset </li>
<li><b>r</b> for a random location</li>
<li><b>a</b> for the end of the message</li>
</ul>
<a id="valuespec"></a> <a id="valuespec"></a>
<h2>VALUEs</h2> <h2>VALUE</h2>
<h3>Literals</h3> <h3>Literals</h3>
@ -198,23 +206,54 @@
<p>Supported data types are:</p> <p>Supported data types are:</p>
<table class="table table-bordered">
<ul> <tbody >
<li>ascii</li> <tr>
<li>ascii_letters</li> <td>ascii</td>
<li>ascii_lowercase</li> <td>All ASCII characters</td>
<li>ascii_uppercase</li> </tr>
<li>bytes</li> <tr>
<li>digits</li> <td>ascii_letters</td>
<li>hexdigits</li> <td>A-Za-z</td>
<li>letters</li> </tr>
<li>lowercase</li> <tr>
<li>octdigits</li> <td>ascii_lowercase</td>
<li>printable</li> <td>a-z</td>
<li>punctuation</li> </tr>
<li>uppercase</li> <tr>
<li>whitespace</li> <td>ascii_uppercase</td>
</ul> <td>A-Z</td>
</tr>
<tr>
<td>bytes</td>
<td>All 256 byte values</td>
</tr>
<tr>
<td>digits</td>
<td>0-9</td>
</tr>
<tr>
<td>hexdigits</td>
<td>0-f</td>
</tr>
<tr>
<td>octdigits</td>
<td>0-8</td>
</tr>
<tr>
<td>punctuation</td>
<td>
<pre>!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~</pre>
</td>
</tr>
<tr>
<td>whitespace</td>
<td>
<pre>\t\n\x0b\x0c\r and space</pre>
</td>
</tr>
</tbody>
</table>
</section> </section>
{% endblock %} {% endblock %}