Revised "Range:" proposal

Ari and I have agree on the following, and Ari will be submitting
a revised draft-luotonen-http-url-byterange-XX.txt by the cutoff
date (Thursday).

-Jeff

------- Forwarded Message

Return-Path: mogul
Received: by acetes.pa.dec.com; id AA22205; Fri, 16 Feb 96 15:36:08 -0800
Message-Id: <9602162336.AA22205@acetes.pa.dec.com>
To: luotonen@netscape.com (Ari Luotonen)
Cc: mogul
Subject: range proposal revisions
Date: Fri, 16 Feb 96 15:36:08 PST
From: Jeffrey Mogul <mogul>

Pretty much the only part of draft-luotonen-http-url-byterange-02.txt
that I think needs changing is this section:

----------------------------------------
3.2. The Unless-Modified-Since HTTP request header

   Guaranteeing that individual parts are all up-to-date and in sync
   with each other is crucial.  This can be made easier by providing a
   way to tell the server to send the byte range only if it hasn't
   changed since the time of the retrieval of the other ranges.  If it
   has, the entire document is transferred instead.

   The Unless-Modified-Since header will be sent by the client to the
   server (or the proxy), carrying the date and time received in the
   Last-Modified header from the previously received parts.  If at any
   point the last-modified date or time mismatch is detected by the
   client, the older parts should be discarded.  The last-modified date
   and time must match exactly.

   The server will send the requested byte range (as a 206 Partial
   Content response, as described below) if and only if the document has
   not changed since that date and time.  If it has, the server will
   send the entire document to the client instead (as a normal 200
   response).

   Example:

        Unless-Modified-Since: Wed, 15 Nov 1995 06:25:15 GMT

   As for Last-Modified-Since header in practice, there may be
   additional parameters in the end of this field, separated by a
   semicolon, to make additional checksums possible.  The most basic one
   is the size of the file as the length parameter:

        Unless-Modified-Since: Wed, 15 Nov 1995 06:25:15 GMT; length=12045
----------------------------------------

How about this proposal:

	(1) There are three cases of Range retrievals:
		(A) Unconditional ... always returns the
		selected range (if it exists).
		
		Servers that do not support Range: return entire
		resource.
		
		(B) Insertion ... returns the selected
		range if the request-validator is valid,
		otherwise returns entire resource.

		Servers that do not support Range: return entire
		resource if the validator is valid, else return
		nothing + "306 Modified".

	case (B) is for filling in a hole in a cached resource,
	perhaps after an interrupted retrieval, or perhaps after
	a previous Unconditional or Tentative Range: request.

Note that if the server does not support Range:, it requires an
extra round-trip to update a cached resource with a hole in it.

I think your original "Unless-modified-since:" proposal has a
similar inefficiency; there's probably not much that can be
done about that.
		
		(C) Tentative ... returns the selected
		range if the request-validator is NOT valid,
		otherwise returns nothing + "304 Not Modified"

		Servers that do not support Range: return entire
		resource if the validator is not valid, else return
		nothing + "304 Not Modified".

	case (C) is a way of asking only for a specified range, but in
	a way that reloads it only if the client's cache is stale.  For
	example, you may have a large GIF image in your cache, and you
	may want to know if its GIF header has changed (so that you can
	do an early rendering of the enclosing HTML file), but you do
	not want to retrieve the whole image right away.

My message to the http-wg list in December,
	http://www.ics.uci.edu/pub/ietf/http/hypermail/1995q4/0454.html
has this last case different (I instead had "returns selected
range if validator is valid, else returns nothing"), but I don't
think that's a useful feature.

	(2) The three cases are implemented in HTTP/1.1 using
	some combination of these three headers
		Range:
		If-invalid:
		If-valid:
	or
		Range:
		If-Modified-Since:
		Unless-Modified-Since:
	See (3) below for more about using *-Modified-Since.
	
	Case A (Unconditional) is done using
		GET /image.gif
		Range: bytes=0-128

	Case B (Insertion) is done using
		GET /image.gif
		Range: bytes=0-128
		If-valid: "xxxyxxyx"
	or perhaps
		GET /image.gif
		Range: bytes=0-128
		Unless-modified-since: Wed, 15 Nov 1995 06:25:15 GMT

	Case C (Tentative) is done using
		GET /image.gif
		Range: bytes=0-128
		If-invalid: "xxxyxxyx"
	or perhaps
		GET /image.gif
		Range: bytes=0-128
		If-modified-since: Wed, 15 Nov 1995 06:25:15 GMT

	(3) We can get rid of "Unless-modified-since:" if we adopt
	the rule that the "If-valid:" header either takes a quoted
	string (in which case it is an opaque validator) or a string
	that does not include quotes (in which case it must be an
	HTTP-date value).  This saves a few header bytes.
	
	(4) I would remove the stuff about including other "validator"
	information, such as length, from the {Unless,If}-Modified-Since:
	headers.  These are of dubious value, and they make the
	protocol more complex.

Comments?
 -Jeff

------- End of Forwarded Message

Received on Wednesday, 21 February 1996 01:16:43 UTC