https://bz.apache.org/bugzilla/show_bug.cgi?id=65725

--- Comment #14 from Ruediger Pluem <[email protected]> ---
(In reply to farhanz from comment #4)
> The way our configuration works is that the request is authenticated first.
> This is handled by an FCGI Authorizer module. The way httpd talks to this
> authorizer module is via mod_authnz_fcgi. We don't have mod_proxy[_http]
> configured for this request.
> 
> Outlining the request flow:
> 
> 1. The curl HTTP client performs a POST. Since the payload is over a KB,
> curl, by default, attaches the Expect: 100-Continue request header.
> 
> 2. Apache httpd receives the request. Based on our config, the request is
> first routed to the authorizer module for authentication. Since
> authentication is successful, the module sets the response status code as
> HTTP 200.
> 
> 3. mod_authnz_fcgi then updates the request_rec->status and
> request_rec->status_line fields to 200.
> 
> 4. In modules/http/http_filters.c, prior to calling
> ap_send_interim_response, the code saves the 200 status code set by
> mod_authnz_fcgi and overwrites it with HTTP_CONTINUE. 
> 
> 5. However, the filters.c code does not update request->status_line (which
> is still 200).
> 
> 6. Now in ap_send_interim_response, the interim status code to be sent is
> determined via reading r->status_line. Since this is set to 200, the interim
> response sent back to the client is 200.
> 
> I believe status_line should be overwritten with 100 Continue just like the
> status is being overwritten with 100. This was handled in the previous code,
> via the following line which was removed in 2.4.47:
> 
> tmp = apr_pstrcat(f->r->pool, AP_SERVER_PROTOCOL " ",
>                   ap_get_status_line(HTTP_CONTINUE), CRLF CRLF,
>                   NULL);

Thanks for the detailed analysis. Does the following patch fix your problem?

Index: modules/http/http_filters.c
===================================================================
--- modules/http/http_filters.c (revision 1895463)
+++ modules/http/http_filters.c (working copy)
@@ -430,9 +430,12 @@
         }
         else if (!ctx->seen_data) {
             int saved_status = f->r->status;
+            char *saved_status_line = f->r->status_line;
             f->r->status = HTTP_CONTINUE;
+            f->r->status_line = NULL;
             ap_send_interim_response(f->r, 0);
             AP_DEBUG_ASSERT(!f->r->expecting_100);
+            f->r->status_line = saved_status_line;
             f->r->status = saved_status;
         }
         else {

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to