This does appear to work. Our automated tests are running right now. Shall I submit a but with this patch attached?
On Aug 3, 2011, at 7:43 AM, Plüm, Rüdiger, VF-Group wrote: > Can you please try if the following patch fixes your issue? > > Index: mod_proxy_ajp.c > =================================================================== > --- mod_proxy_ajp.c (revision 1150558) > +++ mod_proxy_ajp.c (working copy) > @@ -506,16 +506,18 @@ > if (bb_len != -1) > conn->worker->s->read += bb_len; > } > - if (ap_pass_brigade(r->output_filters, > - output_brigade) != APR_SUCCESS) { > - ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, > - "proxy: error processing body.%s", > - r->connection->aborted ? > - " Client aborted connection." : > ""); > - output_failed = 1; > + if (headers_sent) { > + if (ap_pass_brigade(r->output_filters, > + output_brigade) != > APR_SUCCESS) { > + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, > + "proxy: error processing > body.%s", > + r->connection->aborted ? > + " Client aborted connection." > : ""); > + output_failed = 1; > + } > + data_sent = 1; > + apr_brigade_cleanup(output_brigade); > } > - data_sent = 1; > - apr_brigade_cleanup(output_brigade); > } > } > else { > > Currently the code sends an empty brigade in your case which also triggers > the sending of headers by httpd. > > Regards > > Rüdiger > >> -----Original Message----- >> From: Jim Riggs >> Sent: Dienstag, 2. August 2011 18:03 >> To: dev@httpd.apache.org >> Subject: mod_proxy_ajp: ignoring flush before headers (again) >> >> For some (old 2007) context, see: >> >> http://markmail.org/message/btwcnbl2i7ftwj4n >> >> https://community.jivesoftware.com/message/201787 >> >> >> I am proxying an app via AJP to Tomcat 6/7. In certain >> circumstances, it appears that the app (or possibly Tomcat) >> is erroneously sending a flush before the headers have been >> sent. In r579999, Jim added an exception to handle this >> situation with the intention of ignoring the flush. I'm not >> sure it's working quite right, though, as the brigade is >> still getting passed through the filter chain. So, >> ap_headers_output_filter() is getting called too soon, I >> think. (I am no expert in the httpd code, so I'm not sure >> this is really the problem.) >> >> Can any of you who ARE experts in the code tell me what you >> think of the issue and how we can fix it? I'm thinking that >> if we are ignoring a flush at mod_proxy_ajp.c:448 (in 2.2.x), >> we should not be calling ap_pass_brigade() at line 472, but I >> don't know if there are any ramifications of that. >> >> The symptom is that when this issue happens, the user gets >> prompted to save a file (Content-Type returned by httpd is >> 'text/plain' even though Tomcat is returning >> 'text/html;charset=utf-8'). Below is some debug output >> showing correct and incorrect behavior: >> >> Correct: >> >> [Tue Aug 02 09:34:50 2011] [debug] mod_proxy_ajp.c(266): >> proxy: APR_BUCKET_IS_EOS >> [Tue Aug 02 09:34:50 2011] [debug] mod_proxy_ajp.c(271): >> proxy: data to read (max 8186 at 4) >> [Tue Aug 02 09:34:50 2011] [debug] mod_proxy_ajp.c(286): >> proxy: got 0 bytes of data >> [Tue Aug 02 09:34:50 2011] [debug] ajp_header.c(687): >> ajp_read_header: ajp_ilink_received 04 >> [Tue Aug 02 09:34:50 2011] [debug] ajp_header.c(697): >> ajp_parse_type: got 04 >> [Tue Aug 02 09:34:50 2011] [debug] ajp_header.c(516): >> ajp_unmarshal_response: status = 200 >> [Tue Aug 02 09:34:50 2011] [debug] ajp_header.c(537): >> ajp_unmarshal_response: Number of headers is = 5 >> [Tue Aug 02 09:34:50 2011] [debug] ajp_header.c(599): >> ajp_unmarshal_response: Header[0] [Pragma] = [No-cache] >> [Tue Aug 02 09:34:50 2011] [debug] ajp_header.c(599): >> ajp_unmarshal_response: Header[1] [Cache-Control] = [no-cache] >> [Tue Aug 02 09:34:50 2011] [debug] ajp_header.c(599): >> ajp_unmarshal_response: Header[2] [Expires] = [Wed, 31 Dec >> 1969 18:00:00 CST] >> [Tue Aug 02 09:34:50 2011] [debug] ajp_header.c(599): >> ajp_unmarshal_response: Header[4] [Content-Type] = >> [text/html;charset=utf-8] >> [Tue Aug 02 09:34:50 2011] [debug] ajp_header.c(609): >> ajp_unmarshal_response: ap_set_content_type done >> [Tue Aug 02 09:34:50 2011] [debug] ajp_header.c(687): >> ajp_read_header: ajp_ilink_received 03 >> [Tue Aug 02 09:34:50 2011] [debug] ajp_header.c(697): >> ajp_parse_type: got 03 >> [Tue Aug 02 09:34:50 2011] [debug] mod_headers.c(756): >> headers: ap_headers_output_filter() >> >> >> Incorrect (notice how ap_headers_output_filter() is called >> before the headers are received): >> >> [Tue Aug 02 09:32:18 2011] [debug] mod_proxy_ajp.c(266): >> proxy: APR_BUCKET_IS_EOS >> [Tue Aug 02 09:32:18 2011] [debug] mod_proxy_ajp.c(271): >> proxy: data to read (max 8186 at 4) >> [Tue Aug 02 09:32:18 2011] [debug] mod_proxy_ajp.c(286): >> proxy: got 0 bytes of data >> [Tue Aug 02 09:32:18 2011] [debug] ajp_header.c(687): >> ajp_read_header: ajp_ilink_received 03 >> [Tue Aug 02 09:32:18 2011] [debug] ajp_header.c(697): >> ajp_parse_type: got 03 >> [Tue Aug 02 09:32:18 2011] [debug] mod_proxy_ajp.c(452): >> Ignoring flush message received before headers >> [Tue Aug 02 09:32:18 2011] [debug] mod_headers.c(756): >> headers: ap_headers_output_filter() >> [Tue Aug 02 09:32:18 2011] [debug] ajp_header.c(687): >> ajp_read_header: ajp_ilink_received 03 >> [Tue Aug 02 09:32:18 2011] [debug] ajp_header.c(697): >> ajp_parse_type: got 03 >> [Tue Aug 02 09:32:18 2011] [debug] mod_proxy_ajp.c(452): >> Ignoring flush message received before headers >> [Tue Aug 02 09:32:18 2011] [debug] ajp_header.c(687): >> ajp_read_header: ajp_ilink_received 04 >> [Tue Aug 02 09:32:18 2011] [debug] ajp_header.c(697): >> ajp_parse_type: got 04 >> [Tue Aug 02 09:32:18 2011] [debug] ajp_header.c(516): >> ajp_unmarshal_response: status = 200 >> [Tue Aug 02 09:32:18 2011] [debug] ajp_header.c(537): >> ajp_unmarshal_response: Number of headers is = 5 >> [Tue Aug 02 09:32:18 2011] [debug] ajp_header.c(599): >> ajp_unmarshal_response: Header[0] [Pragma] = [No-cache] >> [Tue Aug 02 09:32:18 2011] [debug] ajp_header.c(599): >> ajp_unmarshal_response: Header[1] [Cache-Control] = [no-cache] >> [Tue Aug 02 09:32:18 2011] [debug] ajp_header.c(599): >> ajp_unmarshal_response: Header[2] [Expires] = [Wed, 31 Dec >> 1969 18:00:00 CST] >> [Tue Aug 02 09:32:18 2011] [debug] ajp_header.c(599): >> ajp_unmarshal_response: Header[3] [Set-Cookie] = >> [JSESSIONID=39968855F543CA08A440E6136EA6FC28.app1; >> Path=/tomcat-manager; Secure; HttpOnly] >> [Tue Aug 02 09:32:18 2011] [debug] ajp_header.c(599): >> ajp_unmarshal_response: Header[4] [Content-Type] = >> [text/html;charset=utf-8] >> [Tue Aug 02 09:32:18 2011] [debug] ajp_header.c(609): >> ajp_unmarshal_response: ap_set_content_type done >> >>