| - 0.0.0.0 / IPv6. |
| |
| - Speed tweaking. |
| |
| - Anticipate multivalue and single-value-only headers in request headers in |
| parser.py. |
| |
| - Timeout functests. |
| |
| - Complex pipelining functests (with intermediate connection: close). |
| |
| - Killthreads support. |
| |
| - "TCP segment of a reassembled PDU" in wireshark. |
| |
| - Jim F. would like the server to log request start, request queue (to thread |
| pool), app start, app finish, and request finish (all data has been |
| flushed to client) events. |
| |
| Some challenges exist trying to divine per-request end time. We currently |
| have the potential for request pipelining; the channel might service more |
| than one request before it closes. We currently don't preserve any |
| information about which request a response's data belongs to while flushing |
| response data from a connection's output buffer. |
| |
| While accepting request data from a client, Waitress will obtain N request |
| bodies and schedule all the requests it receives with the task manager. |
| For example, if it obtains two request bodies in a single recv() call it |
| will create two request objects and schedule *both* of these requests to be |
| serviced by the task manager immediately. |
| |
| The task thread manager will service these synchronously: the first request |
| will be run first, then the second. When the first request runs, it will |
| push data to the out buffer, then it will end. Then the second request |
| will run, and push data to the same out buffer, and it will end. While |
| these requests are executing, the channel from whence they came stops |
| accepting requests until the previously scheduled requests have actually |
| been serviced. The request-burdened channel will be *sending* data to the |
| client while the requests are being serviced, it just won't accept any more |
| data until existing requests have been serviced. In the meantime, other |
| channels may still be generating requests and adding tasks to the task |
| manager. |
| |
| To capture request-end time we could create an output buffer per request or |
| we could keep a dictionary of the final bytestream position of the |
| outbuffer for each response to to request id; either would be a |
| straightforward way to capture the fact that a particular request's |
| response data has been flushed. We currently don't do that though. |
| |
| Here's what we can currently log without changing anything: |
| |
| An example of the events logged for a connection that receives two requests |
| and each request succeeds, and the connection is closed after sending all |
| data:: |
| |
| channel created: channel 1 at time 10 |
| request created: channel 1, request id 1 at time 11 |
| request created: channel 1, request id 2 at time 12 |
| channel requests queued: channel 1, request ids 1,2 at time 13 |
| request started: request id 1 at time 14 |
| request serviced: request id 1 at time 15 |
| request started: request id 2 at time 16 |
| request serviced: request id 2 at time 17 |
| channel closed: channel 1 at time 18 |
| |
| An example of the events logged for a connection that receives two requests |
| and the first request fails in such a way that the next request cannot |
| proceed (content-length header of the first response does not match number |
| of bytes sent in response to the first request, for example):: |
| |
| channel created: channel 1 at time 10 |
| request created: channel 1, request id 1 at time 11 |
| request created: channel 1, request id 2 at time 12 |
| channel requests queued: channel 1, request ids 1,2 at time 13 |
| request started: request id 1 at time 14 |
| request serviced: request id 1 at time 15 |
| request cancelled: request id 2 at time 17 |
| channel closed: channel 1 at time 18 |
| |
| An example of the events logged for a connection that receives four |
| requests (which all succeed in generating successful responses) but where |
| the client waits for the first two responses to send the second two |
| requests: |
| |
| channel created: channel 1 at time 10 |
| request created: channel 1, request id 1 at time 11 |
| request created: channel 1, request id 2 at time 12 |
| channel requests queued: channel 1, request ids 1,2 at time 13 |
| request started: request id 1 at time 14 |
| request serviced: request id 1 at time 15 |
| request started: request id 2 at time 15 |
| request serviced: request id 2 at time 16 |
| request created: channel 1, request id 3 at time 17 |
| request created: channel 1, request id 4 at time 18 |
| channel requests queued: channel 1, request ids 3,4 at time 18 |
| request started: request id 3 at time 19 |
| request serviced: request id 3 at time 20 |
| request started: request id 4 at time 21 |
| request serviced: request id 4 at time 22 |
| channel closed: channel 1 at time 23 |