HttpServer - issue in handling of "Expect: 100-continue"
Michael McMahon
Michael.McMahon at Sun.COM
Wed Mar 25 03:42:00 PDT 2009
Hi Stewart,
My reading of RFC2616 on this question suggests
that the server isn't wrong sending a Content-Length: 0
header with the initial 100-Continue response, regardless
of whether or not, the final response will contain a chunked
response body.
The 100- Continue is a normal response, structured
in the same way as other responses, ie. it can include
other header fields. In 14.18, the rfc mentions that
the Date header is optional in 100-Continue responses.
So, while it's not explicit, this suggests that other headers
like Content-Length are also allowable. In 14.13 , it also
mentions that a Content-Length value of zero, is valid.
Like I said that is my reading of the spec at least.
Regards,
Michael.
Stewart Gebbie wrote:
> Hi,
>
> I would like to report a possible bug in the com.sun.httpserver.HttpServer
> implementation.
>
> In short this relates to the handling of "Expect: 100-continue" in the case
> where the server code intends to reply using "Transfer-encoding: chunked".
>
> ex.sendResponseHeaders(HttpURLConnection.HTTP_OK, 0);
>
> The problem arises because the response by the server (as implemented in
> sun/net/httpserver/ServerImpl.java) results in:
>
> HTTP/1.1 100 Continue
> Content-Length: 0
>
> rather than just:
>
> HTTP/1.1 100 Continue
>
>
> This becomes a issue when interacting with cURL (curl-7.19.0
> http://curl.haxx.se/) as the client, since cURL first sees the content length
> of 0, and then subsequently sees the server requesting chucked transfer
> encoding. cURL's "curl_easy_perform" function then fails with the error
> message (see conversation A below):
>
> Code 18: "transfer closed with outstanding read data remaining"
>
> the libcurl-errors man page explains this error as follows:
>
> "CURLE_PARTIAL_FILE (18)
> A file transfer was shorter or larger than expected. This hap‐
> pens when the server first reports an expected transfer size,
> and then delivers data that doesn't match the previously given
> size."
>
> If I instead change the server to use a fixed length response (see
> conversation B below):
>
> ex.sendResponseHeaders(HttpURLConnection.HTTP_OK, DEFAULT_RESPONSE.length()); // length should be 0 for chucked transfer
>
> cURL is happy enough to continue (even though in this case it receives two
> "Content-Length" headers, the first with a 0 length and the second with the
> actual data length).
>
> To more clearly see what is happening I have included two abbreviated HTTP
> conversations below.
>
> I realise that the other alternative is that cURL ignore the Content-Length in
> the case of receiving a "Transfer-encoding" header. This seems to be implied
> by the HTTP RFC:
>
> http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.4
>
> "3. If a Content-Length header field (section 14.13) is present, its decimal
> value in OCTETs represents both the entity-length and the transfer-length.
> The Content-Length header field MUST NOT be sent if these two lengths are
> different (i.e., if a Transfer-Encoding header field is present). If a
> message is received with both a Transfer-Encoding header field and a
> Content-Length header field, the latter MUST be ignored."
>
> I simply do not know the requirements of the HTTP protocol well enough to be
> sure of what the right resolution. However, to me, it still seems still seems
> reasonable that, in either case, the "Content-Length" header should not be
> included after the "100 Continue" response.
>
> Please could somebody look into this issue.
>
> Thanks.
>
> Regards,
> Stewart.
>
>
More information about the net-dev
mailing list