Have mod_dav deal with errors that happen during a streamy provider response. (This is a followup to the change that makes dav_method_propfind streamy.)
Hopefully, this addresses jerenkrantz's concerns; gstein and I can't come up with a better solution, given the limits of HTTP design. * mod_dav.c (dav_method_propfind, dav_method_report): if the dav provider throws an error in the middle of streaming a response, have mod_dav log an error and abort the connection. Index: modules/dav/main/mod_dav.c =================================================================== RCS file: /home/cvspublic/httpd-2.0/modules/dav/main/mod_dav.c,v retrieving revision 1.94 diff -u -r1.94 mod_dav.c --- modules/dav/main/mod_dav.c 3 Jun 2003 22:09:24 -0000 1.94 +++ modules/dav/main/mod_dav.c 17 Jun 2003 18:23:44 -0000 @@ -2059,8 +2059,18 @@ } if (err != NULL) { - /* ### add a higher-level description? */ - return dav_handle_err(r, err, NULL); + /* If an error occurred during the resource walk, there's + basically nothing we can do but abort the connection and + log an error. This is one of the limitations of HTTP; it + needs to "know" the entire status of the response before + generating it, which is just impossible in these streamy + response situations. */ + err = dav_push_error(r->pool, err->status, 0, + "Provider encountered an error while streaming" + " a multistatus PROPFIND response.", err); + dav_log_err(r, err, APLOG_ERR); + r->connection->aborted = 1; + return DONE; } /* Finish up the multistatus response. */ @@ -4033,9 +4043,19 @@ /* run report hook */ if ((err = (*vsn_hooks->deliver_report)(r, resource, doc, r->output_filters)) != NULL) { - /* NOTE: we're assuming that the provider has not generated any - content yet! */ - return dav_handle_err(r, err, NULL); + + /* If an error occurred during the report delivery, there's + basically nothing we can do but abort the connection and + log an error. This is one of the limitations of HTTP; it + needs to "know" the entire status of the response before + generating it, which is just impossible in these streamy + response situations. */ + err = dav_push_error(r->pool, err->status, 0, + "Provider encountered an error while streaming" + " a REPORT response.", err); + dav_log_err(r, err, APLOG_ERR); + r->connection->aborted = 1; + return DONE; } return DONE;