- From: James Graham <james@hoppipolla.co.uk>
- Date: Wed, 14 Aug 2013 14:05:32 +0100
- To: "public-test-infra@w3.org" <public-test-infra@w3.org>
I have started work on a python-based test server that I hope we can use
in order to replace the combination of apache and PHP. I currently have
some running code but it's at a very early stage, which means that this
is the ideal time to get feedback about requirements and implementation.
The implementation so far is at [1]. There is a requirements.txt file
that details some of the requirements that I have kept in mind. To quote:
"""Need a HTTP server with at least the following features:
* Suitable to run on individual test slaves and over the public internet
(sadly)
* Support plain TCP and SSL servers
* Serves static files with the minimum of configuration
* Allows headers to be overwritten on a per-file and per-directory basis
(not sure if we need to recurse up the tree?)
* Full customisation of headers sent (e.g. altering or omitting
"mandatory" headers)
* Simple per-client state (e.g. POST /data/key?value=foo, GET /data/key
with some sort of transparent session handling and a timeout for keeping
the value. Mochitest has this, but in a different way, and is single
user. Need to check how it is used).
* Complex logic in tests (e.g. a different response conditional on
whether a previous request for the same resource has been made).
"""
So far the server has three modes:
* Normal file handling. This applies to all files that don't fall into
one of the modes below. By default, files are server with a content type
based on their extension, although headers can be overridden by
providing a {filename}.headers file with the format
header-name: header-value
Currently headers are defined per-file only and not per-directory. What
are the requirements here? In addition, there is a "pipe" facility to
alter the response properties. Pipes are a set of predefined functions
that can be activated by providing a "pipe=" field in the query string.
For example:
GET /foo.html?pipe=status(404)|header(content-type,
text/plain)|trickle(d1:100:d1)
would send foo.html with a status of 404, the Content-Type set to
text/plain and with a 1s delay before sending 100 bytes followed by a 1s
delay and then the rest of the file.
* .asis file handling. These files are literal HTTP responses, sent
without any alteration.
* .py handling. .py files are expected to define (at least) a single
function main(request, response). This either directly controls the
response, by using the response.writer api, which provides both access
to the underlying socket and a variety of methods for writing specific
parts of a normal HTTP response, or by setting the status, headers and
content property of the response object, or by the return value. The
return value can be a single string containing the response body or a
two-item tuple containing headers, body, or a three item tuple
containing status, headers, body. The functions don't run in any kind of
sandbox (this is technically challenging with python, aiui) and so have
the ability to do pretty much anything.
At this point the server only runs on a single port and doesn't support
SSL. Some thought needs to be given to the best way to recreate the
multiple origins served by w3c-test.org. There is no per-client state
api, although it should be possible to implement something based on
cookies "sessions"; I need to examine the requirements for this more
carefully. There are no custom utility functions available for the .py
files to use, but it should be possible to fix that somehow.
Any feedback about requirements or implementation details is very welcome.
[1] https://github.com/jgraham/wptserve/tree/initial
Received on Wednesday, 14 August 2013 13:06:03 UTC