2012-04-29 05:37:47 +00:00
|
|
|
|
|
|
|
Pathod
|
|
|
|
======
|
|
|
|
|
|
|
|
Pathod is a pathological HTTP/S daemon, useful for testing and torturing client
|
|
|
|
software. At Pathod's core is a small, terse language for crafting HTTP
|
|
|
|
responses. The simplest way to use Pathod is to fire up the daemon, and specify
|
2012-04-29 06:28:46 +00:00
|
|
|
the respnse behaviour you want using this language in the request URL. Here's a
|
|
|
|
minimal example:
|
2012-04-29 05:37:47 +00:00
|
|
|
|
|
|
|
http://localhost:9999/p/200
|
|
|
|
|
|
|
|
Everything below the magic "/p/" path component is a response specifier - in
|
2012-04-29 06:28:46 +00:00
|
|
|
this case just a vanilla 200 OK response. See the docs below to get (much)
|
|
|
|
fancier. You can also add anchors to the Pathod server that serve a fixed
|
|
|
|
response whenever a matching URL is requested:
|
2012-04-29 05:37:47 +00:00
|
|
|
|
2012-04-29 06:28:46 +00:00
|
|
|
pathod --anchor "/foo=200"
|
2012-04-29 05:37:47 +00:00
|
|
|
|
|
|
|
Here, the part before the "=" is a regex specifying the anchor path, and the
|
2012-04-29 06:28:46 +00:00
|
|
|
part after is a response specifier.
|
2012-04-29 05:37:47 +00:00
|
|
|
|
2012-04-29 06:28:46 +00:00
|
|
|
Pathod also has a nifty built-in web interface, which exposes activity logs,
|
|
|
|
online help and various other goodies. Try it by visiting the server root:
|
2012-04-29 05:37:47 +00:00
|
|
|
|
|
|
|
http://localhost:9999
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Specifying Responses
|
|
|
|
====================
|
|
|
|
|
|
|
|
The general form of a response is as follows:
|
|
|
|
|
|
|
|
code[MESSAGE]:[colon-separated list of features]
|
|
|
|
|
|
|
|
Here's the simplest possible response specification, returning just an HTTP 200
|
|
|
|
OK message with no headers and no content:
|
|
|
|
|
|
|
|
200
|
|
|
|
|
|
|
|
We can embellish this a bit by specifying an optional custom HTTP response
|
2012-04-29 06:28:46 +00:00
|
|
|
message (if we don't, Pathod automatically creates an appropriate one). By
|
|
|
|
default for a 200 response code the message is "OK", but we can change it like
|
|
|
|
this:
|
2012-04-29 05:37:47 +00:00
|
|
|
|
|
|
|
200"YAY"
|
|
|
|
|
2012-04-29 06:28:46 +00:00
|
|
|
The quoted string here is an example of a Value Specifier, a syntax that is
|
|
|
|
used throughout the Pathod response specification language. In this case, the
|
|
|
|
quotes mean we're specifying a literal string, but there are many other fun
|
|
|
|
things we can do. For example, we can tell Pathod to generate 100k of random
|
|
|
|
ASCII letters instead:
|
2012-04-29 05:37:47 +00:00
|
|
|
|
|
|
|
200@100k,ascii_letters
|
|
|
|
|
2012-04-29 06:28:46 +00:00
|
|
|
Full documentation on the value specification syntax can be found in the next
|
|
|
|
section.
|
2012-04-29 05:37:47 +00:00
|
|
|
|
|
|
|
Following the response code specifier is a colon-separateed list of features.
|
|
|
|
For instance, this specifies a response with a body consisting of 1 megabyte of
|
|
|
|
random data:
|
|
|
|
|
|
|
|
200:b@1m
|
|
|
|
|
|
|
|
And this is the same response with an ETag header added:
|
|
|
|
|
|
|
|
200:b@1m:h"Etag"="foo"
|
|
|
|
|
|
|
|
Both the header name and the header value are full value specifiers. Here's the
|
|
|
|
same response again, but with a 1k randomly generated header name:
|
|
|
|
|
|
|
|
200:b@1m:h@1k,ascii_letters="foo"
|
|
|
|
|
|
|
|
A few specific headers have shortcuts, because they're used so often. The
|
|
|
|
shorcut for the content-type header is "c":
|
|
|
|
|
|
|
|
200:b@1m:c"text/json"
|
|
|
|
|
|
|
|
That's it for the basic response definition. Now we can start mucking with the
|
|
|
|
responses to break clients. One common hard-to-test circumstance is hangs or
|
|
|
|
slow responses. Pathod has a pause operator that you can use to define
|
|
|
|
precisely when and how long the server should hang. Here, for instance, we hang
|
|
|
|
for 120 seconds after sending 50 bytes (counted from the first byte of the HTTP
|
|
|
|
response):
|
|
|
|
|
|
|
|
200:b@1m:p120,50
|
|
|
|
|
|
|
|
If that's not long enough, we can tell Pathod to hang forever:
|
|
|
|
|
|
|
|
200:b@1m:p120,f
|
|
|
|
|
|
|
|
Or to send all data, and then hang without disconnecting:
|
|
|
|
|
|
|
|
200:b@1m:p120,a
|
|
|
|
|
|
|
|
We can also ask Pathod to hang randomly:
|
|
|
|
|
|
|
|
200:b@1m:pr,a
|
|
|
|
|
2012-04-29 06:28:46 +00:00
|
|
|
There is a similar mechanism for dropping connections mid-response. So, we can
|
|
|
|
tell Pathod to disconnect after sending 50 bytes:
|
2012-04-29 05:37:47 +00:00
|
|
|
|
|
|
|
200:b@1m:d50
|
|
|
|
|
|
|
|
Or randomly:
|
|
|
|
|
|
|
|
200:b@1m:dr
|
|
|
|
|
|
|
|
All of these features can be combined. Here's a response that pauses twice,
|
2012-04-29 06:28:46 +00:00
|
|
|
once at 10 bytes and once at 20, then disconnects at 5000:
|
2012-04-29 05:37:47 +00:00
|
|
|
|
|
|
|
200:b@1m:p10,10:p20,10:d5000
|
|
|
|
|
|
|
|
|
|
|
|
Features
|
|
|
|
========
|
|
|
|
|
2012-04-29 06:28:46 +00:00
|
|
|
_h_KEY=VALUE
|
|
|
|
------------
|
2012-04-29 05:37:47 +00:00
|
|
|
|
2012-04-29 06:28:46 +00:00
|
|
|
Set a header. Both KEY and VALUE are full _Value Specifiers_.
|
|
|
|
|
|
|
|
|
|
|
|
_b_VALUE
|
|
|
|
--------
|
|
|
|
|
|
|
|
Set the body. VALUE is a _Value Specifier_. When the body is set, Pathod will
|
|
|
|
automatically set the appropriate Content-Length header.
|
|
|
|
|
|
|
|
_c_VALUE
|
|
|
|
--------
|
|
|
|
|
|
|
|
A shortcut for setting the Content-Type header. Equivalent to:
|
|
|
|
|
|
|
|
h"Content-Type"=VALUE
|
|
|
|
|
|
|
|
_l_VALUE
|
|
|
|
--------
|
|
|
|
|
|
|
|
A shortcut for setting the Location header. Equivalent to:
|
|
|
|
|
|
|
|
h"Content-Type"=VALUE
|
|
|
|
|
|
|
|
|
|
|
|
_d_OFFSET
|
|
|
|
---------
|
|
|
|
|
|
|
|
Disconnect after OFFSET bytes. The offset can also be "r", in which case Pathod
|
|
|
|
will disconnect at a random point in the response.
|
|
|
|
|
|
|
|
|
|
|
|
_p_SECONDS,OFFSET
|
|
|
|
-----------------
|
|
|
|
|
|
|
|
Pause for SECONDS seconds after OFFSET bytes. SECONDS can also be "f" to pause
|
|
|
|
forever. OFFSET can also be "r" to generate a random offset, or "a" for an
|
|
|
|
offset just after all data has been sent.
|
2012-04-29 05:37:47 +00:00
|
|
|
|
|
|
|
|
|
|
|
Value Specifiers
|
2012-04-29 06:28:46 +00:00
|
|
|
================
|
2012-04-29 05:37:47 +00:00
|
|
|
|
|
|
|
@500k - 500k of random data
|
|
|
|
@500k,utf8 - 500k of utf8. Other specifiers: utf8,alphanum,alpha,printable
|
|
|
|
"foo" - literal
|
|
|
|
<path - load from path under data directory
|
|
|
|
<"path" - load from path under data directory
|
|
|
|
|
|
|
|
|
|
|
|
Anchors
|
|
|
|
=======
|
|
|
|
|
|
|
|
Passed on command-line:
|
|
|
|
-a "/foo/bar=200:!/foo"
|
|
|
|
|