>Number: 3910 >Category: protocol >Synopsis: Missing 100-Continue while doing a PUT >Confidential: no >Severity: serious >Priority: medium >Responsible: apache >State: open >Class: sw-bug >Submitter-Id: apache >Arrival-Date: Wed Feb 17 13:10:01 PST 1999 >Last-Modified: >Originator: [EMAIL PROTECTED] >Organization: apache >Release: 1.3.4 >Environment: gcc SunOS tuvalu 5.5 Generic_103093-11 sun4m >Description: I had reported this bug before (PR#3575).
The answer I got describes a new behavior that states when the 100-Continue shouldn't be sent. However, 100-Continue isn't being sent anymore while doing a PUT. I checked back with Henrik Frystyk and he agrees this is a bug in Apache. >How-To-Repeat: Install mod_put or a PUT script -- the bug doesn't depend on the PUT being implemented by a module or by a CGI script. Then try something like: ================================ PUT /test.html HTTP/1.1 Accept: */* Accept-Encoding: deflate TE: trailers,deflate Expect: 100-continue Host: tuvalu:7990 If-Match: "3f9f5-14aa-36add0b9" User-Agent: amaya/V1.4a libwww/5.2.1 Connection: TE Date: Tue, 26 Jan 1999 14:28:23 GMT Allow: PUT Content-Length: 10 Content-Type: text/html ========= or even simpler like: ========= PUT /test.html HTTP/1.1 Expect: 100-continue Host: tuvalu:7990 Content-Length: 10 Content-Type: text/html ============== You won't get any 100-Continue. In fact, Apache is already waiting for your data. If you type it in, it'll get PUT'ed. >Fix: Apache initiallty detects the Expect: 100-Continue header and sets up an internal flag (expecting_100) in a request_rec variable (let's say r). However, later on down the pipeline, there's a call http_request.c:internal_internal_redirect() where a new request_rec variable is created (new_uri). Several fields of r are copied to new_uri, however this is not the case of expecting_100. Later on, there's a call to http_protocol.c:ap_should_client_block() where Apache decides whether it should send the 100-Continue answer. As r->expecting_100 (in fact, it's new_uri->expecting_100 which was initialized above) is always zero, the 100-Continue won't be sent. Note that the expecting_100 flag is correctly copied in http_protocol.c:ap_set_sub_req_protocol. My guess is that it was just missing on the internal_internal_redirect(). SOLUTION I added a line to copy the status of r->expecting_100 to new_uri->expecting_100. After applying my patch, I could get a 100-Continue answer while making a POST or a PUT. When trying to do so with a HEAD or GET request, I didn't get any 100-Continue, as Roy's overrode this header (as expected :)). I didn't push the tests to see how it works while using a proxy. I hope that this modest contribution is helpful to the Apache team. Cheers, -Jose PATCH ===================== *** http_request.c.new Wed Jan 27 00:00:49 1999 --- http_request.c Tue Jan 26 23:42:44 1999 *************** static request_rec *internal_internal_re *** 1298,1304 **** new->htaccess = r->htaccess; new->no_cache = r->no_cache; - new->expecting_100 = r->expecting_100; new->no_local_copy = r->no_local_copy; new->read_length = r->read_length; /* We can only read it once */ new->vlist_validator = r->vlist_validator; --- 1298,1303 ---- >Audit-Trail: >Unformatted: [In order for any reply to be added to the PR database, ] [you need to include <[EMAIL PROTECTED]> in the Cc line ] [and leave the subject line UNCHANGED. This is not done] [automatically because of the potential for mail loops. ] [If you do not include this Cc, your reply may be ig- ] [nored unless you are responding to an explicit request ] [from a developer. ] [Reply only with text; DO NOT SEND ATTACHMENTS! ]