* by either a DAV:version or DAV:label-name element (passed as
* the target argument), or any Target-Selector header in the request.
*/
-static int dav_get_resource(request_rec *r, int target_allowed,
- ap_xml_elem *target, dav_resource **res_p)
+static dav_error * dav_get_resource(request_rec *r, int target_allowed,
+ ap_xml_elem *target, dav_resource **res_p)
{
void *data;
dav_dir_conf *conf;
const char *target_selector = NULL;
int is_label = 0;
int result;
+ dav_error *err;
- /* go look for the resource if it isn't already present */
+ /* only look for the resource if it isn't already present */
(void) apr_get_userdata(&data, DAV_KEY_RESOURCE, r->pool);
if (data != NULL) {
*res_p = data;
- return OK;
+ return NULL;
}
/* if the request target can be overridden, get any target selector */
if (target_allowed) {
+ /* ### this should return a dav_error* */
if ((result = dav_get_target_selector(r, target,
&target_selector,
&is_label)) != OK)
- return result;
+ return dav_new_error(r->pool, result, 0,
+ "Could not process the method target.");
}
conf = ap_get_module_config(r->per_dir_config, &dav_module);
/* assert: conf->provider != NULL */
/* resolve the resource */
- *res_p = (*conf->provider->repos->get_resource)(r, conf->dir,
- target_selector, is_label);
+ err = (*conf->provider->repos->get_resource)(r, conf->dir,
+ target_selector, is_label,
+ res_p);
+ if (err != NULL) {
+ err = dav_push_error(r->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
+ "Could not fetch resource information.", err);
+ return err;
+ }
+
+ /* Note: this shouldn't happen, but just be sure... */
if (*res_p == NULL) {
- /* Apache will supply a default error for this. */
- return HTTP_NOT_FOUND;
+ /* ### maybe use HTTP_INTERNAL_SERVER_ERROR */
+ return dav_new_error(r->pool, HTTP_NOT_FOUND, 0,
+ apr_psprintf(r->pool,
+ "The provider did not define a "
+ "resource for %s.",
+ ap_escape_html(r->pool, r->uri)));
}
(void) apr_set_userdata(*res_p, DAV_KEY_RESOURCE, apr_null_cleanup,
* add it now */
dav_add_vary_header(r, r, *res_p);
- return OK;
+ return NULL;
}
static dav_error * dav_open_lockdb(request_rec *r, int ro, dav_lockdb **lockdb)
{
dav_resource *resource;
int result;
+ dav_error *err;
/* This method should only be called when the resource is not
* visible to Apache. We will fetch the resource from the repository,
* then create a subrequest for Apache to handle.
*/
- result = dav_get_resource(r, 1 /*target_allowed*/, NULL, &resource);
- if (result != OK)
- return result;
+ err = dav_get_resource(r, 1 /*target_allowed*/, NULL, &resource);
+ if (err != NULL)
+ return dav_handle_err(r, err, NULL);
if (!resource->exists) {
/* Apache will supply a default error for this. */
return HTTP_NOT_FOUND;
{
dav_resource *resource;
dav_error *err;
- int result;
/* Ask repository module to resolve the resource */
- result = dav_get_resource(r, 0 /*target_allowed*/, NULL, &resource);
- if (result != OK) {
- return result;
- }
+ err = dav_get_resource(r, 0 /*target_allowed*/, NULL, &resource);
+ if (err != NULL)
+ return dav_handle_err(r, err, NULL);
/* Note: depth == 0. Implies no need for a multistatus response. */
if ((err = dav_validate_request(r, resource, 0, NULL, NULL,
}
/* Ask repository module to resolve the resource */
- result = dav_get_resource(r, 0 /*target_allowed*/, NULL, &resource);
- if (result != OK) {
- return result;
- }
+ err = dav_get_resource(r, 0 /*target_allowed*/, NULL, &resource);
+ if (err != NULL)
+ return dav_handle_err(r, err, NULL);
/* If not a file or collection resource, PUT not allowed */
if (resource->type != DAV_RESOURCE_TYPE_REGULAR) {
}
/* Ask repository module to resolve the resource */
- result = dav_get_resource(r, 0 /*target_allowed*/, NULL, &resource);
- if (result != OK)
- return result;
+ err = dav_get_resource(r, 0 /*target_allowed*/, NULL, &resource);
+ if (err != NULL)
+ return dav_handle_err(r, err, NULL);
if (!resource->exists) {
/* Apache will supply a default error for this. */
return HTTP_NOT_FOUND;
apr_array_header_t *uri_ary;
ap_xml_doc *doc;
const ap_xml_elem *elem;
+ dav_error *err;
/* resolve the resource */
- result = dav_get_resource(r, 0 /*target_allowed*/, NULL, &resource);
- if (result != OK)
- return result;
+ err = dav_get_resource(r, 0 /*target_allowed*/, NULL, &resource);
+ if (err != NULL)
+ return dav_handle_err(r, err, NULL);
/* parse any request body */
if ((result = ap_xml_parse_input(r, &doc)) != OK) {
dav_response *multi_status;
/* Ask repository module to resolve the resource */
- result = dav_get_resource(r, 1 /*target_allowed*/, NULL, &resource);
- if (result != OK)
- return result;
+ err = dav_get_resource(r, 1 /*target_allowed*/, NULL, &resource);
+ if (err != NULL)
+ return dav_handle_err(r, err, NULL);
if (dav_get_resource_state(r, resource) == DAV_RESOURCE_NULL) {
/* Apache will supply a default error for this. */
dav_prop_ctx *ctx;
/* Ask repository module to resolve the resource */
- result = dav_get_resource(r, 0 /*target_allowed*/, NULL, &resource);
- if (result != OK)
- return result;
+ err = dav_get_resource(r, 0 /*target_allowed*/, NULL, &resource);
+ if (err != NULL)
+ return dav_handle_err(r, err, NULL);
if (!resource->exists) {
/* Apache will supply a default error for this. */
return HTTP_NOT_FOUND;
&dav_module);
/* Ask repository module to resolve the resource */
- result = dav_get_resource(r, 0 /*target_allowed*/, NULL, &resource);
- if (result != OK)
- return result;
+ err = dav_get_resource(r, 0 /*target_allowed*/, NULL, &resource);
+ if (err != NULL)
+ return dav_handle_err(r, err, NULL);
if (resource->exists) {
/* oops. something was already there! */
int resource_state;
/* Ask repository module to resolve the resource */
- result = dav_get_resource(r, !is_move /*target_allowed*/, NULL, &resource);
- if (result != OK)
- return result;
+ err = dav_get_resource(r, !is_move /*target_allowed*/, NULL, &resource);
+ if (err != NULL)
+ return dav_handle_err(r, err, NULL);
if (!resource->exists) {
/* Apache will supply a default error for this. */
return HTTP_NOT_FOUND;
}
/* Resolve destination resource */
- result = dav_get_resource(lookup.rnew, 0 /*target_allowed*/, NULL, &resnew);
- if (result != OK)
- return result;
+ err = dav_get_resource(lookup.rnew, 0 /*target_allowed*/, NULL, &resnew);
+ if (err != NULL)
+ return dav_handle_err(r, err, NULL);
/* are the two resources handled by the same repository? */
if (resource->hooks != resnew->hooks) {
* so allow it, and let provider reject the lock attempt
* on a version if it wants to.
*/
- result = dav_get_resource(r, 1 /*target_allowed*/, NULL, &resource);
- if (result != OK)
- return result;
+ err = dav_get_resource(r, 1 /*target_allowed*/, NULL, &resource);
+ if (err != NULL)
+ return dav_handle_err(r, err, NULL);
/*
** Open writable. Unless an error occurs, we'll be
* so allow it, and let provider reject the unlock attempt
* on a version if it wants to.
*/
- result = dav_get_resource(r, 1 /*target_allowed*/, NULL, &resource);
- if (result != OK)
- return result;
+ err = dav_get_resource(r, 1 /*target_allowed*/, NULL, &resource);
+ if (err != NULL)
+ return dav_handle_err(r, err, NULL);
resource_state = dav_get_resource_state(r, resource);
return DECLINED;
/* ask repository module to resolve the resource */
- result = dav_get_resource(r, 0 /*target_allowed*/, NULL, &resource);
- if (result != OK)
- return result;
+ err = dav_get_resource(r, 0 /*target_allowed*/, NULL, &resource);
+ if (err != NULL)
+ return dav_handle_err(r, err, NULL);
/* remember the pre-creation resource state */
resource_state = dav_get_resource_state(r, resource);
}
/* Ask repository module to resolve the resource */
- result = dav_get_resource(r, 1 /*target_allowed*/, target, &resource);
- if (result != OK)
- return result;
+ err = dav_get_resource(r, 1 /*target_allowed*/, target, &resource);
+ if (err != NULL)
+ return dav_handle_err(r, err, NULL);
if (!resource->exists) {
/* Apache will supply a default error for this. */
return HTTP_NOT_FOUND;
}
/* Ask repository module to resolve the resource */
- result = dav_get_resource(r, 0 /*target_allowed*/, NULL, &resource);
- if (result != OK)
- return result;
+ err = dav_get_resource(r, 0 /*target_allowed*/, NULL, &resource);
+ if (err != NULL)
+ return dav_handle_err(r, err, NULL);
if (!resource->exists) {
/* Apache will supply a default error for this. */
return HTTP_NOT_FOUND;
}
/* Ask repository module to resolve the resource */
- result = dav_get_resource(r, 0 /* target_allowed */, NULL, &resource);
- if (result != OK)
- return result;
+ err = dav_get_resource(r, 0 /* target_allowed */, NULL, &resource);
+ if (err != NULL)
+ return dav_handle_err(r, err, NULL);
if (!resource->exists) {
/* Apache will supply a default error for this. */
return HTTP_NOT_FOUND;
return DECLINED;
/* Ask repository module to resolve the resource */
- result = dav_get_resource(r, 0 /*target_allowed*/, NULL, &resource);
- if (result != OK)
- return result;
+ err = dav_get_resource(r, 0 /*target_allowed*/, NULL, &resource);
+ if (err != NULL)
+ return dav_handle_err(r, err, NULL);
if (!resource->exists) {
/* Apache will supply a default error for this. */
return HTTP_NOT_FOUND;
return DECLINED;
/* Ask repository module to resolve the resource */
- result = dav_get_resource(r, 1 /*target_allowed*/, NULL, &resource);
- if (result != OK)
- return result;
+ err = dav_get_resource(r, 1 /*target_allowed*/, NULL, &resource);
+ if (err != NULL)
+ return dav_handle_err(r, err, NULL);
if (!resource->exists) {
/* Apache will supply a default error for this. */
return HTTP_NOT_FOUND;
* for this report.
*/
target_allowed = (*vsn_hooks->report_target_selector_allowed)(doc);
- result = dav_get_resource(r, target_allowed, NULL, &resource);
- if (result != OK)
- return result;
+ err = dav_get_resource(r, target_allowed, NULL, &resource);
+ if (err != NULL)
+ return dav_handle_err(r, err, NULL);
if (!resource->exists) {
/* Apache will supply a default error for this. */
return HTTP_NOT_FOUND;
return DECLINED;
/* ask repository module to resolve the resource */
- result = dav_get_resource(r, 0 /*target_allowed*/, NULL, &resource);
- if (result != OK)
- return result;
+ err = dav_get_resource(r, 0 /*target_allowed*/, NULL, &resource);
+ if (err != NULL)
+ return dav_handle_err(r, err, NULL);
/* parse the request body (must be a mkworkspace element) */
if ((result = ap_xml_parse_input(r, &doc)) != OK) {
dav_response *multi_response = NULL;
dav_lookup_result lookup;
int overwrite;
- int result;
/* If no bindings provider, decline the request */
if (binding_hooks == NULL)
return DECLINED;
/* Ask repository module to resolve the resource */
- result = dav_get_resource(r, 0 /*!target_allowed*/, NULL, &resource);
- if (result != OK)
- return result;
+ err = dav_get_resource(r, 0 /*!target_allowed*/, NULL, &resource);
+ if (err != NULL)
+ return dav_handle_err(r, err, NULL);
if (!resource->exists) {
/* Apache will supply a default error for this. */
return HTTP_NOT_FOUND;
}
/* resolve binding resource */
- result = dav_get_resource(lookup.rnew, 0 /*!target_allowed*/, NULL, &binding);
- if (result != OK)
- return result;
+ err = dav_get_resource(lookup.rnew, 0 /*!target_allowed*/, NULL, &binding);
+ if (err != NULL)
+ return dav_handle_err(r, err, NULL);
/* are the two resources handled by the same repository? */
if (resource->hooks != binding->hooks) {