- From: Jamie Lokier <jamie@shareable.org>
- Date: Sun, 28 Mar 2010 15:20:01 +0100
- To: Greg Wilkins <gregw@webtide.com>
- Cc: ietf-http-wg@w3.org
Greg Wilkins wrote: > thanks for that info. I had not realized that the client had > not choice but to not reuse the connection if a non-100 response > is received. I believe it's ok to reuse the connection if it posts a request body matching the headers. However: > Then perhaps the bis spec can enhanced to make this point clearer. I found this part of RFC2616 a little confusing: 8.2.2 Monitoring Connections for Error Status Messages An HTTP/1.1 (or later) client sending a message-body SHOULD monitor the network connection for an error status while it is transmitting the request. If the client sees an error status, it SHOULD immediately cease transmitting the body. If the body is being sent using a "chunked" encoding (section 3.6), a zero length chunk and empty trailer MAY be used to prematurely mark the end of the message. If the body was preceded by a Content-Length header, the client MUST close the connection. As far I know, the client does not have to close the connection, if it continues to transmit the rest of the body. And if it does close, of course it shouldn't do so until it's seen the whole response, not just the "error status". Moreover, I wasn't sure what _exactly_ counts as an "error status", as it's not a defined term, and 3xx (not an error) would seem to need the same behaviour. Or even 2xx, if the request body isn't relevant. (Although I really like the idea of simultaneously streaming request and response bodies). > It might also be good to suggest that servers send Connection: close > with non 100 responses if expect 100 is received. This would > make clients that don't know they should close, do the close. I don't think it's necessary for them to close, despite the MUST above ;-) In other words, I parse the above RFC2616 extract with the MUST clause conditional on the client performing the SHOULD and ceasing to transmit the body - if it hasn't already finished that. Actually I go a bit further: With certain types (Microsoft) of authentication, the client must not close the connection... Here's a proposed alternative text. It could be tidied a bit: 8.2.2 Monitoring Connections and Aborting Request Bodies An HTTP/1.1 (or later) client sending a message-body SHOULD monitor the network connection for a response while it is transmitting the request. If the client sees a 3xx, 4xx or 5xx status, it SHOULD immediately cease transmitting the body (by which we also mean not starting to transmit if it has not started), although it MAY continue transmitting the body if there is not much remaining to transmit, the latter being an implementation-defined heuristic. All references to ceasing to transmit the body shall The client SHOULD also cease transmitting the body, subject to the above option to continue transmitting, if it sees a 2xx status which is not preceded by 100 (Continue) after it had sent the Expect request header field with the "100-continue" expectation. This allows a server to indicate that it is still consuming the request body while it sends the response, or to indicate that it does not require the request body. When ceasing to transmit the body, if the body is being sent using a "chunked" encoding (section 3.6), a zero length chunk and empty trailer MAY be used to prematurely mark the end of the message, and connection reuse is possible. When ceasing to transmit a body which was preceded by a Content-Length header, the client SHOULD halt transmission and wait until it has received the response, and it MUST close the connection without sending another request. If the client requires the whole response, it MUST NOT signal end of transmission prior to receiving the whole response by "half-closing" the connection, in the sense described as simplex close in [RFC793] section 3.5, as that typically causes the server to cease transmitting the response. An idea: When aborting with a zero length trunk, could we append an "aborted" chunk-extension, to indicate clearly that it was truncated, not ended cleanly? -- Jamie
Received on Sunday, 28 March 2010 14:20:29 UTC