From: Greg Stein Date: Thu, 19 Jun 2003 21:24:10 +0000 (+0000) Subject: Have mod_dav deal with errors that happen during a streamy provider X-Git-Tag: pre_ajp_proxy~1528 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9301426b1280556a2b561d069daa64214ec56151;p=apache Have mod_dav deal with errors that happen during a streamy provider response. * 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. Submitted by: Ben Collins-Sussman git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@100309 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/dav/main/mod_dav.c b/modules/dav/main/mod_dav.c index 1536c5f01d..57f222f258 100644 --- a/modules/dav/main/mod_dav.c +++ b/modules/dav/main/mod_dav.c @@ -2060,8 +2060,18 @@ static int dav_method_propfind(request_rec *r) } 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. */ @@ -4034,9 +4044,22 @@ static int dav_method_report(request_rec *r) /* 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 (! r->sent_bodyct) + /* No data has been sent to client yet; throw normal error. */ + 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;