- From: Julian Reschke <julian.reschke@gmx.de>
- Date: Thu, 15 Dec 2011 00:09:45 +0100
- To: Alex Rousskov <rousskov@measurement-factory.com>
- CC: HTTP Working Group <ietf-http-wg@w3.org>
On 2011-12-14 23:20, Alex Rousskov wrote:
> On 12/14/2011 01:19 PM, Julian Reschke wrote:
>> Here's an attempt to clean up Expect:
>>
>> - fixes the grammar to allow params for value-less expectations
>>
>> - re-adds whitespace (lost during ABNF update)
>>
>> - untangles the predefined value 100-continue from the ABNF
>>
>> The whole paragraph would be:
>
>
>> 9.3. Expect
>>
>> The "Expect" header field is used to indicate that particular server
>> behaviors are required by the client.
>>
>> Expect = 1#expectation
>>
>> expectation = expect-name [ BWS "=" BWS expect-value ]
>> *( OWS ";" OWS expect-param )
>> expect-param = expect-name [ BWS "=" BWS expect-value ]
>>
>> expect-name = token
>> expect-value = token / quoted-string
>>
>> 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 code.
And looking at this, that error code will always be 417, right? Thus
that text can be simplified.
> It is not 100% clear what "expectation value" is in the above MUST
> context. Just "expect-value" inside "expectation"? Or also
> "expect-value" inside "expect-param"? Or anything inside "expectation"?
> I suspect it is the latter but the addition of "-value" suffixes in BNF
> made it less clear.
>
> For example, if a server is able to comply with 100-continue but receives
>
> Expect: 100-continue; q=0
>
> can that server assume that it is still able to comply or must it
> respond with 417? Again, I suspect it is the latter.
>
> Note that the BNF in RFC 2616 did not use "value" elements so it did not
> raise similar "what is expectation value" questions.
>
> Please consider replacing "any of the expectation values" with "any
> expectations".
Yes.
>> The server MUST respond with a
>> 417 (Expectation Failed) status code if any of the expectations
>> cannot be met or, if there are other problems with the request, some
>> other 4xx status code.
>
> Technically, the above is ambiguous because both conditions could be
> true. Not a big problem, but perhaps it should be polished since this is
> a MUST. More on this below.
Actually, the 4xx part isn't needed here. It's not specific to Expect:.
>> 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 that it does not support,
>> it MUST respond with a 417 (Expectation Failed) status code.
>
> This paragraph kind of adds a third condition to the previous group of
> MUSTs so it would be nice to merge them together:
Doesn't is just repeat what was said before? I think it can be dropped
as well.
> does not understand: 417
> understands but cannot meet: 417
> cannot parse: 4xx that is not 417
>
> with some prioritization language to resolve conflicts when multiple
> conditions apply at the same time.
>
>
>> The Expect mechanism is hop-by-hop: that is, an HTTP/1.1 proxy MUST
>> return a 417 (Expectation Failed) status code if it receives a
>> request with an expectation that it cannot meet.
>
> In general, it is a bad idea to partially repeat a MUST specified
> elsewhere. It raises questions whether this repetition for proxies
> somehow annuls other related MUSTs when it comes to proxies (e.g.,
> server MUST respond with 4xx if ...). It may be better to replace this
> with something like:
Yes, we can just state that the requirements apply to all *recipients*.
> The Expect mechanism is hop-by-hop; the above server requirements
> apply to proxies.
>
>
>> However, the Expect
>> header field itself is end-to-end; it MUST be forwarded if the
>> request is forwarded.
>
> RFC 2616 does not have an explicit "end-to-end headers MUST be
> forwarded" rule (AFAIK). If that problem is fixed in HTTPbis, there will
> be (or already is) a similar "repeated MUST" concern here.
"It always said that" :-) Not sure what we should do here.
I now have:
9.3. Expect
The "Expect" header field is used to indicate that particular server
behaviors are required by the client.
Expect = 1#expectation
expectation = expect-name [ BWS "=" BWS expect-value ]
*( OWS ";" OWS expect-param )
expect-param = expect-name [ BWS "=" BWS expect-value ]
expect-name = token
expect-value = token / quoted-string
A recipient that does not understand or is unable to comply with any
of the expectations in the Expect header field(s) of a request MUST
respond with a 417 (Expectation Failed) status code.
The only expectation defined by this specification is:
100-continue
Defined in Section 6.2.3 of [Part1]
Comparison is case-insensitive for names (expect-name), and case-
sensitive for values (expect-value).
The Expect mechanism is hop-by-hop: the above requirements apply to
any component receiving requests. However, the Expect header field
itself is end-to-end; it MUST be forwarded if the request is
forwarded.
Many older HTTP/1.0 and HTTP/1.1 applications do not understand the
Expect header field.
Thanks for the feedback, Alex. Please have another look!
Best regards, Julian
Received on Wednesday, 14 December 2011 23:10:28 UTC