On 12/11/2005 05:59 PM, Justin Erenkrantz wrote:
> On Sun, Dec 11, 2005 at 03:28:00AM +0100, Ruediger Pluem wrote:
> 
>>>The connection is still kept open rather than being closed.  I can step
>>>through a trace with you if you like.  -- justin
>>
>>Hm. But why? Once we have returned from ap_process_request 
>>ap_process_http_connection
>>is left and the connection should be closed by the mpm.
> 
> 
> No clue.  That's why we need a debugger.  =)  Are you up for some virtual
> hackathon-ing in IRC?  -- justin


Attached an updated version of Roy's patch that now closes the connection (at 
least in my tests :-)).
The problem with Roys patch has been that the EOS bucket was never seen inside 
the loop where
he checked for the EOS bucket, because the loop only seems to run over the data 
/ metadata buckets
just before the EOS bucket.

Regards

RĂ¼diger

Index: server/core_filters.c
===================================================================
--- server/core_filters.c       (Revision 355854)
+++ server/core_filters.c       (Arbeitskopie)
@@ -315,7 +315,7 @@
                                              apr_size_t *bytes_written,
                                              conn_rec *c);
 
-static void remove_empty_buckets(apr_bucket_brigade *bb);
+static void remove_empty_buckets(apr_bucket_brigade *bb, conn_rec *c);
 
 static apr_status_t send_brigade_blocking(apr_socket_t *s,
                                           apr_bucket_brigade *bb,
@@ -487,7 +487,7 @@
     if (bb == NULL) {
         return;
     }
-    remove_empty_buckets(bb);
+    remove_empty_buckets(bb, c);
     if (!APR_BRIGADE_EMPTY(bb)) {
         c->data_in_output_filters = 1;
         if (make_a_copy) {
@@ -526,7 +526,7 @@
     struct iovec vec[MAX_IOVEC_TO_WRITE];
     apr_size_t nvec = 0;
 
-    remove_empty_buckets(bb);
+    remove_empty_buckets(bb, c);
 
     for (bucket = APR_BRIGADE_FIRST(bb);
          bucket != APR_BRIGADE_SENTINEL(bb);
@@ -596,16 +596,21 @@
         }
     }
 
-    remove_empty_buckets(bb);
+    remove_empty_buckets(bb, c);
 
     return APR_SUCCESS;
 }
 
-static void remove_empty_buckets(apr_bucket_brigade *bb)
+static void remove_empty_buckets(apr_bucket_brigade *bb, conn_rec *c)
 {
     apr_bucket *bucket;
     while (((bucket = APR_BRIGADE_FIRST(bb)) != APR_BRIGADE_SENTINEL(bb)) &&
            (APR_BUCKET_IS_METADATA(bucket) || (bucket->length == 0))) {
+        if (APR_BUCKET_IS_EOS(bucket) && bucket->data) {
+            /* stream aborted and we have not ended it yet */
+            c->keepalive = AP_CONN_CLOSE;
+            bucket->data = NULL;
+        }
         APR_BUCKET_REMOVE(bucket);
         apr_bucket_destroy(bucket);
     }
Index: modules/proxy/mod_proxy_http.c
===================================================================
--- modules/proxy/mod_proxy_http.c      (Revision 355854)
+++ modules/proxy/mod_proxy_http.c      (Arbeitskopie)
@@ -1481,12 +1481,16 @@
                     }
                     else if (rv != APR_SUCCESS) {
                         /* In this case, we are in real trouble because
-                         * our backend bailed on us, so abort our
-                         * connection to our user too.
+                         * our backend bailed on us.
                          */
                         ap_log_cerror(APLOG_MARK, APLOG_ERR, rv, c,
                                       "proxy: error reading response");
-                        c->aborted = 1;
+                        r->no_cache = 1;
+                        e = apr_bucket_eos_create(c->bucket_alloc);
+                        e->data = &rv;
+                        APR_BRIGADE_INSERT_TAIL(bb, e);
+                        ap_pass_brigade(r->output_filters, bb);
+                        backend->close = 1;
                         break;
                     }
                     /* next time try a non-blocking read */
Index: modules/cache/mod_disk_cache.c
===================================================================
--- modules/cache/mod_disk_cache.c      (Revision 355854)
+++ modules/cache/mod_disk_cache.c      (Arbeitskopie)
@@ -1010,7 +1010,7 @@
      * sanity checks.
      */
     if (APR_BUCKET_IS_EOS(APR_BRIGADE_LAST(bb))) {
-        if (r->connection->aborted) {
+        if (r->connection->aborted || r->no_cache) {
             ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server,
                          "disk_cache: Discarding body for URL %s "
                          "because connection has been aborted.",

Reply via email to