On 01/03/2006 06:15 PM, Jim Jagielski wrote:
>
> On Jan 2, 2006, at 4:18 PM, Ruediger Pluem wrote:
>
>>
>> 1. Proposal
>> If a subrequest has a broken backend also set r->no_cache for the
>> main request
>> and ensure that the chunk filter does not sent the last chunk marker
>> in this case.
>>
>> 2. Proposal
>> If a subrequest has a broken backend do not sent the error bucket.
>> Only set r->no_cache
>> to ensure that this subrequest response does not get cached.
>>
>
I am currently working on proposal #1. In order to ensure that the chunk
filter does not sent a last chunk marker in this case I try to memorize
a seen error bucket in the filter context.
But I remember myself that there had been casting issues in the past that
created compiler warnings especially with gcc 4. The patch below compiles
fine with my gcc 3.2.2 with -Wall. So if someone could give a comment
if
f->ctx = (void *)(1)
is fine it would be great.
Regards
RĂ¼diger
Index: chunk_filter.c
===================================================================
--- chunk_filter.c (Revision 366160)
+++ chunk_filter.c (Arbeitskopie)
@@ -47,7 +47,6 @@
apr_bucket_brigade *more;
apr_bucket *e;
apr_status_t rv;
- int bad_gateway_seen = 0;
for (more = NULL; b; b = more, more = NULL) {
apr_off_t bytes = 0;
@@ -71,8 +70,11 @@
if (AP_BUCKET_IS_ERROR(e)
&& (((ap_bucket_error *)(e->data))->status
== HTTP_BAD_GATEWAY)) {
- /* We had a broken backend. Memorize this. */
- bad_gateway_seen = 1;
+ /*
+ * We had a broken backend. Memorize this in the filter
+ * context.
+ */
+ f->ctx = (void *)(1);
continue;
}
if (APR_BUCKET_IS_FLUSH(e)) {
@@ -155,7 +157,8 @@
* 3) the end-of-chunked body CRLF
*
* If there is no EOS bucket, or if we had seen an error bucket with
- * status HTTP_BAD_GATEWAY then do nothing.
+ * status HTTP_BAD_GATEWAY then do nothing. We have memorized an
+ * error bucket that we had seen in the filter context.
* The error bucket with status HTTP_BAD_GATEWAY indicates that the
* connection to the backend (mod_proxy) broke in the middle of the
* response. In order to signal the client that something went wrong
@@ -166,7 +169,7 @@
* marker above, but this is a bit more straight-forward for
* now.
*/
- if (eos && !bad_gateway_seen) {
+ if (eos && !f->ctx) {
/* XXX: (2) trailers ... does not yet exist */
e = apr_bucket_immortal_create(ASCII_ZERO ASCII_CRLF
/* <trailers> */