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]
