From 9301426b1280556a2b561d069daa64214ec56151 Mon Sep 17 00:00:00 2001 From: Greg Stein Date: Thu, 19 Jun 2003 21:24:10 +0000 Subject: [PATCH] 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 --- modules/dav/main/mod_dav.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) 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; -- 2.40.0