- From: Jeffrey Mogul <mogul@pa.dec.com>
- Date: Fri, 12 Dec 97 14:16:18 PST
- To: http-wg%cuckoo.hpl.hp.com@hplb.hpl.hp.com
After thinking about this some more, I believe we've (almost) all missed an obvious solution. We're concerned about how the sender specifies the actual length of the message body when a transfer-coding is used. Dave Morris has been saying "redefine the encoding to include a header (within the output of the encoding process) which gives the length." Which I had been thinking of as a bad idea, because it means that HTTP would be in the business of specifying the format of the message bodies. But then I remembered something that Dave had written earlier: We introduced CHUNKed transfer encoding because it is difficult for some servers to know the content length prior to beginning to send data. (in this case, he was discussing trailers, but it's an important observation.) And we already have the ability to specify multiple transfer codings in the Transfer-Encoding header. So: Instead of defining a Transfer-Length header, we could simply add this rule: If a message is sent on a persistent connection using a transfer-coding that does not exactly preserve the length of the data being encoding, then the "chunked" transfer-coding MUST be used, and MUST be the last transfer-coding applied. I.e., instead of sending HTTP/1.1 200 OK Date: Thu, 11 Dec 1997 20:33:51 GMT Transfer-Encoding: compress Transfer-Length: 12345 ... compressed data ... a server could send HTTP/1.1 200 OK Date: Thu, 11 Dec 1997 20:33:51 GMT Transfer-Encoding: compress, chunked 3039 ... compressed data ... 0 [Note: 12345 = 0x3039] Since the chunked encoding by definition includes the "transfer length", we don't need another header field. And all HTTP/1.1 implementations are required to support ("receive and decode") the chunked transfer-coding, so we don't need to argue about whether this is interoperable. We don't have to require a chunked transfer-coding when the end-of-message is marked by end-of-connection (not that we want to encourage it, of course) since current HTTP/1.0 practice suggests that this basically works. Aside from that, I don't have much to complain about Paul Leach's "simplified" proposal, although I'm not sure it would really be any simpler once all the definitions are made consistent. When Paul writes: Under these rules, Content-Length is still logically end-to-end -- the header may not physically be present, but its value if it is ever present is well-defined end-to-end and the same end-to-end. I'm not sure it makes sense to talk about a header being "end-to-end" if it isn't actually transmitted on some hops. The content-length *value* is certainly end-to-end (although this is really an entity-length value), but I'm not sure we should be calling a header end-to-end if it is possible to remove it. After all, the definition in 13.5.1 says: . End-to-end headers, which must be transmitted to the ultimate recipient of a request or response. End-to-end headers in responses must be stored as part of a cache entry and transmitted in any response formed from a cache entry. Do you really want to change this definition? Or admit that Content-Length is another category? -Jeff
Received on Friday, 12 December 1997 14:18:17 UTC