- From: Yaron Goland <yarong@microsoft.com>
- Date: Thu, 17 Jul 1997 16:39:32 -0700
- To: 'Jeffrey Mogul' <mogul@pa.dec.com>, http-wg%cuckoo.hpl.hp.com@hplb.hpl.hp.com
In order to allow maximum flexibility shouldn't: o A client MUST be prepared to accept a 100 (Continue) status message followed by a regular response, even if the client does not expect a 100 (Continue) status message. Instead read: A client MUST be prepared to accept 100 (Continue) status messages... ? Thanks, Yaron > -----Original Message----- > From: Jeffrey Mogul [SMTP:mogul@pa.dec.com] > Sent: Wednesday, July 16, 1997 2:16 PM > To: http-wg@cuckoo.hpl.hp.com > Subject: Proposed resolution for the STATUS100 issue > > Warning: long message. > > This message contains proposed changes and additions to several > sections of RFC2068, as a resolution of the STATUS100 issue. > Please refer to RFC2068 for the original language (if any). > > See > http://www.w3.org/pub/WWW/Protocols/HTTP/Issues/#STATUS100 > although a lot of the discussion is not easily found except by > looking at a lot of the HTTP-WG mailing list archive. > > Comments should be reported as soon as possible, since the HTTP/1.1 > editorial group intends to issue a last-call on this issue within > the next week or so. > > -Jeff > > === > === Major revisions to 8.2 > === > ====================== > > 8.2 Message Transmission Requirements > > 8.2.1 Persistent connections and flow control > > HTTP/1.1 servers SHOULD maintain persistent connections and use > TCP's flow control mechanisms to resolve temporary overloads, > rather than terminating connections with the expectation that > clients will retry. The latter technique can exacerbate network > congestion. > > 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 footer 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. > > 8.2.3 Automatic retrying of requests > > If a client sees the transport connection close before it receives > a > final response to its request, if the request method is idempotent > (see section 9.1.2), the client SHOULD retry the request without > user interaction. If the request method is not idempotent, the > client SHOULD NOT retry the request without user confirmation. > (Confirmation by user agent software with semantic understanding of > the application MAY substitute for user confirmation.) > > 8.2.4 Use of the 100 (Continue) status > > The purpose of the 100 (Continue) status (see section 10.1.1) is to > allow an end-client that is sending a request message with a > request > body to determine if the origin server is willing to accept the > request (based on the request headers) before the client sends the > request body. In some cases, it may either be inappropriate or > highly inefficient for the client to send the body if the server > will reject the message without looking at the body. > > Requirements for HTTP/1.1 or later clients: > o If a client will wait for a 100 (Continue) response before > sending > the request body, it MUST send an "Expect" request-header field > (section 14.XX) with the "100-continue" expectation. > > o A client MUST be prepared to accept a 100 (Continue) status > message followed by a regular response, even if the client does > not expect a 100 (Continue) status message. > > o A client MUST NOT send an "Expect" request-header field > (section 14.XX) with the "100-continue" expectation if it > does not intend to send a request body. > > Note: Because of the presence of older implementations, the > protocol allows ambiguous situations in which a client may send > "Expect: 100-continue" without receiving either a 419 > (Expectation Failed) status or a 100 (Continue) status. > Therefore, when a client sends this header field to an origin > server (possibly via a proxy) from which it has never seen a 100 > (Continue) status, the client should not wait for an indefinite > or lengthy period before sending the request body. > > Requirements for HTTP/1.1 or later origin servers: > o Upon receiving a request which includes an "Expect" > request-header > field with the "100-continue" expectation, an origin server must > either respond with 100 (Continue) status and continue to read > from the input stream, or respond with an error status. If it > responds with an error status, it MAY close the transport (TCP) > connection or it MAY continue to read and discard the rest of > the > request. It MUST NOT perform the requested method if it returns > an error status. > > o An origin server SHOULD NOT send a 100 (Continue) response if > the request message does not include an "Expect" request-header > field with the "100-continue" expectation, and MUST NOT send a > 100 (Continue) response if such a request comes from an HTTP/1.0 > (or earlier) client. > > o An origin server SHOULD NOT send a 100 (Continue) response if > has already received some or all of the request body for the > corresponding request. > > o An origin server that sends a 100 (Continue) response MUST > ultimately send a final status code, once the request body > is received and processed, unless it terminates the transport > connection prematurely. > > o If an origin server receives a request that does not include an > "Expect" request-header field with the "100-continue" > expectation, and the request includes a request body, and the > server responds with an error status before reading the entire > request body from the transport connection, then the server > SHOULD NOT close the transport connection until it has read the > entire request, or until the client closes the connection. > Otherwise, the client may not reliably receive the response > message. > > For compatibility with RFC 2068, a server MAY send a 100 (Continue) > status in response to an HTTP/1.1 PUT or POST request that does not > include an "Expect" request-header field with the "100-continue" > expectation. This exception, the purpose of which is to minimize > any client processing delays associated with an undeclared wait for > 100 (Continue) status, applies only to HTTP/1.1 requests, and not > to > requests with any other HTTP-version value. > > Requirements for HTTP/1.1 or later proxies: > o If a proxy receives a request that includes an "Expect" > request-header field with the "100-continue" expectation, and > the > proxy either knows that the next-hop server complies with > HTTP/1.1 or higher, or does not know the HTTP version of the > next-hop server, it MUST forward the request, including the > Expect header field. > > o If the proxy knows that the version of the next-hop server is > HTTP/1.0 or lower, it MUST NOT forward the request, and it MUST > respond with a 419 (Expectation Failed) status. > > o Proxies SHOULD maintain a cache recording the HTTP version > numbers received from recently-referenced next-hop servers. > > o A Proxy MUST NOT forward a 100 (Continue) response if the > request > message was received from an HTTP/1.0 (or earlier) client and > did > not include an "Expect" request-header field with the > "100-continue" expectation. Otherwise, proxies MUST forward > response messages with status code 100 (Continue), unless the > proxy itself added the "Expected: 100-continue" field to the > request, or unless the connection between the proxy and its > client has been closed. > > 8.2.5 Client behavior if server prematurely closes connection > > If an HTTP/1.1 (or later) client sends a request which includes a > request body, but which does not include an "Expect" request-header > field with the "100-continue" expectation, and if the client is not > directly connected to an HTTP/1.1 (or later) origin server, and if > the the client sees the connection close before receiving any > status > from the server, the client SHOULD retry the request, subject to > the > restrictions in section 8.2.3. If the client does retry this > request, it MAY use the following "binary exponential backoff" > algorithm to be assured of obtaining a reliable response: > > 1. Initiate a new connection to the server > > 2. Transmit the request-headers > > 3. Initialize a variable R to the estimated round-trip time to the > server (e.g., based on the time it took to establish the > connection), or to a constant value of 5 seconds if the > round-trip > time is not available. > > 4. Compute T = R * (2**N), where N is the number of previous retries > of this request. > > 5. Wait either for an error response from the server, or for T > seconds > (whichever comes first) > > 6. If no error response is received, after T seconds transmit the > body > of the request. > > 7. If client sees that the connection is closed prematurely, repeat > from step 1 until the request is accepted, an error response is > received, or the user terminates the retry process. > > If at any point an error status is received, the client > > o SHOULD NOT continue and > > o SHOULD close the connection if it has not completed sending the > request message. > > ============================= > === > === 10.4.1 100 Continue: > === > === One new sentence added at the end, as a cross-reference: > === > ============================= > > 10.4.1 100 Continue > > The client may continue with its request. This interim response is > used to inform the client that the initial part of the request has > been received and has not yet been rejected by the server. The > client > SHOULD continue by sending the remainder of the request or, if the > request has already been completed, ignore this response. The > server > MUST send a final response after the request has been completed. > See section 8.2.4 for detailed discussion of the use and handling > of this status code. > ============================= > === > === What follows is basically what I sent on Wed, 02 Jul 97, in > === http://www.ics.uci.edu/pub/ietf/http/hypermail/1997q3/0027.html > === but with a few changes: > === > === (1) I've changed the header name from "Expected" to "Expect", > === just to save a couple of bytes. > === > === (2) Following Scott Lawrence's suggestion in > === http://www.ics.uci.edu/pub/ietf/http/hypermail/1997q3/0032.html > === I've changed the status code from 412 (Precondition Failed) to a > new > === 419 (Expectation failed) code, and included additional language > === for specifying that new code. > === > === (3) I've added some clarifications based on my message on "Is > 100-Continue > === hop-by-hop?", > === http://www.ics.uci.edu/pub/ietf/http/hypermail/1997q3/0078.html > === > === (4) I did NOT add an "Expect: 100-hopbyhop" because nobody has > === spoken up in its favor. > === > === (5) I reorganized the paragraphs slightly, and introduced a new > === subhead. > === > ============================= > > 10.4.20 419 Expectation Failed > > The expectation given in an "Expect" request-header field (see > section 14.XX) could not be met by this server, or, if the server > is > a proxy, the server has unambiguous evidence that the request could > not be met by the next-hop server. > > ============================= > > 14.XX Expect > > The Expect request-header field is used to indicate that > particular server behaviors are required by the client. A > server that does not understand or is unable to comply with any of > the expectation values in the Expect field of a request MUST > respond with appropriate error status. > > Expect = "Expect" ":" 1#expectation > > expectation = "100-continue" | expectation-extension > expectation-extension = token [ "=" ( token | quoted-string ) > *expect-params ] > expect-params = ";" token [ = ( token | quoted-string > ) ] > > The server SHOULD respond with a 419 (Expectation Failed) status > if any of the expectations cannot be met. > > This header field is defined with extensible syntax to allow for > future extensions. If a server receives a request containing > an Expect field that includes an expectation-extension that > it does not support, it MUST respond with a 419 (Expectation > Failed) status. > > 14.XX.1 Expect 100-continue > > When the "100-continue" expectation is present on a request that > includes a body, the requesting client will wait after sending the > request headers before sending the content-body. In this case, > the > server MUST conform to the requirements of section 8.2.4: it MUST > either send a 100 (Continue) status, or an error status, after > receiving the "Expect: 100-continue" request header. > > If a proxy receives a request with the "100-continue" expectation, > and the proxy either knows that the next-hop server complies with > HTTP/1.1 or higher, or does not know the HTTP version of the > next-hop server, it MUST forward the request, including the Expect > header field. If the proxy knows that the version of the next-hop > server is HTTP/1.0 or lower, it MUST NOT forward the request, and > it MUST respond with a 419 (Expectation Failed) status. Proxies > SHOULD maintain a cache recording the HTTP version numbers > received > from recently-referenced next-hop servers. > > Note: Because of the presence of older implementations, the > protocol allows ambiguous situations in which a client may send > "Expect: 100-continue" without receiving either a 419 > (Expectation Failed) status or a 100 (Continue) status. > Therefore, when a client sends this header field to an origin > server (possibly via a proxy) from which it has never seen a > 100 (Continue) status, the client should not wait for an > indefinite or lengthy period before sending the request body. > > ============================= > === > === 13.11 in RFC 2068 incorrectly allows a proxy to inject > === its own 100 response into the reply stream. The change > === below modifies *only* the last sentence of the first > === paragraph. > === > ============================= > > 13.11 Write-Through Mandatory > > All methods that may be expected to cause modifications to the > origin > server's resources MUST be written through to the origin server. > This > currently includes all methods except for GET and HEAD. A cache > MUST > NOT reply to such a request from a client before having transmitted > the request to the inbound server, and having received a > corresponding response from the inbound server. This does not > prevent a proxy cache from forwarding a 100 (Continue) response > before the inbound server has sent its final reply. > > The alternative (known as "write-back" or "copy-back" caching) is > not > allowed in HTTP/1.1, due to the difficulty of providing consistent > updates and the problems arising from server, cache, or network > failure prior to write-back. > > ============================= > === > === Add this to the end of 8.1.2.2 (Pipelining) > === > ============================= > > Clients SHOULD NOT pipeline requests using non-idempotent methods > or > non-idempotent sequences of methods (see section 9.1.2). > Otherwise, > a premature termination of the transport connection may lead to > indeterminate results. A client wishing to send a non-idempotent > request SHOULD wait to send that request until it has received the > response status for the previous request. > > ============================= > > [End of changes for STATUS100]
Received on Thursday, 17 July 1997 16:51:14 UTC