- From: Roy T. Fielding <fielding@avron.ICS.UCI.EDU>
- Date: Thu, 29 Feb 1996 02:41:42 -0800
- To: Koen Holtman <koen@win.tue.nl>
- Cc: http-wg%cuckoo.hpl.hp.com@hplb.hpl.hp.com
Koen writes:
> Eek! You can't just say "servers must be capable of handling any
> sensible Unless header" in a protocol definition. Not without giving
> a complete definition of "sensible Unless header".
No problemo:
A sensible precondition for a given request method and Request-URI
is one that can be checked prior to the method being applied to that
Request-URI. Any non-sensible precondition may be ignored.
Regarding the other option...
> Maybe this just means that you really want both. Or something like
>
> Check-ID = "Check-ID" ":" [ "not" ] 1#cid
Nope -- that runs into problems if there are multiple Check-ID fields.
>> How about something neutral
>>like Check-ID?
>>
>> Check-ID = "Check-ID" ":" 1#cid
>>
>>Let's see what the semantics are for a request containing Check-ID:
>>
>> ID is in ID not in
>> Check-ID Check-ID (or IMS true)
>> --------- ---------
>> GET 200 412
>
> I believe you mean
>
> GET 412 200
>
> (For those of you not looking at a copy of the draft spec: 412 would
> mean "Check true", 304 is "Not modified".)
Sorry, my fault, I should have said that 412 means "Precondition False".
That makes the error code more appropriate (and less confusing) than
the old "Unless True".
>> GET + IMS 304 200
>
> I would make this
>
> GET + IMS 412 200 or 304
>
>
>> GET + Range 206 412
>> GET + IMS + Range 206 200
>> other methods as normal 412
>>
>>That would take care of Ari's desire for a "give me an error instead"
>>type of precondition for Range as well.
>
> Hm, taking care of it this way would be a bit of a hack, though.
Yes, I prefer an option in the Range header. However, the above is no more
of a hack than what is currently in the Range Retrieval spec. The problem
is that what is desired is two different results if the precondition fails,
and thus using Unless-ID vs If-ID (or If-Invalid vs If-Valid, as is in
the current draft) is no help because it just changes the precondition.
============================================================
In summary, the proposal now looks like:
200 == OK
206 == Partial Content
304 == Use Local Copy [includes the Content-ID of the copy chosen]
412 == Precondition False
GET unless we would be given one of the variants already cached:
Request: GET + Unless-ID
Response: 304 if Content-ID is in Unless-ID
200 if Content-ID not in Unless-ID
Cache validation:
Request: GET + IMS + Unless-ID
Response: 304 if Content-ID is in Unless-ID
200 if Content-ID not in Unless-ID
Partial GET (w/OK response if changed):
Request: GET + Range + If-ID
Response: 206 if Content-ID is in If-ID
200 if Content-ID not in If-ID
Partial GET (w/bad response if changed):
Request: GET + Range + If-ID + [some indicator in Range]
Response: 206 if Content-ID is in If-ID
412 if Content-ID not in If-ID
Precondition for all other methods:
Request: method + If-ID
Response: 2xx if Content-ID is in If-ID
412 if Content-ID not in If-ID
Request: method + Unless-ID
Response: 412 if Content-ID is in Unless-ID
2xx if Content-ID not in Unless-ID
I think that is a reasonable and simple design.
...Roy T. Fielding
Department of Information & Computer Science (fielding@ics.uci.edu)
University of California, Irvine, CA 92717-3425 fax:+1(714)824-4056
http://www.ics.uci.edu/~fielding/
Received on Thursday, 29 February 1996 03:02:05 UTC