wptserve.pipes.gzip(request, response)

This pipe gzip-encodes response data.

It sets (or overwrites) these HTTP headers: Content-Encoding is set to gzip Content-Length is set to the length of the compressed content

wptserve.pipes.header(request, response, name, value, append=False)

Set a HTTP header.

Replaces any existing HTTP header of the same name unless append is set, in which case the header is appended without replacement.

  • name – Name of the header to set.

  • value – Value to use for the header.

  • append – True if existing headers should not be replaced

wptserve.pipes.slice(request, response, start, end=None)

Send a byte range of the response body

  • start – The starting offset. Follows python semantics including negative numbers.

  • end – The ending offset, again with python semantics and None (spelled “null” in a query string) to indicate the end of the file.

wptserve.pipes.status(request, response, code)

Alter the status code.


code – Status code to use for the response.

wptserve.pipes.sub(request, response, escape_type='html')

Substitute environment information about the server and request into the script.


escape_type – String detailing the type of escaping to use. Known values are “html” and “none”, with “html” the default for historic reasons.

The format is a very limited template language. Substitutions are enclosed by {{ and }}. There are several available substitutions:


A simple string value and represents the primary host from which the tests are being run.


A dictionary of available domains indexed by subdomain name.


A dictionary of lists of ports indexed by protocol.


A dictionary of parts of the request URL. Valid keys are ‘server, ‘scheme’, ‘host’, ‘hostname’, ‘port’, ‘path’ and ‘query’. ‘server’ is scheme://host:port, ‘host’ is hostname:port, and query includes the leading ‘?’, but other delimiters are omitted.


A dictionary of HTTP headers in the request.

header_or_default(header, default)

The value of an HTTP header, or a default value if it is absent. For example:

{{header_or_default(X-Test, test-header-absent)}}

A dictionary of query parameters supplied with the request.


A pesudo-random UUID suitable for usage with stash

file_hash(algorithm, filepath)

The cryptographic hash of a file. Supported algorithms: md5, sha1, sha224, sha256, sha384, and sha512. For example:

{{file_hash(md5, dom/interfaces.html)}}

The absolute path to a file inside the wpt document root

So for example in a setup running on localhost with a www subdomain and a http server on ports 80 and 81:

{{host}} => localhost
{{domains[www]}} => www.localhost
{{ports[http][1]}} => 81

It is also possible to assign a value to a variable name, which must start with the $ character, using the “:” syntax e.g.:


Later substitutions in the same file may then refer to the variable by name e.g.:

wptserve.pipes.trickle(request, response, delays)

Send the response in parts, with time delays.



A string of delays and amounts, in bytes, of the response to send. Each component is separated by a colon. Amounts in bytes are plain integers, whilst delays are floats prefixed with a single d e.g. d1:100:d2 Would cause a 1 second delay, would then send 100 bytes of the file, and then cause a 2 second delay, before sending the remainder of the file.

If the last token is of the form rN, instead of sending the remainder of the file, the previous N instructions will be repeated until the whole file has been sent e.g. d1:100:d2:r2 Causes a delay of 1s, then 100 bytes to be sent, then a 2s delay and then a further 100 bytes followed by a two second delay until the response has been fully sent.