diff options
author | Ruediger Pluem <rpluem@apache.org> | 2021-09-24 08:42:04 +0200 |
---|---|---|
committer | Ruediger Pluem <rpluem@apache.org> | 2021-09-24 08:42:04 +0200 |
commit | 7f08c2bfa117ea406e1ea03d683e5e7df34da7f9 (patch) | |
tree | c6d840fb17d078322b4bb96ab5a5e44db4e4e3ba /modules/dav | |
parent | Tentative update to reduce noise in travis log (i.e. tons of AH02637). (diff) | |
download | apache2-7f08c2bfa117ea406e1ea03d683e5e7df34da7f9.tar.xz apache2-7f08c2bfa117ea406e1ea03d683e5e7df34da7f9.zip |
* Correctly handle errors returned by dav providers on REPORT requests.
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1893589 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'modules/dav')
-rw-r--r-- | modules/dav/main/mod_dav.c | 44 |
1 files changed, 23 insertions, 21 deletions
diff --git a/modules/dav/main/mod_dav.c b/modules/dav/main/mod_dav.c index 9b73867a72..1a4b0663f0 100644 --- a/modules/dav/main/mod_dav.c +++ b/modules/dav/main/mod_dav.c @@ -4403,10 +4403,32 @@ static int dav_method_report(request_rec *r) /* set up defaults for the report response */ r->status = HTTP_OK; ap_set_content_type(r, DAV_XML_CONTENT_TYPE); + err = NULL; /* run report hook */ result = dav_run_deliver_report(r, resource, doc, r->output_filters, &err); + if (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; + } switch (result) { case OK: return DONE; @@ -4414,27 +4436,7 @@ static int dav_method_report(request_rec *r) /* No one handled the report */ return HTTP_NOT_IMPLEMENTED; default: - if ((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; } return DONE; |