2013-05-01 21:11:16 +00:00
|
|
|
{% extends "docframe.html" %}
|
2015-04-18 05:04:24 +00:00
|
|
|
{% block body %}
|
2012-07-22 10:24:16 +00:00
|
|
|
|
|
|
|
<div class="page-header">
|
|
|
|
<h1>
|
|
|
|
Language Spec
|
|
|
|
<small>The mini-language at the heart of pathoc and pathod.</small>
|
|
|
|
</h1>
|
|
|
|
</div>
|
|
|
|
|
2012-07-25 00:36:53 +00:00
|
|
|
<ul class="nav nav-tabs">
|
|
|
|
<li class="active"><a href="#specifying_responses" data-toggle="tab">Responses</a></li>
|
|
|
|
<li><a href="#specifying_requests" data-toggle="tab">Requests</a></li>
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
<div class="tab-content">
|
|
|
|
<div class="tab-pane active" id="specifying_responses">
|
|
|
|
<p>The general form of a response is as follows:</p>
|
2015-04-18 05:04:24 +00:00
|
|
|
|
2012-10-28 09:18:06 +00:00
|
|
|
<pre class="example">code:[colon-separated list of features]</pre></p>
|
2012-07-25 00:36:53 +00:00
|
|
|
|
|
|
|
<table class="table table-bordered">
|
|
|
|
<tbody >
|
|
|
|
<tr>
|
|
|
|
<td> b<a href="#valuespec">VALUE</a> </td>
|
|
|
|
<td>
|
2012-07-30 05:29:36 +00:00
|
|
|
Set the body. The appropriate Content-Length header is
|
|
|
|
added automatically unless the "r" flag is set.
|
2012-07-25 00:36:53 +00:00
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
<td> c<a href="#valuespec">VALUE</a> </td>
|
|
|
|
<td>
|
|
|
|
A shortcut for setting the Content-Type header. Equivalent to
|
|
|
|
h"Content-Type"=VALUE
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
|
2012-10-28 09:18:06 +00:00
|
|
|
<tr>
|
|
|
|
<td> d<a href="#offsetspec">OFFSET</a> </td>
|
|
|
|
<td>
|
2015-04-18 05:04:24 +00:00
|
|
|
Disconnect after OFFSET bytes.
|
2012-10-28 09:18:06 +00:00
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
<td> h<a href="#valuespec">VALUE</a>=<a href="#valuespec">VALUE</a> </td>
|
|
|
|
<td>
|
2015-04-18 05:04:24 +00:00
|
|
|
Set a header.
|
2012-10-28 09:18:06 +00:00
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
|
2012-07-25 00:36:53 +00:00
|
|
|
<tr>
|
|
|
|
<td> i<a href="#offsetspec">OFFSET</a>,<a href="#valuespec">VALUE</a> </td>
|
|
|
|
<td>
|
2015-04-18 05:04:24 +00:00
|
|
|
Inject the specified value at the offset.
|
2012-07-25 00:36:53 +00:00
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
<td> l<a href="#valuespec">VALUE</a> </td>
|
|
|
|
<td>
|
|
|
|
A shortcut for setting the Location header. Equivalent to
|
|
|
|
h"Location"=VALUE
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
<tr>
|
2012-10-28 09:18:06 +00:00
|
|
|
<td> m<a href="#valuespec">VALUE</a> </td>
|
2012-07-25 00:36:53 +00:00
|
|
|
<td>
|
2012-10-28 09:18:06 +00:00
|
|
|
HTTP Reason message. Automatically chosen according to
|
2015-04-18 05:04:24 +00:00
|
|
|
the response code if not specified.
|
2012-07-25 00:36:53 +00:00
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
<td> p<a href="#offsetspec">OFFSET</a>,SECONDS </td>
|
|
|
|
<td>
|
|
|
|
Pause for SECONDS seconds after OFFSET bytes. SECONDS can
|
2015-04-18 05:04:24 +00:00
|
|
|
be an integer or "f" to pause forever.
|
2012-07-25 00:36:53 +00:00
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
<td> r </td>
|
|
|
|
<td>
|
|
|
|
Set the "raw" flag on this response. Pathod will not
|
|
|
|
calculate a Content-Length header if a body is set, or add
|
|
|
|
a Date header to the response.
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
</tbody>
|
|
|
|
</table>
|
|
|
|
</div>
|
2012-07-22 10:24:16 +00:00
|
|
|
|
|
|
|
|
2012-07-25 00:36:53 +00:00
|
|
|
<div class="tab-pane" id="specifying_requests">
|
|
|
|
<p>The general form of a request is as follows:</p>
|
2015-04-18 05:04:24 +00:00
|
|
|
|
2012-07-25 00:36:53 +00:00
|
|
|
<pre class="example">method:path:[colon-separated list of features]</pre></p>
|
|
|
|
|
|
|
|
<table class="table table-bordered">
|
|
|
|
<tbody >
|
2015-04-20 03:42:33 +00:00
|
|
|
|
|
|
|
<tr>
|
|
|
|
<td> method </td>
|
|
|
|
<td>
|
|
|
|
A <a href="#valuespec">VALUE</a> specifying the HTTP
|
|
|
|
method to use. Standard methods do not need to be
|
|
|
|
quoted. The special method <b>ws</b> creates a valid
|
|
|
|
websocket upgrade request.
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
|
2012-07-25 00:36:53 +00:00
|
|
|
<tr>
|
|
|
|
<td> b<a href="#valuespec">VALUE</a> </td>
|
|
|
|
<td>
|
2012-07-30 05:29:36 +00:00
|
|
|
Set the body. The appropriate Content-Length header is
|
|
|
|
added automatically unless the "r" flag is set.
|
2012-07-25 00:36:53 +00:00
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
<td> c<a href="#valuespec">VALUE</a> </td>
|
|
|
|
<td>
|
|
|
|
A shortcut for setting the Content-Type header. Equivalent to
|
|
|
|
h"Content-Type"=VALUE
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
<tr>
|
2012-10-28 09:18:06 +00:00
|
|
|
<td> d<a href="#offsetspec">OFFSET</a> </td>
|
2012-07-25 00:36:53 +00:00
|
|
|
<td>
|
2015-04-18 05:04:24 +00:00
|
|
|
Disconnect after OFFSET bytes.
|
2012-07-25 00:36:53 +00:00
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
<tr>
|
2012-10-28 09:18:06 +00:00
|
|
|
<td> h<a href="#valuespec">VALUE</a>=<a href="#valuespec">VALUE</a> </td>
|
2012-07-25 00:36:53 +00:00
|
|
|
<td>
|
2015-04-18 05:04:24 +00:00
|
|
|
Set a header.
|
2012-10-28 09:18:06 +00:00
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
<td> i<a href="#offsetspec">OFFSET</a>,<a href="#valuespec">VALUE</a> </td>
|
|
|
|
<td>
|
2015-04-18 05:04:24 +00:00
|
|
|
Inject the specified value at the offset.
|
2012-07-25 00:36:53 +00:00
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
<td> p<a href="#offsetspec">OFFSET</a>,SECONDS </td>
|
|
|
|
<td>
|
|
|
|
Pause for SECONDS seconds after OFFSET bytes. SECONDS can
|
2015-04-18 05:04:24 +00:00
|
|
|
be an integer or "f" to pause forever.
|
2012-07-25 00:36:53 +00:00
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
<td> r </td>
|
|
|
|
<td>
|
|
|
|
Set the "raw" flag on this response. Pathod will not
|
2012-07-30 05:29:36 +00:00
|
|
|
calculate a Content-Length header if a body is set.
|
2012-07-25 00:36:53 +00:00
|
|
|
</td>
|
|
|
|
</tr>
|
2012-11-15 22:31:04 +00:00
|
|
|
|
2015-04-18 05:04:24 +00:00
|
|
|
<tr>
|
|
|
|
<td> s<a href="#valuespec">VALUE</a> </td>
|
|
|
|
<td>
|
|
|
|
An embedded Response specification, appended to the path
|
|
|
|
of the request.
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
|
2012-11-15 22:31:04 +00:00
|
|
|
<tr>
|
|
|
|
<td> u<a href="#valuespec">VALUE</a> <br> uSHORTCUT </td>
|
|
|
|
|
|
|
|
<td>
|
|
|
|
|
|
|
|
Set a User-Agent header on this request. You can
|
|
|
|
specify either a complete <a
|
|
|
|
href="#valuespec">VALUE</a>, or a User-Agent shortcut:
|
|
|
|
|
|
|
|
<table class="table table-condensed">
|
|
|
|
{% for i in uastrings %}
|
|
|
|
<tr>
|
|
|
|
<td><b>{{ i[1] }}</b></td>
|
|
|
|
<td>{{ i[0] }}</td>
|
|
|
|
</tr>
|
|
|
|
{% endfor %}
|
|
|
|
</table>
|
|
|
|
|
|
|
|
</td>
|
|
|
|
</tr>
|
2012-07-25 00:36:53 +00:00
|
|
|
</tbody>
|
|
|
|
</table>
|
2012-07-23 05:19:25 +00:00
|
|
|
</div>
|
2012-07-24 09:45:05 +00:00
|
|
|
|
2012-07-25 00:36:53 +00:00
|
|
|
</div>
|
2012-07-22 10:24:16 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2012-07-23 05:19:25 +00:00
|
|
|
<section id="specifying_requests">
|
|
|
|
<div class="page-header">
|
|
|
|
<h1>Features</h1>
|
|
|
|
</div>
|
2012-07-22 10:24:16 +00:00
|
|
|
|
2012-07-23 05:19:25 +00:00
|
|
|
<a id="offsetspec"></a>
|
|
|
|
<h2>OFFSET</h2>
|
2012-07-22 10:24:16 +00:00
|
|
|
|
2012-07-23 05:19:25 +00:00
|
|
|
<p>Offsets are calculated relative to the base message, before any
|
|
|
|
injections or other transforms are applied. They have 3 flavors:</p>
|
2012-07-22 10:24:16 +00:00
|
|
|
|
2012-07-23 05:19:25 +00:00
|
|
|
<ul>
|
2015-04-18 05:04:24 +00:00
|
|
|
<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>
|
2012-07-23 05:19:25 +00:00
|
|
|
</ul>
|
2012-07-22 10:24:16 +00:00
|
|
|
|
2012-07-23 05:19:25 +00:00
|
|
|
<a id="valuespec"></a>
|
|
|
|
<h2>VALUE</h2>
|
2012-07-22 10:24:16 +00:00
|
|
|
|
2012-07-23 05:19:25 +00:00
|
|
|
<h3>Literals</h3>
|
2012-07-22 10:24:16 +00:00
|
|
|
|
2012-07-23 05:19:25 +00:00
|
|
|
<p>Literal values are specified as a quoted strings: </p>
|
2012-07-22 10:24:16 +00:00
|
|
|
|
2012-07-23 05:19:25 +00:00
|
|
|
<pre class="example">"foo"</pre>
|
2012-07-22 10:24:16 +00:00
|
|
|
|
2012-07-23 05:19:25 +00:00
|
|
|
<p>Either single or double quotes are accepted, and quotes can be escaped with
|
|
|
|
backslashes within the string:</p>
|
2012-07-22 10:24:16 +00:00
|
|
|
|
2012-07-23 05:19:25 +00:00
|
|
|
<pre class="example">'fo\'o'</pre>
|
|
|
|
|
|
|
|
<p>Literal values can contain Python-style backslash escape sequences:</p>
|
|
|
|
|
|
|
|
<pre class="example">'foo\r\nbar'</pre>
|
|
|
|
|
|
|
|
|
|
|
|
<h3>Files</h3>
|
|
|
|
|
|
|
|
<p>You can load a value from a specified file path. To do so, you have to specify
|
|
|
|
a _staticdir_ option to pathod on the command-line, like so: </p>
|
|
|
|
|
|
|
|
<pre class="example">pathod -d ~/myassets</pre>
|
|
|
|
|
|
|
|
<p>All paths are relative paths under this directory. File loads are indicated by
|
|
|
|
starting the value specifier with the left angle bracket:
|
2015-04-18 05:04:24 +00:00
|
|
|
|
2012-07-23 05:19:25 +00:00
|
|
|
<pre class="example"><my/path</pre></p>
|
|
|
|
|
|
|
|
<p>The path value can also be a quoted string, with the same syntax as literals:</p>
|
|
|
|
|
|
|
|
<pre class="example"><"my/path"</pre>
|
|
|
|
|
|
|
|
|
|
|
|
<h3>Generated values</h3>
|
|
|
|
|
|
|
|
<p>An @-symbol lead-in specifies that generated data should be used. There are two
|
|
|
|
components to a generator specification - a size, and a data type. By default
|
|
|
|
pathod assumes a data type of "bytes". </p>
|
|
|
|
|
|
|
|
<p>Here's a value specifier for generating 100 bytes:
|
2015-04-18 05:04:24 +00:00
|
|
|
|
2012-07-23 05:19:25 +00:00
|
|
|
<pre class="example">@100</pre></p>
|
|
|
|
|
|
|
|
<p>You can use standard suffixes to indicate larger values. Here, for instance, is
|
|
|
|
a specifier for generating 100 megabytes:</p>
|
|
|
|
|
|
|
|
<pre class="example">@100m</pre>
|
|
|
|
|
|
|
|
<p>Data is generated and served efficiently - if you really want to send a
|
|
|
|
terabyte of data to a client, pathod can do it. The supported suffixes are:</p>
|
|
|
|
|
|
|
|
|
|
|
|
<table class="table table-bordered">
|
|
|
|
<tbody >
|
|
|
|
<tr>
|
|
|
|
<td>b</td> <td>1024**0 (bytes)</td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td>k</td> <td>1024**1 (kilobytes)</td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td>m</td> <td>1024**2 (megabytes)</td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td>g</td> <td>1024**3 (gigabytes)</td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td>t</td> <td>1024**4 (terabytes)</td>
|
|
|
|
</tr>
|
|
|
|
</tbody>
|
|
|
|
</table>
|
|
|
|
|
|
|
|
<p>Data types are separated from the size specification by a comma. This
|
|
|
|
specification generates 100mb of ASCII:</p>
|
|
|
|
|
|
|
|
<pre class="example">@100m,ascii</pre>
|
|
|
|
|
|
|
|
<p>Supported data types are:</p>
|
|
|
|
|
|
|
|
<table class="table table-bordered">
|
|
|
|
<tbody >
|
|
|
|
<tr>
|
|
|
|
<td>ascii</td>
|
|
|
|
<td>All ASCII characters</td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td>ascii_letters</td>
|
|
|
|
<td>A-Za-z</td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td>ascii_lowercase</td>
|
|
|
|
<td>a-z</td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td>ascii_uppercase</td>
|
|
|
|
<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>
|
2012-07-24 00:52:53 +00:00
|
|
|
<td>0-7</td>
|
2012-07-23 05:19:25 +00:00
|
|
|
</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>
|
2012-07-22 10:24:16 +00:00
|
|
|
</section>
|
2012-07-23 05:19:25 +00:00
|
|
|
|
2015-04-18 05:04:24 +00:00
|
|
|
{% endblock %}
|