mirror of
https://github.com/Grasscutters/mitmproxy.git
synced 2024-11-30 03:14:22 +00:00
Unify offset specifications, and document them.
This commit is contained in:
parent
2880fee4e3
commit
091d90011b
@ -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))
|
||||||
|
@ -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,204 +18,242 @@
|
|||||||
|
|
||||||
<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>
|
||||||
|
|
||||||
|
|
||||||
<div class="page-header">
|
<section id="specifying_requests">
|
||||||
<h1>Requests</h1>
|
<div class="page-header">
|
||||||
</div>
|
<h1>Requests</h1>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
|
||||||
<div class="page-header">
|
<section id="specifying_requests">
|
||||||
<h1>Executing specs from file</h1>
|
<div class="page-header">
|
||||||
</div>
|
<h1>Executing specs from file</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
<pre class="example">+./path/to/spec</pre>
|
<pre class="example">+./path/to/spec</pre>
|
||||||
|
|
||||||
|
|
||||||
<div class="page-header">
|
|
||||||
<h1>Components</h1>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<a id="valuespec"></a>
|
|
||||||
<h2>VALUEs</h2>
|
|
||||||
|
|
||||||
<h3>Literals</h3>
|
|
||||||
|
|
||||||
<p>Literal values are specified as a quoted strings: </p>
|
|
||||||
|
|
||||||
<pre class="example">"foo"</pre>
|
|
||||||
|
|
||||||
<p>Either single or double quotes are accepted, and quotes can be escaped with
|
|
||||||
backslashes within the string:</p>
|
|
||||||
|
|
||||||
<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:
|
|
||||||
|
|
||||||
<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:
|
|
||||||
|
|
||||||
<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>
|
|
||||||
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>ascii</li>
|
|
||||||
<li>ascii_letters</li>
|
|
||||||
<li>ascii_lowercase</li>
|
|
||||||
<li>ascii_uppercase</li>
|
|
||||||
<li>bytes</li>
|
|
||||||
<li>digits</li>
|
|
||||||
<li>hexdigits</li>
|
|
||||||
<li>letters</li>
|
|
||||||
<li>lowercase</li>
|
|
||||||
<li>octdigits</li>
|
|
||||||
<li>printable</li>
|
|
||||||
<li>punctuation</li>
|
|
||||||
<li>uppercase</li>
|
|
||||||
<li>whitespace</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<section id="specifying_requests">
|
||||||
|
<div class="page-header">
|
||||||
|
<h1>Features</h1>
|
||||||
|
</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>
|
||||||
|
<h2>VALUE</h2>
|
||||||
|
|
||||||
|
<h3>Literals</h3>
|
||||||
|
|
||||||
|
<p>Literal values are specified as a quoted strings: </p>
|
||||||
|
|
||||||
|
<pre class="example">"foo"</pre>
|
||||||
|
|
||||||
|
<p>Either single or double quotes are accepted, and quotes can be escaped with
|
||||||
|
backslashes within the string:</p>
|
||||||
|
|
||||||
|
<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:
|
||||||
|
|
||||||
|
<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:
|
||||||
|
|
||||||
|
<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>
|
||||||
|
<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>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
Loading…
Reference in New Issue
Block a user