- From: Julian Reschke <julian.reschke@gmx.de>
- Date: Wed, 14 Dec 2011 21:19:08 +0100
- To: Alex Rousskov <rousskov@measurement-factory.com>
- CC: James Snell <jasnell@gmail.com>, HTTP Working Group <ietf-http-wg@w3.org>
On 2011-12-06 20:13, Alex Rousskov wrote:
> On 12/06/2011 11:43 AM, James Snell wrote:
>> On Tue, Dec 6, 2011 at 8:29 AM, Alex Rousskov wrote:
>>> Overall, the Prefer grammar is more complex than any similar construct I
>>> saw in HTTPbis Part 1 or Part 6! If I did not miss any existing cases,
>>> would it be possible to simplify the Prefer grammar so that existing
>>> parsing code and data structures can be reused to deal with it?
>
>> The grammar for Prefer is modeled closely after the Expect header
>> field grammar in Part 2 and adds only the allowance that a preference
>> can have it's own value (e.g. "Prefer: wait=10" ...
>
> As Julian pointed out, expectation-extension in RFC 2616 attempts to use
> the same syntax:
>
>> Expect = 1#expectation
>>
>> expectation = "100-continue" / expectation-extension
>> expectation-extension = token [ "=" ( token / quoted-string )
>> *expect-params ]
>> expect-params = ";" token [ "=" ( token / quoted-string ) ]
>
> The only difference I see is that expect-params are only allowed for
> expectations that start with name=value but I bet that is just a bug
> with the closing ']' placement in expectation-extension definition
> (something for HTTBis to fix?).
>
> If expectation-extension is fixed, we would have to support the same
> syntax for Expect, my "this is too complex!" comment would be
> essentially wrong, and you can have the nice-looking wait=10 preference.
> ...
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. 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.
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.
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 is case-
sensitive for values (expect-value).
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. 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.
(see
<http://trac.tools.ietf.org/wg/httpbis/trac/attachment/ticket/327/327.diff>)
Feedback appreciated, Julian
Received on Wednesday, 14 December 2011 20:19:51 UTC