You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by st...@apache.org on 2002/03/07 20:53:31 UTC
cvs commit: httpd-2.0/modules/dav/main mod_dav.c
striker 02/03/07 11:53:31
Modified: modules/dav/main mod_dav.c
Log:
Big style patch.
Mostly detab, but also changed some comments from:
/*
**
*/
to:
/*
*
*/
The latter is the dominant style in apache. The only
other places they can be found (AFAIK) are mod_ssl and
mod_rewrite.
Revision Changes Path
1.71 +1328 -1291httpd-2.0/modules/dav/main/mod_dav.c
Index: mod_dav.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/dav/main/mod_dav.c,v
retrieving revision 1.70
retrieving revision 1.71
diff -u -r1.70 -r1.71
--- mod_dav.c 1 Mar 2002 03:25:49 -0000 1.70
+++ mod_dav.c 7 Mar 2002 19:53:31 -0000 1.71
@@ -53,32 +53,32 @@
*/
/*
-** DAV extension module for Apache 2.0.*
-**
-** This module is repository-independent. It depends on hooks provided by a
-** repository implementation.
-**
-** APACHE ISSUES:
-** - within a DAV hierarchy, if an unknown method is used and we default
-** to Apache's implementation, it sends back an OPTIONS with the wrong
-** set of methods -- there is NO HOOK for us.
-** therefore: we need to manually handle the HTTP_METHOD_NOT_ALLOWED
-** and HTTP_NOT_IMPLEMENTED responses (not ap_send_error_response).
-** - process_mkcol_body() had to dup code from ap_setup_client_block().
-** - it would be nice to get status lines from Apache for arbitrary
-** status codes
-** - it would be nice to be able to extend Apache's set of response
-** codes so that it doesn't return 500 when an unknown code is placed
-** into r->status.
-** - http_vhost functions should apply "const" to their params
-**
-** DESIGN NOTES:
-** - For PROPFIND, we batch up the entire response in memory before
-** sending it. We may want to reorganize around sending the information
-** as we suck it in from the propdb. Alternatively, we should at least
-** generate a total Content-Length if we're going to buffer in memory
-** so that we can keep the connection open.
-*/
+ * DAV extension module for Apache 2.0.*
+ *
+ * This module is repository-independent. It depends on hooks provided by a
+ * repository implementation.
+ *
+ * APACHE ISSUES:
+ * - within a DAV hierarchy, if an unknown method is used and we default
+ * to Apache's implementation, it sends back an OPTIONS with the wrong
+ * set of methods -- there is NO HOOK for us.
+ * therefore: we need to manually handle the HTTP_METHOD_NOT_ALLOWED
+ * and HTTP_NOT_IMPLEMENTED responses (not ap_send_error_response).
+ * - process_mkcol_body() had to dup code from ap_setup_client_block().
+ * - it would be nice to get status lines from Apache for arbitrary
+ * status codes
+ * - it would be nice to be able to extend Apache's set of response
+ * codes so that it doesn't return 500 when an unknown code is placed
+ * into r->status.
+ * - http_vhost functions should apply "const" to their params
+ *
+ * DESIGN NOTES:
+ * - For PROPFIND, we batch up the entire response in memory before
+ * sending it. We may want to reorganize around sending the information
+ * as we suck it in from the propdb. Alternatively, we should at least
+ * generate a total Content-Length if we're going to buffer in memory
+ * so that we can keep the connection open.
+ */
#include "apr_strings.h"
#include "apr_lib.h" /* for apr_is* */
@@ -124,7 +124,7 @@
} dav_server_conf;
#define DAV_INHERIT_VALUE(parent, child, field) \
- ((child)->field ? (child)->field : (parent)->field)
+ ((child)->field ? (child)->field : (parent)->field)
/* forward-declare for use in configuration lookup */
@@ -169,7 +169,7 @@
dav_methods[DAV_M_BIND] = ap_method_register(p, "BIND");
ap_add_version_component(p, "DAV/2");
-
+
return OK;
}
@@ -177,7 +177,7 @@
{
dav_server_conf *newconf;
- newconf = (dav_server_conf *) apr_pcalloc(p, sizeof(*newconf));
+ newconf = (dav_server_conf *)apr_pcalloc(p, sizeof(*newconf));
/* ### this isn't used at the moment... */
@@ -191,7 +191,7 @@
#endif
dav_server_conf *newconf;
- newconf = (dav_server_conf *) apr_pcalloc(p, sizeof(*newconf));
+ newconf = (dav_server_conf *)apr_pcalloc(p, sizeof(*newconf));
/* ### nothing to merge right now... */
@@ -204,7 +204,7 @@
dav_dir_conf *conf;
- conf = (dav_dir_conf *) apr_pcalloc(p, sizeof(*conf));
+ conf = (dav_dir_conf *)apr_pcalloc(p, sizeof(*conf));
/* clean up the directory to remove any trailing slash */
if (dir != NULL) {
@@ -225,7 +225,7 @@
{
dav_dir_conf *parent = base;
dav_dir_conf *child = overrides;
- dav_dir_conf *newconf = (dav_dir_conf *) apr_pcalloc(p, sizeof(*newconf));
+ dav_dir_conf *newconf = (dav_dir_conf *)apr_pcalloc(p, sizeof(*newconf));
/* DBG3("dav_merge_dir_config: new=%08lx base=%08lx overrides=%08lx",
(long)newconf, (long)base, (long)overrides); */
@@ -254,7 +254,7 @@
return newconf;
}
-static const dav_provider * dav_get_provider(request_rec *r)
+static const dav_provider *dav_get_provider(request_rec *r)
{
dav_dir_conf *conf;
@@ -292,13 +292,13 @@
*/
static const char *dav_cmd_dav(cmd_parms *cmd, void *config, const char *arg1)
{
- dav_dir_conf *conf = (dav_dir_conf *) config;
+ dav_dir_conf *conf = (dav_dir_conf *)config;
if (strcasecmp(arg1, "on") == 0) {
- conf->provider_name = DAV_DEFAULT_PROVIDER;
+ conf->provider_name = DAV_DEFAULT_PROVIDER;
}
else if (strcasecmp(arg1, "off") == 0) {
- conf->provider_name = NULL;
+ conf->provider_name = NULL;
conf->provider = NULL;
}
else {
@@ -327,12 +327,12 @@
static const char *dav_cmd_davdepthinfinity(cmd_parms *cmd, void *config,
int arg)
{
- dav_dir_conf *conf = (dav_dir_conf *) config;
+ dav_dir_conf *conf = (dav_dir_conf *)config;
if (arg)
- conf->allow_depthinfinity = DAV_ENABLED_ON;
+ conf->allow_depthinfinity = DAV_ENABLED_ON;
else
- conf->allow_depthinfinity = DAV_ENABLED_OFF;
+ conf->allow_depthinfinity = DAV_ENABLED_OFF;
return NULL;
}
@@ -342,7 +342,7 @@
static const char *dav_cmd_davmintimeout(cmd_parms *cmd, void *config,
const char *arg1)
{
- dav_dir_conf *conf = (dav_dir_conf *) config;
+ dav_dir_conf *conf = (dav_dir_conf *)config;
conf->locktimeout = atoi(arg1);
if (conf->locktimeout < 0)
@@ -374,15 +374,15 @@
/* begin the response now... */
ap_rvputs(r,
- DAV_RESPONSE_BODY_1,
- r->status_line,
- DAV_RESPONSE_BODY_2,
- &r->status_line[4],
- DAV_RESPONSE_BODY_3,
+ DAV_RESPONSE_BODY_1,
+ r->status_line,
+ DAV_RESPONSE_BODY_2,
+ &r->status_line[4],
+ DAV_RESPONSE_BODY_3,
body,
- DAV_RESPONSE_BODY_4,
+ DAV_RESPONSE_BODY_4,
ap_psignature("<hr />\n", r),
- DAV_RESPONSE_BODY_5,
+ DAV_RESPONSE_BODY_5,
NULL);
/* the response has been sent. */
@@ -396,7 +396,7 @@
/*
* Send a "standardized" error response based on the error's namespace & tag
*/
-static int dav_error_response_tag(request_rec *r,
+static int dav_error_response_tag(request_rec *r,
dav_error *err)
{
r->status = err->status;
@@ -428,10 +428,10 @@
">" DEBUG_CR
"<D:%s/>" DEBUG_CR, err->tagname);
}
-
+
/* here's our mod_dav specific tag: */
if (err->desc != NULL) {
- ap_rprintf(r,
+ ap_rprintf(r,
"<m:human-readable errcode=\"%d\">" DEBUG_CR
"%s" DEBUG_CR
"</m:human-readable>" DEBUG_CR,
@@ -450,30 +450,30 @@
/*
-** Apache's URI escaping does not replace '&' since that is a valid character
-** in a URI (to form a query section). We must explicitly handle it so that
-** we can embed the URI into an XML document.
-*/
+ * Apache's URI escaping does not replace '&' since that is a valid character
+ * in a URI (to form a query section). We must explicitly handle it so that
+ * we can embed the URI into an XML document.
+ */
static const char *dav_xml_escape_uri(apr_pool_t *p, const char *uri)
{
const char *e_uri = ap_escape_uri(p, uri);
/* check the easy case... */
if (ap_strchr_c(e_uri, '&') == NULL)
- return e_uri;
+ return e_uri;
/* there was a '&', so more work is needed... sigh. */
/*
- ** Note: this is a teeny bit of overkill since we know there are no
- ** '<' or '>' characters, but who cares.
- */
+ * Note: this is a teeny bit of overkill since we know there are no
+ * '<' or '>' characters, but who cares.
+ */
return ap_xml_quote_string(p, e_uri, 0);
}
static void dav_send_multistatus(request_rec *r, int status,
dav_response *first,
- apr_array_header_t *namespaces)
+ apr_array_header_t *namespaces)
{
/* Set the correct status and Content-Type */
r->status = status;
@@ -481,74 +481,75 @@
/* Send the headers and actual multistatus response now... */
ap_rputs(DAV_XML_HEADER DEBUG_CR
- "<D:multistatus xmlns:D=\"DAV:\"", r);
+ "<D:multistatus xmlns:D=\"DAV:\"", r);
if (namespaces != NULL) {
- int i;
+ int i;
- for (i = namespaces->nelts; i--; ) {
- ap_rprintf(r, " xmlns:ns%d=\"%s\"", i,
- AP_XML_GET_URI_ITEM(namespaces, i));
- }
+ for (i = namespaces->nelts; i--; ) {
+ ap_rprintf(r, " xmlns:ns%d=\"%s\"", i,
+ AP_XML_GET_URI_ITEM(namespaces, i));
+ }
}
/* ap_rputc('>', r); */
ap_rputs(">" DEBUG_CR, r);
for (; first != NULL; first = first->next) {
- ap_text *t;
+ ap_text *t;
+
+ if (first->propresult.xmlns == NULL) {
+ ap_rputs("<D:response>", r);
+ }
+ else {
+ ap_rputs("<D:response", r);
+ for (t = first->propresult.xmlns; t; t = t->next) {
+ ap_rputs(t->text, r);
+ }
+ ap_rputc('>', r);
+ }
+
+ ap_rputs(DEBUG_CR "<D:href>", r);
+ ap_rputs(dav_xml_escape_uri(r->pool, first->href), r);
+ ap_rputs("</D:href>" DEBUG_CR, r);
+
+ if (first->propresult.propstats == NULL) {
+ /* use the Status-Line text from Apache. Note, this will
+ * default to 500 Internal Server Error if first->status
+ * is not a known (or valid) status code.
+ */
+ ap_rprintf(r,
+ "<D:status>HTTP/1.1 %s</D:status>" DEBUG_CR,
+ ap_get_status_line(first->status));
+ }
+ else {
+ /* assume this includes <propstat> and is quoted properly */
+ for (t = first->propresult.propstats; t; t = t->next) {
+ ap_rputs(t->text, r);
+ }
+ }
- if (first->propresult.xmlns == NULL) {
- ap_rputs("<D:response>", r);
- }
- else {
- ap_rputs("<D:response", r);
- for (t = first->propresult.xmlns; t; t = t->next) {
- ap_rputs(t->text, r);
- }
- ap_rputc('>', r);
- }
-
- ap_rputs(DEBUG_CR "<D:href>", r);
- ap_rputs(dav_xml_escape_uri(r->pool, first->href), r);
- ap_rputs("</D:href>" DEBUG_CR, r);
-
- if (first->propresult.propstats == NULL) {
- /* use the Status-Line text from Apache. Note, this will
- * default to 500 Internal Server Error if first->status
- * is not a known (or valid) status code. */
- ap_rprintf(r,
- "<D:status>HTTP/1.1 %s</D:status>" DEBUG_CR,
- ap_get_status_line(first->status));
- }
- else {
- /* assume this includes <propstat> and is quoted properly */
- for (t = first->propresult.propstats; t; t = t->next) {
- ap_rputs(t->text, r);
- }
- }
-
- if (first->desc != NULL) {
- /*
- ** We supply the description, so we know it doesn't have to
- ** have any escaping/encoding applied to it.
- */
- ap_rputs("<D:responsedescription>", r);
- ap_rputs(first->desc, r);
- ap_rputs("</D:responsedescription>" DEBUG_CR, r);
- }
+ if (first->desc != NULL) {
+ /*
+ * We supply the description, so we know it doesn't have to
+ * have any escaping/encoding applied to it.
+ */
+ ap_rputs("<D:responsedescription>", r);
+ ap_rputs(first->desc, r);
+ ap_rputs("</D:responsedescription>" DEBUG_CR, r);
+ }
- ap_rputs("</D:response>" DEBUG_CR, r);
+ ap_rputs("</D:response>" DEBUG_CR, r);
}
ap_rputs("</D:multistatus>" DEBUG_CR, r);
}
/*
-** dav_log_err()
-**
-** Write error information to the log.
-*/
+ * dav_log_err()
+ *
+ * Write error information to the log.
+ */
static void dav_log_err(request_rec *r, dav_error *err, int level)
{
dav_error *errscan;
@@ -556,43 +557,44 @@
/* Log the errors */
/* ### should have a directive to log the first or all */
for (errscan = err; errscan != NULL; errscan = errscan->prev) {
- if (errscan->desc == NULL)
- continue;
- if (errscan->save_errno != 0) {
- errno = errscan->save_errno;
- ap_log_rerror(APLOG_MARK, level, errno, r, "%s [%d, #%d]",
- errscan->desc, errscan->status, errscan->error_id);
- }
- else {
- ap_log_rerror(APLOG_MARK, level | APLOG_NOERRNO, 0, r,
- "%s [%d, #%d]",
- errscan->desc, errscan->status, errscan->error_id);
- }
+ if (errscan->desc == NULL)
+ continue;
+
+ if (errscan->save_errno != 0) {
+ errno = errscan->save_errno;
+ ap_log_rerror(APLOG_MARK, level, errno, r, "%s [%d, #%d]",
+ errscan->desc, errscan->status, errscan->error_id);
+ }
+ else {
+ ap_log_rerror(APLOG_MARK, level | APLOG_NOERRNO, 0, r,
+ "%s [%d, #%d]",
+ errscan->desc, errscan->status, errscan->error_id);
+ }
}
}
/*
-** dav_handle_err()
-**
-** Handle the standard error processing. <err> must be non-NULL.
-**
-** <response> is set by the following:
-** - dav_validate_request()
-** - dav_add_lock()
-** - repos_hooks->remove_resource
-** - repos_hooks->move_resource
-** - repos_hooks->copy_resource
-** - vsn_hooks->update
-*/
+ * dav_handle_err()
+ *
+ * Handle the standard error processing. <err> must be non-NULL.
+ *
+ * <response> is set by the following:
+ * - dav_validate_request()
+ * - dav_add_lock()
+ * - repos_hooks->remove_resource
+ * - repos_hooks->move_resource
+ * - repos_hooks->copy_resource
+ * - vsn_hooks->update
+ */
static int dav_handle_err(request_rec *r, dav_error *err,
- dav_response *response)
+ dav_response *response)
{
/* log the errors */
dav_log_err(r, err, APLOG_ERR);
if (response == NULL) {
- /* our error messages are safe; tell Apache this */
- apr_table_setn(r->notes, "verbose-error-to", "*");
+ /* our error messages are safe; tell Apache this */
+ apr_table_setn(r->notes, "verbose-error-to", "*");
/* didn't get a multistatus response passed in, but we still
might be able to generate a standard <D:error> response. */
@@ -600,7 +602,7 @@
return dav_error_response_tag(r, err);
}
- return err->status;
+ return err->status;
}
/* since we're returning DONE, ensure the request body is consumed. */
@@ -618,13 +620,13 @@
const char *body;
if (locn == NULL) {
- locn = r->uri;
+ locn = r->uri;
}
/* did the target resource already exist? */
if (replaced) {
- /* Apache will supply a default message */
- return HTTP_NO_CONTENT;
+ /* Apache will supply a default message */
+ return HTTP_NO_CONTENT;
}
/* Per HTTP/1.1, S10.2.2: add a Location header to contain the
@@ -648,22 +650,23 @@
const char *depth = apr_table_get(r->headers_in, "Depth");
if (depth == NULL) {
- return def_depth;
+ return def_depth;
}
+
if (strcasecmp(depth, "infinity") == 0) {
- return DAV_INFINITY;
+ return DAV_INFINITY;
}
else if (strcmp(depth, "0") == 0) {
- return 0;
+ return 0;
}
else if (strcmp(depth, "1") == 0) {
- return 1;
+ return 1;
}
/* The caller will return an HTTP_BAD_REQUEST. This will augment the
* default message that Apache provides. */
ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "An invalid Depth header was specified.");
+ "An invalid Depth header was specified.");
return -1;
}
@@ -672,20 +675,21 @@
const char *overwrite = apr_table_get(r->headers_in, "Overwrite");
if (overwrite == NULL) {
- return 1; /* default is "T" */
+ return 1; /* default is "T" */
}
if ((*overwrite == 'F' || *overwrite == 'f') && overwrite[1] == '\0') {
- return 0;
+ return 0;
}
+
if ((*overwrite == 'T' || *overwrite == 't') && overwrite[1] == '\0') {
- return 1;
+ return 1;
}
/* The caller will return an HTTP_BAD_REQUEST. This will augment the
* default message that Apache provides. */
ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "An invalid Overwrite header was specified.");
+ "An invalid Overwrite header was specified.");
return -1;
}
@@ -698,8 +702,8 @@
* the resource identified by the DAV:checked-in property of the resource
* identified by the Request-URI.
*/
-static dav_error * dav_get_resource(request_rec *r, int label_allowed,
- int use_checked_in, dav_resource **res_p)
+static dav_error *dav_get_resource(request_rec *r, int label_allowed,
+ int use_checked_in, dav_resource **res_p)
{
dav_dir_conf *conf;
const char *label = NULL;
@@ -746,8 +750,8 @@
const dav_hooks_locks *hooks = DAV_GET_HOOKS_LOCKS(r);
if (hooks == NULL) {
- *lockdb = NULL;
- return NULL;
+ *lockdb = NULL;
+ return NULL;
}
/* open the thing lazily */
@@ -804,6 +808,7 @@
&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;
@@ -847,9 +852,9 @@
/* Note: depth == 0. Implies no need for a multistatus response. */
if ((err = dav_validate_request(r, resource, 0, NULL, NULL,
- DAV_VALIDATE_RESOURCE, NULL)) != NULL) {
- /* ### add a higher-level description? */
- return dav_handle_err(r, err, NULL);
+ DAV_VALIDATE_RESOURCE, NULL)) != NULL) {
+ /* ### add a higher-level description? */
+ return dav_handle_err(r, err, NULL);
}
return DECLINED;
@@ -874,7 +879,7 @@
apr_off_t range_end;
if ((result = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK)) != OK) {
- return result;
+ return result;
}
/* Ask repository module to resolve the resource */
@@ -887,14 +892,14 @@
if (resource->type != DAV_RESOURCE_TYPE_REGULAR
&& resource->type != DAV_RESOURCE_TYPE_WORKING) {
body = apr_psprintf(r->pool,
- "Cannot create resource %s with PUT.",
- ap_escape_html(r->pool, r->uri));
- return dav_error_response(r, HTTP_CONFLICT, body);
+ "Cannot create resource %s with PUT.",
+ ap_escape_html(r->pool, r->uri));
+ return dav_error_response(r, HTTP_CONFLICT, body);
}
/* Cannot PUT a collection */
if (resource->collection) {
- return dav_error_response(r, HTTP_CONFLICT,
+ return dav_error_response(r, HTTP_CONFLICT,
"Cannot PUT to a collection.");
}
@@ -902,28 +907,28 @@
resource_state = dav_get_resource_state(r, resource);
/*
- ** Note: depth == 0 normally requires no multistatus response. However,
- ** if we pass DAV_VALIDATE_PARENT, then we could get an error on a URI
- ** other than the Request-URI, thereby requiring a multistatus.
- **
- ** If the resource does not exist (DAV_RESOURCE_NULL), then we must
- ** check the resource *and* its parent. If the resource exists or is
- ** a locknull resource, then we check only the resource.
- */
+ * Note: depth == 0 normally requires no multistatus response. However,
+ * if we pass DAV_VALIDATE_PARENT, then we could get an error on a URI
+ * other than the Request-URI, thereby requiring a multistatus.
+ *
+ * If the resource does not exist (DAV_RESOURCE_NULL), then we must
+ * check the resource *and* its parent. If the resource exists or is
+ * a locknull resource, then we check only the resource.
+ */
if ((err = dav_validate_request(r, resource, 0, NULL, &multi_response,
- resource_state == DAV_RESOURCE_NULL ?
- DAV_VALIDATE_PARENT :
- DAV_VALIDATE_RESOURCE, NULL)) != NULL) {
- /* ### add a higher-level description? */
- return dav_handle_err(r, err, multi_response);
+ resource_state == DAV_RESOURCE_NULL ?
+ DAV_VALIDATE_PARENT :
+ DAV_VALIDATE_RESOURCE, NULL)) != NULL) {
+ /* ### add a higher-level description? */
+ return dav_handle_err(r, err, multi_response);
}
/* make sure the resource can be modified (if versioning repository) */
if ((err = dav_auto_checkout(r, resource,
- 0 /* not parent_only */,
- &av_info)) != NULL) {
- /* ### add a higher-level description? */
- return dav_handle_err(r, err, NULL);
+ 0 /* not parent_only */,
+ &av_info)) != NULL) {
+ /* ### add a higher-level description? */
+ return dav_handle_err(r, err, NULL);
}
/* truncate and rewrite the file unless we see a Content-Range */
@@ -937,12 +942,12 @@
/* Create the new file in the repository */
if ((err = (*resource->hooks->open_stream)(resource, mode,
&stream)) != NULL) {
- /* ### assuming FORBIDDEN is probably not quite right... */
- err = dav_push_error(r->pool, HTTP_FORBIDDEN, 0,
- apr_psprintf(r->pool,
- "Unable to PUT new contents for %s.",
- ap_escape_html(r->pool, r->uri)),
- err);
+ /* ### assuming FORBIDDEN is probably not quite right... */
+ err = dav_push_error(r->pool, HTTP_FORBIDDEN, 0,
+ apr_psprintf(r->pool,
+ "Unable to PUT new contents for %s.",
+ ap_escape_html(r->pool, r->uri)),
+ err);
}
if (err == NULL && has_range) {
@@ -952,55 +957,55 @@
if (err == NULL) {
if (ap_should_client_block(r)) {
- char *buffer = apr_palloc(r->pool, DAV_READ_BLOCKSIZE);
- long len;
+ char *buffer = apr_palloc(r->pool, DAV_READ_BLOCKSIZE);
+ long len;
/*
- ** Once we start reading the request, then we must read the
- ** whole darn thing. ap_discard_request_body() won't do anything
- ** for a partially-read request.
- */
-
- while ((len = ap_get_client_block(r, buffer,
- DAV_READ_BLOCKSIZE)) > 0) {
- if (err == NULL) {
- /* write whatever we read, until we see an error */
- err = (*resource->hooks->write_stream)(stream,
- buffer, len);
- }
- }
+ * Once we start reading the request, then we must read the
+ * whole darn thing. ap_discard_request_body() won't do anything
+ * for a partially-read request.
+ */
+
+ while ((len = ap_get_client_block(r, buffer,
+ DAV_READ_BLOCKSIZE)) > 0) {
+ if (err == NULL) {
+ /* write whatever we read, until we see an error */
+ err = (*resource->hooks->write_stream)(stream,
+ buffer, len);
+ }
+ }
/*
- ** ### what happens if we read more/less than the amount
- ** ### specified in the Content-Range? eek...
- */
-
- if (len == -1) {
- /*
- ** Error reading request body. This has precedence over
- ** prior errors.
- */
- err = dav_new_error(r->pool, HTTP_BAD_REQUEST, 0,
- "An error occurred while reading the "
- "request body.");
- }
+ * ### what happens if we read more/less than the amount
+ * ### specified in the Content-Range? eek...
+ */
+
+ if (len == -1) {
+ /*
+ * Error reading request body. This has precedence over
+ * prior errors.
+ */
+ err = dav_new_error(r->pool, HTTP_BAD_REQUEST, 0,
+ "An error occurred while reading the "
+ "request body.");
+ }
}
err2 = (*resource->hooks->close_stream)(stream,
err == NULL /* commit */);
- if (err2 != NULL && err == NULL) {
- /* no error during the write, but we hit one at close. use it. */
- err = err2;
- }
+ if (err2 != NULL && err == NULL) {
+ /* no error during the write, but we hit one at close. use it. */
+ err = err2;
+ }
}
/*
- ** Ensure that we think the resource exists now.
- ** ### eek. if an error occurred during the write and we did not commit,
- ** ### then the resource might NOT exist (e.g. dav_fs_repos.c)
- */
+ * Ensure that we think the resource exists now.
+ * ### eek. if an error occurred during the write and we did not commit,
+ * ### then the resource might NOT exist (e.g. dav_fs_repos.c)
+ */
if (err == NULL) {
- resource->exists = 1;
+ resource->exists = 1;
}
/* restore modifiability of resources back to what they were */
@@ -1009,16 +1014,17 @@
/* check for errors now */
if (err != NULL) {
- return dav_handle_err(r, err, NULL);
+ return dav_handle_err(r, err, NULL);
}
+
if (err2 != NULL) {
- /* just log a warning */
- err2 = dav_push_error(r->pool, err->status, 0,
- "The PUT was successful, but there "
- "was a problem automatically checking in "
- "the resource or its parent collection.",
- err2);
- dav_log_err(r, err2, APLOG_WARNING);
+ /* just log a warning */
+ err2 = dav_push_error(r->pool, err->status, 0,
+ "The PUT was successful, but there "
+ "was a problem automatically checking in "
+ "the resource or its parent collection.",
+ err2);
+ dav_log_err(r, err2, APLOG_WARNING);
}
/* ### place the Content-Type and Content-Language into the propdb */
@@ -1027,30 +1033,30 @@
dav_lockdb *lockdb;
if ((err = (*locks_hooks->open_lockdb)(r, 0, 0, &lockdb)) != NULL) {
- /* The file creation was successful, but the locking failed. */
- err = dav_push_error(r->pool, err->status, 0,
- "The file was PUT successfully, but there "
- "was a problem opening the lock database "
- "which prevents inheriting locks from the "
- "parent resources.",
- err);
- return dav_handle_err(r, err, NULL);
- }
-
- /* notify lock system that we have created/replaced a resource */
- err = dav_notify_created(r, lockdb, resource, resource_state, 0);
-
- (*locks_hooks->close_lockdb)(lockdb);
-
- if (err != NULL) {
- /* The file creation was successful, but the locking failed. */
- err = dav_push_error(r->pool, err->status, 0,
- "The file was PUT successfully, but there "
- "was a problem updating its lock "
- "information.",
- err);
- return dav_handle_err(r, err, NULL);
- }
+ /* The file creation was successful, but the locking failed. */
+ err = dav_push_error(r->pool, err->status, 0,
+ "The file was PUT successfully, but there "
+ "was a problem opening the lock database "
+ "which prevents inheriting locks from the "
+ "parent resources.",
+ err);
+ return dav_handle_err(r, err, NULL);
+ }
+
+ /* notify lock system that we have created/replaced a resource */
+ err = dav_notify_created(r, lockdb, resource, resource_state, 0);
+
+ (*locks_hooks->close_lockdb)(lockdb);
+
+ if (err != NULL) {
+ /* The file creation was successful, but the locking failed. */
+ err = dav_push_error(r->pool, err->status, 0,
+ "The file was PUT successfully, but there "
+ "was a problem updating its lock "
+ "information.",
+ err);
+ return dav_handle_err(r, err, NULL);
+ }
}
/* NOTE: WebDAV spec, S8.7.1 states properties should be unaffected */
@@ -1070,7 +1076,7 @@
resp->href = apr_pstrdup(wres->pool, wres->resource->uri);
resp->status = status;
if (propstats) {
- resp->propresult = *propstats;
+ resp->propresult = *propstats;
}
resp->next = wres->response;
@@ -1090,7 +1096,7 @@
/* We don't use the request body right now, so torch it. */
if ((result = ap_discard_request_body(r)) != OK) {
- return result;
+ return result;
}
/* Ask repository module to resolve the resource */
@@ -1100,7 +1106,7 @@
return dav_handle_err(r, err, NULL);
if (!resource->exists) {
/* Apache will supply a default error for this. */
- return HTTP_NOT_FOUND;
+ return HTTP_NOT_FOUND;
}
/* 2518 says that depth must be infinity only for collections.
@@ -1109,16 +1115,17 @@
depth = dav_get_depth(r, DAV_INFINITY);
if (resource->collection && depth != DAV_INFINITY) {
- /* This supplies additional information for the default message. */
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "Depth must be \"infinity\" for DELETE of a collection.");
- return HTTP_BAD_REQUEST;
+ /* This supplies additional information for the default message. */
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "Depth must be \"infinity\" for DELETE of a collection.");
+ return HTTP_BAD_REQUEST;
}
+
if (!resource->collection && depth == 1) {
- /* This supplies additional information for the default message. */
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "Depth of \"1\" is not allowed for DELETE.");
- return HTTP_BAD_REQUEST;
+ /* This supplies additional information for the default message. */
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "Depth of \"1\" is not allowed for DELETE.");
+ return HTTP_BAD_REQUEST;
}
/*
@@ -1130,30 +1137,30 @@
** multistatus response -- only internal members/collections.
*/
if ((err = dav_validate_request(r, resource, depth, NULL,
- &multi_response,
- DAV_VALIDATE_PARENT
+ &multi_response,
+ DAV_VALIDATE_PARENT
| DAV_VALIDATE_USE_424, NULL)) != NULL) {
- err = dav_push_error(r->pool, err->status, 0,
- apr_psprintf(r->pool,
- "Could not DELETE %s due to a failed "
- "precondition (e.g. locks).",
- ap_escape_html(r->pool, r->uri)),
- err);
- return dav_handle_err(r, err, multi_response);
+ err = dav_push_error(r->pool, err->status, 0,
+ apr_psprintf(r->pool,
+ "Could not DELETE %s due to a failed "
+ "precondition (e.g. locks).",
+ ap_escape_html(r->pool, r->uri)),
+ err);
+ return dav_handle_err(r, err, multi_response);
}
/* ### RFC 2518 s. 8.10.5 says to remove _all_ locks, not just those
* locked by the token(s) in the if_header.
*/
if ((result = dav_unlock(r, resource, NULL)) != OK) {
- return result;
+ return result;
}
/* if versioned resource, make sure parent is checked out */
if ((err = dav_auto_checkout(r, resource, 1 /* parent_only */,
- &av_info)) != NULL) {
- /* ### add a higher-level description? */
- return dav_handle_err(r, err, NULL);
+ &av_info)) != NULL) {
+ /* ### add a higher-level description? */
+ return dav_handle_err(r, err, NULL);
}
/* try to remove the resource */
@@ -1161,25 +1168,25 @@
/* restore writability of parent back to what it was */
err2 = dav_auto_checkin(r, NULL, err != NULL /* undo if error */,
- 0 /*unlock*/, &av_info);
+ 0 /*unlock*/, &av_info);
/* check for errors now */
if (err != NULL) {
- err = dav_push_error(r->pool, err->status, 0,
- apr_psprintf(r->pool,
- "Could not DELETE %s.",
- ap_escape_html(r->pool, r->uri)),
- err);
- return dav_handle_err(r, err, multi_response);
+ err = dav_push_error(r->pool, err->status, 0,
+ apr_psprintf(r->pool,
+ "Could not DELETE %s.",
+ ap_escape_html(r->pool, r->uri)),
+ err);
+ return dav_handle_err(r, err, multi_response);
}
if (err2 != NULL) {
- /* just log a warning */
- err = dav_push_error(r->pool, err2->status, 0,
- "The DELETE was successful, but there "
- "was a problem automatically checking in "
- "the parent collection.",
- err2);
- dav_log_err(r, err, APLOG_WARNING);
+ /* just log a warning */
+ err = dav_push_error(r->pool, err2->status, 0,
+ "The DELETE was successful, but there "
+ "was a problem automatically checking in "
+ "the parent collection.",
+ err2);
+ dav_log_err(r, err, APLOG_WARNING);
}
/* ### HTTP_NO_CONTENT if no body, HTTP_OK if there is a body (some day) */
@@ -1206,14 +1213,16 @@
if (elem->first_child == NULL) {
/* show all supported methods */
arr = apr_table_elts(methods);
- elts = (const apr_table_entry_t *) arr->elts;
+ elts = (const apr_table_entry_t *)arr->elts;
for (i = 0; i < arr->nelts; ++i) {
if (elts[i].key == NULL)
continue;
+
s = apr_psprintf(r->pool,
- "<D:supported-method D:name=\"%s\"/>" DEBUG_CR,
- elts[i].key);
+ "<D:supported-method D:name=\"%s\"/>"
+ DEBUG_CR,
+ elts[i].key);
ap_text_append(r->pool, body, s);
}
}
@@ -1240,8 +1249,9 @@
/* see if method is supported */
if (apr_table_get(methods, name) != NULL) {
s = apr_psprintf(r->pool,
- "<D:supported-method D:name=\"%s\"/>" DEBUG_CR,
- name);
+ "<D:supported-method D:name=\"%s\"/>"
+ DEBUG_CR,
+ name);
ap_text_append(r->pool, body, s);
}
}
@@ -1267,11 +1277,11 @@
/* open lock database, to report on supported lock properties */
/* ### should open read-only */
if ((err = dav_open_lockdb(r, 0, &lockdb)) != NULL) {
- return dav_push_error(r->pool, err->status, 0,
- "The lock database could not be opened, "
- "preventing the reporting of supported lock "
+ return dav_push_error(r->pool, err->status, 0,
+ "The lock database could not be opened, "
+ "preventing the reporting of supported lock "
"properties.",
- err);
+ err);
}
/* open the property database (readonly) for the resource */
@@ -1280,10 +1290,10 @@
if (lockdb != NULL)
(*lockdb->hooks->close_lockdb)(lockdb);
- return dav_push_error(r->pool, err->status, 0,
- "The property database could not be opened, "
- "preventing report of supported properties.",
- err);
+ return dav_push_error(r->pool, err->status, 0,
+ "The property database could not be opened, "
+ "preventing report of supported properties.",
+ err);
}
ap_text_append(r->pool, body, "<D:supported-live-property-set>" DEBUG_CR);
@@ -1360,7 +1370,7 @@
const dav_report_elem *rp;
if ((err = (*vsn_hooks->avail_reports)(resource, &reports)) != NULL) {
- return dav_push_error(r->pool, err->status, 0,
+ return dav_push_error(r->pool, err->status, 0,
"DAV:supported-report-set could not be "
"determined due to a problem fetching the "
"available reports for this resource.",
@@ -1371,10 +1381,12 @@
if (elem->first_child == NULL) {
/* show all supported reports */
for (rp = reports; rp->nmspace != NULL; ++rp) {
- /* Note: we presume reports->namespace is properly XML/URL quoted */
+ /* Note: we presume reports->namespace is
+ * properly XML/URL quoted */
s = apr_psprintf(r->pool,
- "<D:supported-report D:name=\"%s\" D:namespace=\"%s\"/>" DEBUG_CR,
- rp->name, rp->nmspace);
+ "<D:supported-report D:name=\"%s\" "
+ "D:namespace=\"%s\"/>" DEBUG_CR,
+ rp->name, rp->nmspace);
ap_text_append(r->pool, body, s);
}
}
@@ -1409,10 +1421,15 @@
for (rp = reports; rp->nmspace != NULL; ++rp) {
if (strcmp(name, rp->name) == 0
&& strcmp(nmspace, rp->nmspace) == 0) {
- /* Note: we presume reports->nmspace is properly XML/URL quoted */
+ /* Note: we presume reports->nmspace is
+ * properly XML/URL quoted
+ */
s = apr_psprintf(r->pool,
- "<D:supported-report D:name=\"%s\" D:namespace=\"%s\"/>" DEBUG_CR,
- rp->name, rp->nmspace);
+ "<D:supported-report "
+ "D:name=\"%s\" "
+ "D:namespace=\"%s\"/>"
+ DEBUG_CR,
+ rp->name, rp->nmspace);
ap_text_append(r->pool, body, s);
break;
}
@@ -1459,14 +1476,14 @@
/* parse any request body */
if ((result = ap_xml_parse_input(r, &doc)) != OK) {
- return result;
+ return result;
}
/* note: doc == NULL if no request body */
if (doc && !dav_validate_root(doc, "options")) {
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "The \"options\" element was not found.");
- return HTTP_BAD_REQUEST;
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "The \"options\" element was not found.");
+ return HTTP_BAD_REQUEST;
}
/* determine which providers are available */
@@ -1477,20 +1494,20 @@
}
if (binding_hooks != NULL)
- dav_level = apr_pstrcat(r->pool, dav_level, ",bindings", NULL);
+ dav_level = apr_pstrcat(r->pool, dav_level, ",bindings", NULL);
/* ###
- ** MSFT Web Folders chokes if length of DAV header value > 63 characters!
- ** To workaround that, we use separate DAV headers for versioning and
- ** live prop provider namespace URIs.
- ** ###
- */
+ * MSFT Web Folders chokes if length of DAV header value > 63 characters!
+ * To workaround that, we use separate DAV headers for versioning and
+ * live prop provider namespace URIs.
+ * ###
+ */
apr_table_setn(r->headers_out, "DAV", dav_level);
/*
- ** If there is a versioning provider, generate DAV headers
- ** for versioning options.
- */
+ * If there is a versioning provider, generate DAV headers
+ * for versioning options.
+ */
if (vsn_hooks != NULL) {
(*vsn_hooks->get_vsn_options)(r->pool, &vsn_options);
@@ -1499,10 +1516,10 @@
}
/*
- ** Gather property set URIs from all the liveprop providers,
- ** and generate a separate DAV header for each URI, to avoid
- ** problems with long header lengths.
- */
+ * Gather property set URIs from all the liveprop providers,
+ * and generate a separate DAV header for each URI, to avoid
+ * problems with long header lengths.
+ */
uri_ary = apr_array_make(r->pool, 5, sizeof(const char *));
dav_run_gather_propsets(uri_ary);
for (i = 0; i < uri_ary->nelts; ++i) {
@@ -1514,14 +1531,14 @@
apr_table_setn(r->headers_out, "MS-Author-Via", "DAV");
/*
- ** Determine which methods are allowed on the resource.
- ** Three cases: resource is null (3), is lock-null (7.4), or exists.
- **
- ** All cases support OPTIONS, and if there is a lock provider, LOCK.
- ** (Lock-) null resources also support MKCOL and PUT.
- ** Lock-null supports PROPFIND and UNLOCK.
- ** Existing resources support lots of stuff.
- */
+ * Determine which methods are allowed on the resource.
+ * Three cases: resource is null (3), is lock-null (7.4), or exists.
+ *
+ * All cases support OPTIONS, and if there is a lock provider, LOCK.
+ * (Lock-) null resources also support MKCOL and PUT.
+ * Lock-null supports PROPFIND and UNLOCK.
+ * Existing resources support lots of stuff.
+ */
apr_table_addn(methods, "OPTIONS", "");
@@ -1529,7 +1546,7 @@
switch (dav_get_resource_state(r, resource))
{
case DAV_RESOURCE_EXISTS:
- /* resource exists */
+ /* resource exists */
apr_table_addn(methods, "GET", "");
apr_table_addn(methods, "HEAD", "");
apr_table_addn(methods, "POST", "");
@@ -1540,7 +1557,7 @@
apr_table_addn(methods, "COPY", "");
apr_table_addn(methods, "MOVE", "");
- if (!resource->collection)
+ if (!resource->collection)
apr_table_addn(methods, "PUT", "");
if (locks_hooks != NULL) {
@@ -1551,7 +1568,7 @@
break;
case DAV_RESOURCE_LOCK_NULL:
- /* resource is lock-null. */
+ /* resource is lock-null. */
apr_table_addn(methods, "MKCOL", "");
apr_table_addn(methods, "PROPFIND", "");
apr_table_addn(methods, "PUT", "");
@@ -1564,7 +1581,7 @@
break;
case DAV_RESOURCE_NULL:
- /* resource is null. */
+ /* resource is null. */
apr_table_addn(methods, "MKCOL", "");
apr_table_addn(methods, "PUT", "");
@@ -1574,8 +1591,8 @@
break;
default:
- /* ### internal error! */
- break;
+ /* ### internal error! */
+ break;
}
/* If there is a versioning provider, add versioning methods */
@@ -1619,7 +1636,7 @@
/* Generate the Allow header */
arr = apr_table_elts(methods);
- elts = (const apr_table_entry_t *) arr->elts;
+ elts = (const apr_table_entry_t *)arr->elts;
text_size = 0;
/* first, compute total length */
@@ -1715,23 +1732,23 @@
/* just return if we built the thing already */
if (ctx->propstat_404 != NULL) {
- return;
+ return;
}
ap_text_append(ctx->w.pool, &hdr,
- "<D:propstat>" DEBUG_CR
- "<D:prop>" DEBUG_CR);
+ "<D:propstat>" DEBUG_CR
+ "<D:prop>" DEBUG_CR);
elem = dav_find_child(ctx->doc->root, "prop");
for (elem = elem->first_child; elem; elem = elem->next) {
- ap_text_append(ctx->w.pool, &hdr,
+ ap_text_append(ctx->w.pool, &hdr,
ap_xml_empty_elem(ctx->w.pool, elem));
}
ap_text_append(ctx->w.pool, &hdr,
- "</D:prop>" DEBUG_CR
- "<D:status>HTTP/1.1 404 Not Found</D:status>" DEBUG_CR
- "</D:propstat>" DEBUG_CR);
+ "</D:prop>" DEBUG_CR
+ "<D:status>HTTP/1.1 404 Not Found</D:status>" DEBUG_CR
+ "</D:propstat>" DEBUG_CR);
ctx->propstat_404 = hdr.first;
}
@@ -1752,34 +1769,34 @@
** the resource, however, since we are opening readonly.
*/
err = dav_open_propdb(ctx->r, ctx->w.lockdb, wres->resource, 1,
- ctx->doc ? ctx->doc->namespaces : NULL, &propdb);
+ ctx->doc ? ctx->doc->namespaces : NULL, &propdb);
if (err != NULL) {
- /* ### do something with err! */
+ /* ### do something with err! */
- if (ctx->propfind_type == DAV_PROPFIND_IS_PROP) {
- dav_get_props_result badprops = { 0 };
+ if (ctx->propfind_type == DAV_PROPFIND_IS_PROP) {
+ dav_get_props_result badprops = { 0 };
- /* some props were expected on this collection/resource */
- dav_cache_badprops(ctx);
- badprops.propstats = ctx->propstat_404;
- dav_add_response(wres, 0, &badprops);
- }
- else {
- /* no props on this collection/resource */
- dav_add_response(wres, HTTP_OK, NULL);
- }
- return NULL;
+ /* some props were expected on this collection/resource */
+ dav_cache_badprops(ctx);
+ badprops.propstats = ctx->propstat_404;
+ dav_add_response(wres, 0, &badprops);
+ }
+ else {
+ /* no props on this collection/resource */
+ dav_add_response(wres, HTTP_OK, NULL);
+ }
+ return NULL;
}
/* ### what to do about closing the propdb on server failure? */
if (ctx->propfind_type == DAV_PROPFIND_IS_PROP) {
- propstats = dav_get_props(propdb, ctx->doc);
+ propstats = dav_get_props(propdb, ctx->doc);
}
else {
dav_prop_insert what = ctx->propfind_type == DAV_PROPFIND_IS_ALLPROP
? DAV_PROP_INSERT_VALUE
: DAV_PROP_INSERT_NAME;
- propstats = dav_get_allprops(propdb, what);
+ propstats = dav_get_allprops(propdb, what);
}
dav_close_propdb(propdb);
@@ -1807,65 +1824,65 @@
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. */
- return HTTP_NOT_FOUND;
+ /* Apache will supply a default error for this. */
+ return HTTP_NOT_FOUND;
}
if ((depth = dav_get_depth(r, DAV_INFINITY)) < 0) {
- /* dav_get_depth() supplies additional information for the
- * default message. */
- return HTTP_BAD_REQUEST;
+ /* dav_get_depth() supplies additional information for the
+ * default message. */
+ return HTTP_BAD_REQUEST;
}
if (depth == DAV_INFINITY && resource->collection) {
- dav_dir_conf *conf;
- conf = (dav_dir_conf *) ap_get_module_config(r->per_dir_config,
- &dav_module);
+ dav_dir_conf *conf;
+ conf = (dav_dir_conf *)ap_get_module_config(r->per_dir_config,
+ &dav_module);
/* default is to DISALLOW these requests */
- if (conf->allow_depthinfinity != DAV_ENABLED_ON) {
+ if (conf->allow_depthinfinity != DAV_ENABLED_ON) {
return dav_error_response(r, HTTP_FORBIDDEN,
apr_psprintf(r->pool,
- "PROPFIND requests with a "
- "Depth of \"infinity\" are "
- "not allowed for %s.",
- ap_escape_html(r->pool,
- r->uri)));
- }
+ "PROPFIND requests with a "
+ "Depth of \"infinity\" are "
+ "not allowed for %s.",
+ ap_escape_html(r->pool,
+ r->uri)));
+ }
}
if ((result = ap_xml_parse_input(r, &doc)) != OK) {
- return result;
+ return result;
}
/* note: doc == NULL if no request body */
if (doc && !dav_validate_root(doc, "propfind")) {
- /* This supplies additional information for the default message. */
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "The \"propfind\" element was not found.");
- return HTTP_BAD_REQUEST;
+ /* This supplies additional information for the default message. */
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "The \"propfind\" element was not found.");
+ return HTTP_BAD_REQUEST;
}
/* ### validate that only one of these three elements is present */
if (doc == NULL
- || (child = dav_find_child(doc->root, "allprop")) != NULL) {
- /* note: no request body implies allprop */
- ctx.propfind_type = DAV_PROPFIND_IS_ALLPROP;
+ || (child = dav_find_child(doc->root, "allprop")) != NULL) {
+ /* note: no request body implies allprop */
+ ctx.propfind_type = DAV_PROPFIND_IS_ALLPROP;
}
else if ((child = dav_find_child(doc->root, "propname")) != NULL) {
- ctx.propfind_type = DAV_PROPFIND_IS_PROPNAME;
+ ctx.propfind_type = DAV_PROPFIND_IS_PROPNAME;
}
else if ((child = dav_find_child(doc->root, "prop")) != NULL) {
- ctx.propfind_type = DAV_PROPFIND_IS_PROP;
+ ctx.propfind_type = DAV_PROPFIND_IS_PROP;
}
else {
- /* "propfind" element must have one of the above three children */
+ /* "propfind" element must have one of the above three children */
- /* This supplies additional information for the default message. */
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "The \"propfind\" element does not contain one of "
- "the required child elements (the specific command).");
- return HTTP_BAD_REQUEST;
+ /* This supplies additional information for the default message. */
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "The \"propfind\" element does not contain one of "
+ "the required child elements (the specific command).");
+ return HTTP_BAD_REQUEST;
}
ctx.w.walk_type = DAV_WALKTYPE_NORMAL | DAV_WALKTYPE_AUTH;
@@ -1879,27 +1896,27 @@
/* ### should open read-only */
if ((err = dav_open_lockdb(r, 0, &ctx.w.lockdb)) != NULL) {
- err = dav_push_error(r->pool, err->status, 0,
- "The lock database could not be opened, "
- "preventing access to the various lock "
- "properties for the PROPFIND.",
- err);
- return dav_handle_err(r, err, NULL);
+ err = dav_push_error(r->pool, err->status, 0,
+ "The lock database could not be opened, "
+ "preventing access to the various lock "
+ "properties for the PROPFIND.",
+ err);
+ return dav_handle_err(r, err, NULL);
}
if (ctx.w.lockdb != NULL) {
- /* if we have a lock database, then we can walk locknull resources */
- ctx.w.walk_type |= DAV_WALKTYPE_LOCKNULL;
+ /* if we have a lock database, then we can walk locknull resources */
+ ctx.w.walk_type |= DAV_WALKTYPE_LOCKNULL;
}
err = (*resource->hooks->walk)(&ctx.w, depth, &multi_status);
if (ctx.w.lockdb != NULL) {
- (*ctx.w.lockdb->hooks->close_lockdb)(ctx.w.lockdb);
+ (*ctx.w.lockdb->hooks->close_lockdb)(ctx.w.lockdb);
}
if (err != NULL) {
- /* ### add a higher-level description? */
- return dav_handle_err(r, err, NULL);
+ /* ### add a higher-level description? */
+ return dav_handle_err(r, err, NULL);
}
/* return a 207 (Multi-Status) response now. */
@@ -1910,11 +1927,11 @@
* scope for the badprops. */
/* NOTE: propstat_404 != NULL implies doc != NULL */
if (ctx.propstat_404 != NULL) {
- dav_send_multistatus(r, HTTP_MULTI_STATUS, multi_status,
+ dav_send_multistatus(r, HTTP_MULTI_STATUS, multi_status,
doc->namespaces);
}
else {
- dav_send_multistatus(r, HTTP_MULTI_STATUS, multi_status, NULL);
+ dav_send_multistatus(r, HTTP_MULTI_STATUS, multi_status, NULL);
}
/* the response has been sent. */
@@ -1922,7 +1939,7 @@
}
static ap_text * dav_failed_proppatch(apr_pool_t *p,
- apr_array_header_t *prop_ctx)
+ apr_array_header_t *prop_ctx)
{
ap_text_header hdr = { 0 };
int i = prop_ctx->nelts;
@@ -1934,49 +1951,49 @@
/* ### might be nice to sort by status code and description */
for ( ; i-- > 0; ++ctx ) {
- ap_text_append(p, &hdr,
- "<D:propstat>" DEBUG_CR
- "<D:prop>");
- ap_text_append(p, &hdr, ap_xml_empty_elem(p, ctx->prop));
- ap_text_append(p, &hdr, "</D:prop>" DEBUG_CR);
-
- if (ctx->err == NULL) {
- /* nothing was assigned here yet, so make it a 424 */
-
- if (ctx->operation == DAV_PROP_OP_SET) {
- if (err424_set == NULL)
- err424_set = dav_new_error(p, HTTP_FAILED_DEPENDENCY, 0,
- "Attempted DAV:set operation "
- "could not be completed due "
- "to other errors.");
- ctx->err = err424_set;
- }
- else if (ctx->operation == DAV_PROP_OP_DELETE) {
- if (err424_delete == NULL)
- err424_delete = dav_new_error(p, HTTP_FAILED_DEPENDENCY, 0,
- "Attempted DAV:remove "
- "operation could not be "
- "completed due to other "
- "errors.");
- ctx->err = err424_delete;
- }
- }
-
- s = apr_psprintf(p,
- "<D:status>"
- "HTTP/1.1 %d (status)"
- "</D:status>" DEBUG_CR,
- ctx->err->status);
- ap_text_append(p, &hdr, s);
-
- /* ### we should use compute_desc if necessary... */
- if (ctx->err->desc != NULL) {
- ap_text_append(p, &hdr, "<D:responsedescription>" DEBUG_CR);
- ap_text_append(p, &hdr, ctx->err->desc);
- ap_text_append(p, &hdr, "</D:responsedescription>" DEBUG_CR);
- }
+ ap_text_append(p, &hdr,
+ "<D:propstat>" DEBUG_CR
+ "<D:prop>");
+ ap_text_append(p, &hdr, ap_xml_empty_elem(p, ctx->prop));
+ ap_text_append(p, &hdr, "</D:prop>" DEBUG_CR);
+
+ if (ctx->err == NULL) {
+ /* nothing was assigned here yet, so make it a 424 */
+
+ if (ctx->operation == DAV_PROP_OP_SET) {
+ if (err424_set == NULL)
+ err424_set = dav_new_error(p, HTTP_FAILED_DEPENDENCY, 0,
+ "Attempted DAV:set operation "
+ "could not be completed due "
+ "to other errors.");
+ ctx->err = err424_set;
+ }
+ else if (ctx->operation == DAV_PROP_OP_DELETE) {
+ if (err424_delete == NULL)
+ err424_delete = dav_new_error(p, HTTP_FAILED_DEPENDENCY, 0,
+ "Attempted DAV:remove "
+ "operation could not be "
+ "completed due to other "
+ "errors.");
+ ctx->err = err424_delete;
+ }
+ }
+
+ s = apr_psprintf(p,
+ "<D:status>"
+ "HTTP/1.1 %d (status)"
+ "</D:status>" DEBUG_CR,
+ ctx->err->status);
+ ap_text_append(p, &hdr, s);
+
+ /* ### we should use compute_desc if necessary... */
+ if (ctx->err->desc != NULL) {
+ ap_text_append(p, &hdr, "<D:responsedescription>" DEBUG_CR);
+ ap_text_append(p, &hdr, ctx->err->desc);
+ ap_text_append(p, &hdr, "</D:responsedescription>" DEBUG_CR);
+ }
- ap_text_append(p, &hdr, "</D:propstat>" DEBUG_CR);
+ ap_text_append(p, &hdr, "</D:propstat>" DEBUG_CR);
}
return hdr.first;
@@ -1989,22 +2006,22 @@
dav_prop_ctx *ctx = (dav_prop_ctx *)prop_ctx->elts;
/*
- ** ### we probably need to revise the way we assemble the response...
- ** ### this code assumes everything will return status==200.
- */
+ * ### we probably need to revise the way we assemble the response...
+ * ### this code assumes everything will return status==200.
+ */
ap_text_append(p, &hdr,
- "<D:propstat>" DEBUG_CR
- "<D:prop>" DEBUG_CR);
+ "<D:propstat>" DEBUG_CR
+ "<D:prop>" DEBUG_CR);
for ( ; i-- > 0; ++ctx ) {
- ap_text_append(p, &hdr, ap_xml_empty_elem(p, ctx->prop));
+ ap_text_append(p, &hdr, ap_xml_empty_elem(p, ctx->prop));
}
ap_text_append(p, &hdr,
- "</D:prop>" DEBUG_CR
- "<D:status>HTTP/1.1 200 OK</D:status>" DEBUG_CR
- "</D:propstat>" DEBUG_CR);
+ "</D:prop>" DEBUG_CR
+ "<D:status>HTTP/1.1 200 OK</D:status>" DEBUG_CR
+ "</D:propstat>" DEBUG_CR);
return hdr.first;
}
@@ -2015,36 +2032,36 @@
}
/*
-** Call <func> for each context. This can stop when an error occurs, or
-** simply iterate through the whole list.
-**
-** Returns 1 if an error occurs (and the iteration is aborted). Returns 0
-** if all elements are processed.
-**
-** If <reverse> is true (non-zero), then the list is traversed in
-** reverse order.
-*/
+ * Call <func> for each context. This can stop when an error occurs, or
+ * simply iterate through the whole list.
+ *
+ * Returns 1 if an error occurs (and the iteration is aborted). Returns 0
+ * if all elements are processed.
+ *
+ * If <reverse> is true (non-zero), then the list is traversed in
+ * reverse order.
+ */
static int dav_process_ctx_list(void (*func)(dav_prop_ctx *ctx),
- apr_array_header_t *ctx_list, int stop_on_error,
- int reverse)
+ apr_array_header_t *ctx_list, int stop_on_error,
+ int reverse)
{
int i = ctx_list->nelts;
dav_prop_ctx *ctx = (dav_prop_ctx *)ctx_list->elts;
if (reverse)
- ctx += i;
+ ctx += i;
while (i--) {
- if (reverse)
- --ctx;
+ if (reverse)
+ --ctx;
- (*func)(ctx);
- if (stop_on_error && DAV_PROP_CTX_HAS_ERR(*ctx)) {
- return 1;
- }
+ (*func)(ctx);
+ if (stop_on_error && DAV_PROP_CTX_HAS_ERR(*ctx)) {
+ return 1;
+ }
- if (!reverse)
- ++ctx;
+ if (!reverse)
+ ++ctx;
}
return 0;
@@ -2072,51 +2089,51 @@
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;
+ /* Apache will supply a default error for this. */
+ return HTTP_NOT_FOUND;
}
if ((result = ap_xml_parse_input(r, &doc)) != OK) {
- return result;
+ return result;
}
/* note: doc == NULL if no request body */
if (doc == NULL || !dav_validate_root(doc, "propertyupdate")) {
- /* This supplies additional information for the default message. */
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "The request body does not contain "
- "a \"propertyupdate\" element.");
- return HTTP_BAD_REQUEST;
+ /* This supplies additional information for the default message. */
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "The request body does not contain "
+ "a \"propertyupdate\" element.");
+ return HTTP_BAD_REQUEST;
}
/* Check If-Headers and existing locks */
/* Note: depth == 0. Implies no need for a multistatus response. */
if ((err = dav_validate_request(r, resource, 0, NULL, NULL,
- DAV_VALIDATE_RESOURCE, NULL)) != NULL) {
- /* ### add a higher-level description? */
- return dav_handle_err(r, err, NULL);
+ DAV_VALIDATE_RESOURCE, NULL)) != NULL) {
+ /* ### add a higher-level description? */
+ return dav_handle_err(r, err, NULL);
}
/* make sure the resource can be modified (if versioning repository) */
if ((err = dav_auto_checkout(r, resource,
- 0 /* not parent_only */,
- &av_info)) != NULL) {
- /* ### add a higher-level description? */
- return dav_handle_err(r, err, NULL);
+ 0 /* not parent_only */,
+ &av_info)) != NULL) {
+ /* ### add a higher-level description? */
+ return dav_handle_err(r, err, NULL);
}
if ((err = dav_open_propdb(r, NULL, resource, 0, doc->namespaces,
- &propdb)) != NULL) {
+ &propdb)) != NULL) {
/* undo any auto-checkout */
dav_auto_checkin(r, resource, 1 /*undo*/, 0 /*unlock*/, &av_info);
- err = dav_push_error(r->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
- apr_psprintf(r->pool,
- "Could not open the property "
- "database for %s.",
- ap_escape_html(r->pool, r->uri)),
- err);
- return dav_handle_err(r, err, NULL);
+ err = dav_push_error(r->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
+ apr_psprintf(r->pool,
+ "Could not open the property "
+ "database for %s.",
+ ap_escape_html(r->pool, r->uri)),
+ err);
+ return dav_handle_err(r, err, NULL);
}
/* ### what to do about closing the propdb on server failure? */
@@ -2127,64 +2144,64 @@
/* do a first pass to ensure that all "remove" properties exist */
for (child = doc->root->first_child; child; child = child->next) {
- int is_remove;
- ap_xml_elem *prop_group;
- ap_xml_elem *one_prop;
-
- /* Ignore children that are not set/remove */
- if (child->ns != AP_XML_NS_DAV_ID
- || (!(is_remove = strcmp(child->name, "remove") == 0)
- && strcmp(child->name, "set") != 0)) {
- continue;
- }
-
- /* make sure that a "prop" child exists for set/remove */
- if ((prop_group = dav_find_child(child, "prop")) == NULL) {
- dav_close_propdb(propdb);
+ int is_remove;
+ ap_xml_elem *prop_group;
+ ap_xml_elem *one_prop;
+
+ /* Ignore children that are not set/remove */
+ if (child->ns != AP_XML_NS_DAV_ID
+ || (!(is_remove = strcmp(child->name, "remove") == 0)
+ && strcmp(child->name, "set") != 0)) {
+ continue;
+ }
+
+ /* make sure that a "prop" child exists for set/remove */
+ if ((prop_group = dav_find_child(child, "prop")) == NULL) {
+ dav_close_propdb(propdb);
/* undo any auto-checkout */
dav_auto_checkin(r, resource, 1 /*undo*/, 0 /*unlock*/, &av_info);
- /* This supplies additional information for the default message. */
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "A \"prop\" element is missing inside "
- "the propertyupdate command.");
- return HTTP_BAD_REQUEST;
- }
-
- for (one_prop = prop_group->first_child; one_prop;
- one_prop = one_prop->next) {
-
- ctx = (dav_prop_ctx *)apr_array_push(ctx_list);
- ctx->propdb = propdb;
- ctx->operation = is_remove ? DAV_PROP_OP_DELETE : DAV_PROP_OP_SET;
- ctx->prop = one_prop;
+ /* This supplies additional information for the default message. */
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "A \"prop\" element is missing inside "
+ "the propertyupdate command.");
+ return HTTP_BAD_REQUEST;
+ }
+
+ for (one_prop = prop_group->first_child; one_prop;
+ one_prop = one_prop->next) {
+
+ ctx = (dav_prop_ctx *)apr_array_push(ctx_list);
+ ctx->propdb = propdb;
+ ctx->operation = is_remove ? DAV_PROP_OP_DELETE : DAV_PROP_OP_SET;
+ ctx->prop = one_prop;
ctx->r = r; /* for later use by dav_prop_log_errors() */
- dav_prop_validate(ctx);
+ dav_prop_validate(ctx);
- if ( DAV_PROP_CTX_HAS_ERR(*ctx) ) {
- failure = 1;
- }
- }
+ if ( DAV_PROP_CTX_HAS_ERR(*ctx) ) {
+ failure = 1;
+ }
+ }
}
/* ### should test that we found at least one set/remove */
/* execute all of the operations */
if (!failure && dav_process_ctx_list(dav_prop_exec, ctx_list, 1, 0)) {
- failure = 1;
+ failure = 1;
}
/* generate a failure/success response */
if (failure) {
- (void)dav_process_ctx_list(dav_prop_rollback, ctx_list, 0, 1);
- propstat_text = dav_failed_proppatch(r->pool, ctx_list);
+ (void)dav_process_ctx_list(dav_prop_rollback, ctx_list, 0, 1);
+ propstat_text = dav_failed_proppatch(r->pool, ctx_list);
}
else {
- (void)dav_process_ctx_list(dav_prop_commit, ctx_list, 0, 0);
- propstat_text = dav_success_proppatch(r->pool, ctx_list);
+ (void)dav_process_ctx_list(dav_prop_commit, ctx_list, 0, 0);
+ propstat_text = dav_success_proppatch(r->pool, ctx_list);
}
/* make sure this gets closed! */
@@ -2223,42 +2240,43 @@
r->remaining = 0;
if (tenc) {
- if (strcasecmp(tenc, "chunked")) {
- /* Use this instead of Apache's default error string */
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "Unknown Transfer-Encoding %s", tenc);
- return HTTP_NOT_IMPLEMENTED;
- }
+ if (strcasecmp(tenc, "chunked")) {
+ /* Use this instead of Apache's default error string */
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "Unknown Transfer-Encoding %s", tenc);
+ return HTTP_NOT_IMPLEMENTED;
+ }
- r->read_chunked = 1;
+ r->read_chunked = 1;
}
else if (lenp) {
- const char *pos = lenp;
+ const char *pos = lenp;
- while (apr_isdigit(*pos) || apr_isspace(*pos)) {
- ++pos;
- }
- if (*pos != '\0') {
- /* This supplies additional information for the default message. */
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "Invalid Content-Length %s", lenp);
- return HTTP_BAD_REQUEST;
- }
+ while (apr_isdigit(*pos) || apr_isspace(*pos)) {
+ ++pos;
+ }
- r->remaining = atol(lenp);
+ if (*pos != '\0') {
+ /* This supplies additional information for the default message. */
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "Invalid Content-Length %s", lenp);
+ return HTTP_BAD_REQUEST;
+ }
+
+ r->remaining = atol(lenp);
}
if (r->read_chunked || r->remaining > 0) {
- /* ### log something? */
+ /* ### log something? */
- /* Apache will supply a default error for this. */
- return HTTP_UNSUPPORTED_MEDIA_TYPE;
+ /* Apache will supply a default error for this. */
+ return HTTP_UNSUPPORTED_MEDIA_TYPE;
}
/*
- ** Get rid of the body. this will call ap_setup_client_block(), but
- ** our copy above has already verified its work.
- */
+ * Get rid of the body. this will call ap_setup_client_block(), but
+ * our copy above has already verified its work.
+ */
return ap_discard_request_body(r);
}
@@ -2278,11 +2296,11 @@
/* handle the request body */
/* ### this may move lower once we start processing bodies */
if ((result = process_mkcol_body(r)) != OK) {
- return result;
+ return result;
}
- conf = (dav_dir_conf *) ap_get_module_config(r->per_dir_config,
- &dav_module);
+ conf = (dav_dir_conf *)ap_get_module_config(r->per_dir_config,
+ &dav_module);
/* Ask repository module to resolve the resource */
err = dav_get_resource(r, 0 /* label_allowed */, 0 /* use_checked_in */,
@@ -2291,39 +2309,39 @@
return dav_handle_err(r, err, NULL);
if (resource->exists) {
- /* oops. something was already there! */
+ /* oops. something was already there! */
- /* Apache will supply a default error for this. */
- /* ### we should provide a specific error message! */
- return HTTP_METHOD_NOT_ALLOWED;
+ /* Apache will supply a default error for this. */
+ /* ### we should provide a specific error message! */
+ return HTTP_METHOD_NOT_ALLOWED;
}
resource_state = dav_get_resource_state(r, resource);
/*
- ** Check If-Headers and existing locks.
- **
- ** Note: depth == 0 normally requires no multistatus response. However,
- ** if we pass DAV_VALIDATE_PARENT, then we could get an error on a URI
- ** other than the Request-URI, thereby requiring a multistatus.
- **
- ** If the resource does not exist (DAV_RESOURCE_NULL), then we must
- ** check the resource *and* its parent. If the resource exists or is
- ** a locknull resource, then we check only the resource.
- */
+ * Check If-Headers and existing locks.
+ *
+ * Note: depth == 0 normally requires no multistatus response. However,
+ * if we pass DAV_VALIDATE_PARENT, then we could get an error on a URI
+ * other than the Request-URI, thereby requiring a multistatus.
+ *
+ * If the resource does not exist (DAV_RESOURCE_NULL), then we must
+ * check the resource *and* its parent. If the resource exists or is
+ * a locknull resource, then we check only the resource.
+ */
if ((err = dav_validate_request(r, resource, 0, NULL, &multi_status,
- resource_state == DAV_RESOURCE_NULL ?
- DAV_VALIDATE_PARENT :
- DAV_VALIDATE_RESOURCE, NULL)) != NULL) {
- /* ### add a higher-level description? */
- return dav_handle_err(r, err, multi_status);
+ resource_state == DAV_RESOURCE_NULL ?
+ DAV_VALIDATE_PARENT :
+ DAV_VALIDATE_RESOURCE, NULL)) != NULL) {
+ /* ### add a higher-level description? */
+ return dav_handle_err(r, err, multi_status);
}
/* if versioned resource, make sure parent is checked out */
if ((err = dav_auto_checkout(r, resource, 1 /* parent_only */,
- &av_info)) != NULL) {
- /* ### add a higher-level description? */
- return dav_handle_err(r, err, NULL);
+ &av_info)) != NULL) {
+ /* ### add a higher-level description? */
+ return dav_handle_err(r, err, NULL);
}
/* try to create the collection */
@@ -2332,50 +2350,50 @@
/* restore modifiability of parent back to what it was */
err2 = dav_auto_checkin(r, NULL, err != NULL /* undo if error */,
- 0 /*unlock*/, &av_info);
+ 0 /*unlock*/, &av_info);
/* check for errors now */
if (err != NULL) {
- return dav_handle_err(r, err, NULL);
+ return dav_handle_err(r, err, NULL);
}
if (err2 != NULL) {
- /* just log a warning */
- err = dav_push_error(r->pool, err->status, 0,
- "The MKCOL was successful, but there "
- "was a problem automatically checking in "
- "the parent collection.",
- err2);
- dav_log_err(r, err, APLOG_WARNING);
+ /* just log a warning */
+ err = dav_push_error(r->pool, err->status, 0,
+ "The MKCOL was successful, but there "
+ "was a problem automatically checking in "
+ "the parent collection.",
+ err2);
+ dav_log_err(r, err, APLOG_WARNING);
}
if (locks_hooks != NULL) {
- dav_lockdb *lockdb;
+ dav_lockdb *lockdb;
- if ((err = (*locks_hooks->open_lockdb)(r, 0, 0, &lockdb)) != NULL) {
- /* The directory creation was successful, but the locking failed. */
- err = dav_push_error(r->pool, err->status, 0,
- "The MKCOL was successful, but there "
- "was a problem opening the lock database "
- "which prevents inheriting locks from the "
- "parent resources.",
- err);
- return dav_handle_err(r, err, NULL);
- }
-
- /* notify lock system that we have created/replaced a resource */
- err = dav_notify_created(r, lockdb, resource, resource_state, 0);
-
- (*locks_hooks->close_lockdb)(lockdb);
-
- if (err != NULL) {
- /* The dir creation was successful, but the locking failed. */
- err = dav_push_error(r->pool, err->status, 0,
- "The MKCOL was successful, but there "
- "was a problem updating its lock "
- "information.",
- err);
- return dav_handle_err(r, err, NULL);
- }
+ if ((err = (*locks_hooks->open_lockdb)(r, 0, 0, &lockdb)) != NULL) {
+ /* The directory creation was successful, but the locking failed. */
+ err = dav_push_error(r->pool, err->status, 0,
+ "The MKCOL was successful, but there "
+ "was a problem opening the lock database "
+ "which prevents inheriting locks from the "
+ "parent resources.",
+ err);
+ return dav_handle_err(r, err, NULL);
+ }
+
+ /* notify lock system that we have created/replaced a resource */
+ err = dav_notify_created(r, lockdb, resource, resource_state, 0);
+
+ (*locks_hooks->close_lockdb)(lockdb);
+
+ if (err != NULL) {
+ /* The dir creation was successful, but the locking failed. */
+ err = dav_push_error(r->pool, err->status, 0,
+ "The MKCOL was successful, but there "
+ "was a problem updating its lock "
+ "information.",
+ err);
+ return dav_handle_err(r, err, NULL);
+ }
}
/* return an appropriate response (HTTP_CREATED) */
@@ -2409,55 +2427,56 @@
0 /* use_checked_in */, &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;
+ /* Apache will supply a default error for this. */
+ return HTTP_NOT_FOUND;
}
/* If not a file or collection resource, COPY/MOVE not allowed */
/* ### allow COPY/MOVE of DeltaV resource types */
if (resource->type != DAV_RESOURCE_TYPE_REGULAR) {
body = apr_psprintf(r->pool,
- "Cannot COPY/MOVE resource %s.",
- ap_escape_html(r->pool, r->uri));
- return dav_error_response(r, HTTP_METHOD_NOT_ALLOWED, body);
+ "Cannot COPY/MOVE resource %s.",
+ ap_escape_html(r->pool, r->uri));
+ return dav_error_response(r, HTTP_METHOD_NOT_ALLOWED, body);
}
/* get the destination URI */
dest = apr_table_get(r->headers_in, "Destination");
if (dest == NULL) {
- /* Look in headers provided by Netscape's Roaming Profiles */
- const char *nscp_host = apr_table_get(r->headers_in, "Host");
- const char *nscp_path = apr_table_get(r->headers_in, "New-uri");
+ /* Look in headers provided by Netscape's Roaming Profiles */
+ const char *nscp_host = apr_table_get(r->headers_in, "Host");
+ const char *nscp_path = apr_table_get(r->headers_in, "New-uri");
- if (nscp_host != NULL && nscp_path != NULL)
- dest = apr_psprintf(r->pool, "http://%s%s", nscp_host, nscp_path);
+ if (nscp_host != NULL && nscp_path != NULL)
+ dest = apr_psprintf(r->pool, "http://%s%s", nscp_host, nscp_path);
}
if (dest == NULL) {
- /* This supplies additional information for the default message. */
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "The request is missing a Destination header.");
- return HTTP_BAD_REQUEST;
+ /* This supplies additional information for the default message. */
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "The request is missing a Destination header.");
+ return HTTP_BAD_REQUEST;
}
lookup = dav_lookup_uri(dest, r, 1 /* must_be_absolute */);
if (lookup.rnew == NULL) {
- if (lookup.err.status == HTTP_BAD_REQUEST) {
- /* This supplies additional information for the default message. */
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- lookup.err.desc);
- return HTTP_BAD_REQUEST;
- }
+ if (lookup.err.status == HTTP_BAD_REQUEST) {
+ /* This supplies additional information for the default message. */
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ lookup.err.desc);
+ return HTTP_BAD_REQUEST;
+ }
- /* ### this assumes that dav_lookup_uri() only generates a status
- * ### that Apache can provide a status line for!! */
+ /* ### this assumes that dav_lookup_uri() only generates a status
+ * ### that Apache can provide a status line for!! */
- return dav_error_response(r, lookup.err.status, lookup.err.desc);
+ return dav_error_response(r, lookup.err.status, lookup.err.desc);
}
if (lookup.rnew->status != HTTP_OK) {
- /* ### how best to report this... */
- return dav_error_response(r, lookup.rnew->status,
- "Destination URI had an error.");
+ /* ### how best to report this... */
+ return dav_error_response(r, lookup.rnew->status,
+ "Destination URI had an error.");
}
/* Resolve destination resource */
@@ -2468,33 +2487,33 @@
/* are the two resources handled by the same repository? */
if (resource->hooks != resnew->hooks) {
- /* ### this message exposes some backend config, but screw it... */
- return dav_error_response(r, HTTP_BAD_GATEWAY,
- "Destination URI is handled by a "
- "different repository than the source URI. "
- "MOVE or COPY between repositories is "
- "not possible.");
+ /* ### this message exposes some backend config, but screw it... */
+ return dav_error_response(r, HTTP_BAD_GATEWAY,
+ "Destination URI is handled by a "
+ "different repository than the source URI. "
+ "MOVE or COPY between repositories is "
+ "not possible.");
}
/* get and parse the overwrite header value */
if ((overwrite = dav_get_overwrite(r)) < 0) {
- /* dav_get_overwrite() supplies additional information for the
- * default message. */
- return HTTP_BAD_REQUEST;
+ /* dav_get_overwrite() supplies additional information for the
+ * default message. */
+ return HTTP_BAD_REQUEST;
}
/* quick failure test: if dest exists and overwrite is false. */
if (resnew->exists && !overwrite) {
- /* Supply some text for the error response body. */
- return dav_error_response(r, HTTP_PRECONDITION_FAILED,
+ /* Supply some text for the error response body. */
+ return dav_error_response(r, HTTP_PRECONDITION_FAILED,
"Destination is not empty and "
"Overwrite is not \"T\"");
}
/* are the source and destination the same? */
if ((*resource->hooks->is_same_resource)(resource, resnew)) {
- /* Supply some text for the error response body. */
- return dav_error_response(r, HTTP_FORBIDDEN,
+ /* Supply some text for the error response body. */
+ return dav_error_response(r, HTTP_FORBIDDEN,
"Source and Destination URIs are the same.");
}
@@ -2503,135 +2522,135 @@
/* get and parse the Depth header value. "0" and "infinity" are legal. */
if ((depth = dav_get_depth(r, DAV_INFINITY)) < 0) {
- /* dav_get_depth() supplies additional information for the
- * default message. */
- return HTTP_BAD_REQUEST;
+ /* dav_get_depth() supplies additional information for the
+ * default message. */
+ return HTTP_BAD_REQUEST;
}
if (depth == 1) {
- /* This supplies additional information for the default message. */
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "Depth must be \"0\" or \"infinity\" for COPY or MOVE.");
- return HTTP_BAD_REQUEST;
+ /* This supplies additional information for the default message. */
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "Depth must be \"0\" or \"infinity\" for COPY or MOVE.");
+ return HTTP_BAD_REQUEST;
}
if (is_move && is_dir && depth != DAV_INFINITY) {
- /* This supplies additional information for the default message. */
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "Depth must be \"infinity\" when moving a collection.");
- return HTTP_BAD_REQUEST;
+ /* This supplies additional information for the default message. */
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "Depth must be \"infinity\" when moving a collection.");
+ return HTTP_BAD_REQUEST;
}
/*
- ** Check If-Headers and existing locks for each resource in the source
- ** if we are performing a MOVE. We will return a 424 response with a
- ** DAV:multistatus body. The multistatus responses will contain the
- ** information about any resource that fails the validation.
- **
- ** We check the parent resource, too, since this is a MOVE. Moving the
- ** resource effectively removes it from the parent collection, so we
- ** must ensure that we have met the appropriate conditions.
- **
- ** If a problem occurs with the Request-URI itself, then a plain error
- ** (rather than a multistatus) will be returned.
- */
+ * Check If-Headers and existing locks for each resource in the source
+ * if we are performing a MOVE. We will return a 424 response with a
+ * DAV:multistatus body. The multistatus responses will contain the
+ * information about any resource that fails the validation.
+ *
+ * We check the parent resource, too, since this is a MOVE. Moving the
+ * resource effectively removes it from the parent collection, so we
+ * must ensure that we have met the appropriate conditions.
+ *
+ * If a problem occurs with the Request-URI itself, then a plain error
+ * (rather than a multistatus) will be returned.
+ */
if (is_move
- && (err = dav_validate_request(r, resource, depth, NULL,
- &multi_response,
- DAV_VALIDATE_PARENT
+ && (err = dav_validate_request(r, resource, depth, NULL,
+ &multi_response,
+ DAV_VALIDATE_PARENT
| DAV_VALIDATE_USE_424,
NULL)) != NULL) {
- err = dav_push_error(r->pool, err->status, 0,
- apr_psprintf(r->pool,
- "Could not MOVE %s due to a failed "
- "precondition on the source "
- "(e.g. locks).",
- ap_escape_html(r->pool, r->uri)),
- err);
- return dav_handle_err(r, err, multi_response);
+ err = dav_push_error(r->pool, err->status, 0,
+ apr_psprintf(r->pool,
+ "Could not MOVE %s due to a failed "
+ "precondition on the source "
+ "(e.g. locks).",
+ ap_escape_html(r->pool, r->uri)),
+ err);
+ return dav_handle_err(r, err, multi_response);
}
/*
- ** Check If-Headers and existing locks for destination. Note that we
- ** use depth==infinity since the target (hierarchy) will be deleted
- ** before the move/copy is completed.
- **
- ** Note that we are overwriting the target, which implies a DELETE, so
- ** we are subject to the error/response rules as a DELETE. Namely, we
- ** will return a 424 error if any of the validations fail.
- ** (see dav_method_delete() for more information)
- */
+ * Check If-Headers and existing locks for destination. Note that we
+ * use depth==infinity since the target (hierarchy) will be deleted
+ * before the move/copy is completed.
+ *
+ * Note that we are overwriting the target, which implies a DELETE, so
+ * we are subject to the error/response rules as a DELETE. Namely, we
+ * will return a 424 error if any of the validations fail.
+ * (see dav_method_delete() for more information)
+ */
if ((err = dav_validate_request(lookup.rnew, resnew, DAV_INFINITY, NULL,
- &multi_response,
- DAV_VALIDATE_PARENT
+ &multi_response,
+ DAV_VALIDATE_PARENT
| DAV_VALIDATE_USE_424, NULL)) != NULL) {
- err = dav_push_error(r->pool, err->status, 0,
- apr_psprintf(r->pool,
- "Could not MOVE/COPY %s due to a "
- "failed precondition on the "
- "destination (e.g. locks).",
- ap_escape_html(r->pool, r->uri)),
- err);
- return dav_handle_err(r, err, multi_response);
+ err = dav_push_error(r->pool, err->status, 0,
+ apr_psprintf(r->pool,
+ "Could not MOVE/COPY %s due to a "
+ "failed precondition on the "
+ "destination (e.g. locks).",
+ ap_escape_html(r->pool, r->uri)),
+ err);
+ return dav_handle_err(r, err, multi_response);
}
if (is_dir
- && depth == DAV_INFINITY
- && (*resource->hooks->is_parent_resource)(resource, resnew)) {
- /* Supply some text for the error response body. */
- return dav_error_response(r, HTTP_FORBIDDEN,
+ && depth == DAV_INFINITY
+ && (*resource->hooks->is_parent_resource)(resource, resnew)) {
+ /* Supply some text for the error response body. */
+ return dav_error_response(r, HTTP_FORBIDDEN,
"Source collection contains the "
"Destination.");
}
if (is_dir
- && (*resnew->hooks->is_parent_resource)(resnew, resource)) {
- /* The destination must exist (since it contains the source), and
- * a condition above implies Overwrite==T. Obviously, we cannot
- * delete the Destination before the MOVE/COPY, as that would
- * delete the Source.
- */
+ && (*resnew->hooks->is_parent_resource)(resnew, resource)) {
+ /* The destination must exist (since it contains the source), and
+ * a condition above implies Overwrite==T. Obviously, we cannot
+ * delete the Destination before the MOVE/COPY, as that would
+ * delete the Source.
+ */
- /* Supply some text for the error response body. */
- return dav_error_response(r, HTTP_FORBIDDEN,
+ /* Supply some text for the error response body. */
+ return dav_error_response(r, HTTP_FORBIDDEN,
"Destination collection contains the Source "
"and Overwrite has been specified.");
}
/* ### for now, we don't need anything in the body */
if ((result = ap_discard_request_body(r)) != OK) {
- return result;
+ return result;
}
if ((err = dav_open_lockdb(r, 0, &lockdb)) != NULL) {
- /* ### add a higher-level description? */
- return dav_handle_err(r, err, NULL);
+ /* ### add a higher-level description? */
+ return dav_handle_err(r, err, NULL);
}
/* remove any locks from the old resources */
/*
- ** ### this is Yet Another Traversal. if we do a rename(), then we
- ** ### really don't have to do this in some cases since the inode
- ** ### values will remain constant across the move. but we can't
- ** ### know that fact from outside the provider :-(
- **
- ** ### note that we now have a problem atomicity in the move/copy
- ** ### since a failure after this would have removed locks (technically,
- ** ### this is okay to do, but really...)
- */
+ * ### this is Yet Another Traversal. if we do a rename(), then we
+ * ### really don't have to do this in some cases since the inode
+ * ### values will remain constant across the move. but we can't
+ * ### know that fact from outside the provider :-(
+ *
+ * ### note that we now have a problem atomicity in the move/copy
+ * ### since a failure after this would have removed locks (technically,
+ * ### this is okay to do, but really...)
+ */
if (is_move && lockdb != NULL) {
- /* ### this is wrong! it blasts direct locks on parent resources */
- /* ### pass lockdb! */
- (void)dav_unlock(r, resource, NULL);
+ /* ### this is wrong! it blasts direct locks on parent resources */
+ /* ### pass lockdb! */
+ (void)dav_unlock(r, resource, NULL);
}
/* if this is a move, then the source parent collection will be modified */
if (is_move) {
if ((err = dav_auto_checkout(r, resource, 1 /* parent_only */,
- &src_av_info)) != NULL) {
- if (lockdb != NULL)
- (*lockdb->hooks->close_lockdb)(lockdb);
+ &src_av_info)) != NULL) {
+ if (lockdb != NULL)
+ (*lockdb->hooks->close_lockdb)(lockdb);
- /* ### add a higher-level description? */
- return dav_handle_err(r, err, NULL);
+ /* ### add a higher-level description? */
+ return dav_handle_err(r, err, NULL);
}
}
@@ -2663,20 +2682,20 @@
*/
if (!resnew->exists || replace_dest) {
if ((err = dav_auto_checkout(r, resnew, 1 /*parent_only*/,
- &dst_av_info)) != NULL) {
+ &dst_av_info)) != NULL) {
/* could not make destination writable:
- * if move, restore state of source parent
- */
+ * if move, restore state of source parent
+ */
if (is_move) {
- (void) dav_auto_checkin(r, NULL, 1 /* undo */,
- 0 /*unlock*/, &src_av_info);
+ (void)dav_auto_checkin(r, NULL, 1 /* undo */,
+ 0 /*unlock*/, &src_av_info);
}
- if (lockdb != NULL)
- (*lockdb->hooks->close_lockdb)(lockdb);
+ if (lockdb != NULL)
+ (*lockdb->hooks->close_lockdb)(lockdb);
- /* ### add a higher-level description? */
- return dav_handle_err(r, err, NULL);
+ /* ### add a higher-level description? */
+ return dav_handle_err(r, err, NULL);
}
}
@@ -2697,78 +2716,78 @@
* (we know Ovewrite must be TRUE). Then try to copy/move the resource.
*/
if (replace_dest)
- err = (*resnew->hooks->remove_resource)(resnew, &multi_response);
+ err = (*resnew->hooks->remove_resource)(resnew, &multi_response);
if (err == NULL) {
- if (is_move)
- err = (*resource->hooks->move_resource)(resource, resnew,
+ if (is_move)
+ err = (*resource->hooks->move_resource)(resource, resnew,
&multi_response);
- else
- err = (*resource->hooks->copy_resource)(resource, resnew, depth,
+ else
+ err = (*resource->hooks->copy_resource)(resource, resnew, depth,
&multi_response);
}
/* perform any auto-versioning cleanup */
err2 = dav_auto_checkin(r, NULL, err != NULL /* undo if error */,
- 0 /*unlock*/, &dst_av_info);
+ 0 /*unlock*/, &dst_av_info);
if (is_move) {
err3 = dav_auto_checkin(r, NULL, err != NULL /* undo if error */,
- 0 /*unlock*/, &src_av_info);
+ 0 /*unlock*/, &src_av_info);
}
else
- err3 = NULL;
+ err3 = NULL;
/* check for error from remove/copy/move operations */
if (err != NULL) {
- if (lockdb != NULL)
- (*lockdb->hooks->close_lockdb)(lockdb);
+ if (lockdb != NULL)
+ (*lockdb->hooks->close_lockdb)(lockdb);
- err = dav_push_error(r->pool, err->status, 0,
- apr_psprintf(r->pool,
- "Could not MOVE/COPY %s.",
- ap_escape_html(r->pool, r->uri)),
- err);
- return dav_handle_err(r, err, multi_response);
+ err = dav_push_error(r->pool, err->status, 0,
+ apr_psprintf(r->pool,
+ "Could not MOVE/COPY %s.",
+ ap_escape_html(r->pool, r->uri)),
+ err);
+ return dav_handle_err(r, err, multi_response);
}
/* check for errors from auto-versioning */
if (err2 != NULL) {
- /* just log a warning */
- err = dav_push_error(r->pool, err2->status, 0,
- "The MOVE/COPY was successful, but there was a "
- "problem automatically checking in the "
- "source parent collection.",
- err2);
- dav_log_err(r, err, APLOG_WARNING);
+ /* just log a warning */
+ err = dav_push_error(r->pool, err2->status, 0,
+ "The MOVE/COPY was successful, but there was a "
+ "problem automatically checking in the "
+ "source parent collection.",
+ err2);
+ dav_log_err(r, err, APLOG_WARNING);
}
if (err3 != NULL) {
- /* just log a warning */
- err = dav_push_error(r->pool, err3->status, 0,
- "The MOVE/COPY was successful, but there was a "
- "problem automatically checking in the "
- "destination or its parent collection.",
- err3);
- dav_log_err(r, err, APLOG_WARNING);
+ /* just log a warning */
+ err = dav_push_error(r->pool, err3->status, 0,
+ "The MOVE/COPY was successful, but there was a "
+ "problem automatically checking in the "
+ "destination or its parent collection.",
+ err3);
+ dav_log_err(r, err, APLOG_WARNING);
}
/* propagate any indirect locks at the target */
if (lockdb != NULL) {
- /* notify lock system that we have created/replaced a resource */
- err = dav_notify_created(r, lockdb, resnew, resnew_state, depth);
+ /* notify lock system that we have created/replaced a resource */
+ err = dav_notify_created(r, lockdb, resnew, resnew_state, depth);
- (*lockdb->hooks->close_lockdb)(lockdb);
+ (*lockdb->hooks->close_lockdb)(lockdb);
- if (err != NULL) {
- /* The move/copy was successful, but the locking failed. */
- err = dav_push_error(r->pool, err->status, 0,
- "The MOVE/COPY was successful, but there "
- "was a problem updating the lock "
- "information.",
- err);
- return dav_handle_err(r, err, NULL);
- }
+ if (err != NULL) {
+ /* The move/copy was successful, but the locking failed. */
+ err = dav_push_error(r->pool, err->status, 0,
+ "The MOVE/COPY was successful, but there "
+ "was a problem updating the lock "
+ "information.",
+ err);
+ return dav_handle_err(r, err, NULL);
+ }
}
/* return an appropriate response (HTTP_CREATED or HTTP_NO_CONTENT) */
@@ -2777,8 +2796,8 @@
}
/* dav_method_lock: Handler to implement the DAV LOCK method
-** Returns appropriate HTTP_* response.
-*/
+ * Returns appropriate HTTP_* response.
+ */
static int dav_method_lock(request_rec *r)
{
dav_error *err;
@@ -2799,13 +2818,13 @@
return DECLINED;
if ((result = ap_xml_parse_input(r, &doc)) != OK)
- return result;
+ return result;
depth = dav_get_depth(r, DAV_INFINITY);
if (depth != 0 && depth != DAV_INFINITY) {
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "Depth must be 0 or \"infinity\" for LOCK.");
- return HTTP_BAD_REQUEST;
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "Depth must be 0 or \"infinity\" for LOCK.");
+ return HTTP_BAD_REQUEST;
}
/* Ask repository module to resolve the resource */
@@ -2815,18 +2834,18 @@
return dav_handle_err(r, err, NULL);
/*
- ** Open writable. Unless an error occurs, we'll be
- ** writing into the database.
- */
+ * Open writable. Unless an error occurs, we'll be
+ * writing into the database.
+ */
if ((err = (*locks_hooks->open_lockdb)(r, 0, 0, &lockdb)) != NULL) {
- /* ### add a higher-level description? */
- return dav_handle_err(r, err, NULL);
+ /* ### add a higher-level description? */
+ return dav_handle_err(r, err, NULL);
}
if (doc != NULL) {
if ((err = dav_lock_parse_lockinfo(r, resource, lockdb, doc,
- &lock)) != NULL) {
- /* ### add a higher-level description to err? */
+ &lock)) != NULL) {
+ /* ### add a higher-level description to err? */
goto error;
}
new_lock_request = 1;
@@ -2837,12 +2856,12 @@
resource_state = dav_get_resource_state(r, resource);
/*
- ** Check If-Headers and existing locks.
- **
- ** If this will create a locknull resource, then the LOCK will affect
- ** the parent collection (much like a PUT/MKCOL). For that case, we must
- ** validate the parent resource's conditions.
- */
+ * Check If-Headers and existing locks.
+ *
+ * If this will create a locknull resource, then the LOCK will affect
+ * the parent collection (much like a PUT/MKCOL). For that case, we must
+ * validate the parent resource's conditions.
+ */
if ((err = dav_validate_request(r, resource, depth, NULL, &multi_response,
(resource_state == DAV_RESOURCE_NULL
? DAV_VALIDATE_PARENT
@@ -2850,68 +2869,69 @@
| (new_lock_request ? lock->scope : 0)
| DAV_VALIDATE_ADD_LD,
lockdb)) != OK) {
- err = dav_push_error(r->pool, err->status, 0,
- apr_psprintf(r->pool,
- "Could not LOCK %s due to a failed "
- "precondition (e.g. other locks).",
- ap_escape_html(r->pool, r->uri)),
- err);
- goto error;
+ err = dav_push_error(r->pool, err->status, 0,
+ apr_psprintf(r->pool,
+ "Could not LOCK %s due to a failed "
+ "precondition (e.g. other locks).",
+ ap_escape_html(r->pool, r->uri)),
+ err);
+ goto error;
}
if (new_lock_request == 0) {
- dav_locktoken_list *ltl;
-
- /*
- ** Refresh request
- ** ### Assumption: We can renew multiple locks on the same resource
- ** ### at once. First harvest all the positive lock-tokens given in
- ** ### the If header. Then modify the lock entries for this resource
- ** ### with the new Timeout val.
- */
-
- if ((err = dav_get_locktoken_list(r, <l)) != NULL) {
- err = dav_push_error(r->pool, err->status, 0,
- apr_psprintf(r->pool,
- "The lock refresh for %s failed "
- "because no lock tokens were "
- "specified in an \"If:\" "
- "header.",
- ap_escape_html(r->pool, r->uri)),
- err);
- goto error;
- }
-
- if ((err = (*locks_hooks->refresh_locks)(lockdb, resource, ltl,
- dav_get_timeout(r),
- &lock)) != NULL) {
- /* ### add a higher-level description to err? */
- goto error;
- }
+ dav_locktoken_list *ltl;
+
+ /*
+ * Refresh request
+ * ### Assumption: We can renew multiple locks on the same resource
+ * ### at once. First harvest all the positive lock-tokens given in
+ * ### the If header. Then modify the lock entries for this resource
+ * ### with the new Timeout val.
+ */
+
+ if ((err = dav_get_locktoken_list(r, <l)) != NULL) {
+ err = dav_push_error(r->pool, err->status, 0,
+ apr_psprintf(r->pool,
+ "The lock refresh for %s failed "
+ "because no lock tokens were "
+ "specified in an \"If:\" "
+ "header.",
+ ap_escape_html(r->pool, r->uri)),
+ err);
+ goto error;
+ }
+
+ if ((err = (*locks_hooks->refresh_locks)(lockdb, resource, ltl,
+ dav_get_timeout(r),
+ &lock)) != NULL) {
+ /* ### add a higher-level description to err? */
+ goto error;
+ }
} else {
- /* New lock request */
+ /* New lock request */
char *locktoken_txt;
- dav_dir_conf *conf;
+ dav_dir_conf *conf;
- conf = (dav_dir_conf *) ap_get_module_config(r->per_dir_config,
- &dav_module);
+ conf = (dav_dir_conf *)ap_get_module_config(r->per_dir_config,
+ &dav_module);
- /* apply lower bound (if any) from DAVMinTimeout directive */
- if (lock->timeout != DAV_TIMEOUT_INFINITE
+ /* apply lower bound (if any) from DAVMinTimeout directive */
+ if (lock->timeout != DAV_TIMEOUT_INFINITE
&& lock->timeout < time(NULL) + conf->locktimeout)
- lock->timeout = time(NULL) + conf->locktimeout;
+ lock->timeout = time(NULL) + conf->locktimeout;
err = dav_add_lock(r, resource, lockdb, lock, &multi_response);
- if (err != NULL) {
- /* ### add a higher-level description to err? */
- goto error;
- }
+ if (err != NULL) {
+ /* ### add a higher-level description to err? */
+ goto error;
+ }
locktoken_txt = apr_pstrcat(r->pool, "<",
- (*locks_hooks->format_locktoken)(r->pool, lock->locktoken),
- ">", NULL);
+ (*locks_hooks->format_locktoken)(r->pool,
+ lock->locktoken),
+ ">", NULL);
- apr_table_set(r->headers_out, "Lock-Token", locktoken_txt);
+ apr_table_set(r->headers_out, "Lock-Token", locktoken_txt);
}
(*locks_hooks->close_lockdb)(lockdb);
@@ -2921,13 +2941,13 @@
ap_rputs(DAV_XML_HEADER DEBUG_CR "<D:prop xmlns:D=\"DAV:\">" DEBUG_CR, r);
if (lock == NULL)
- ap_rputs("<D:lockdiscovery/>" DEBUG_CR, r);
+ ap_rputs("<D:lockdiscovery/>" DEBUG_CR, r);
else {
- ap_rprintf(r,
- "<D:lockdiscovery>" DEBUG_CR
- "%s" DEBUG_CR
- "</D:lockdiscovery>" DEBUG_CR,
- dav_lock_get_activelock(r, lock, NULL));
+ ap_rprintf(r,
+ "<D:lockdiscovery>" DEBUG_CR
+ "%s" DEBUG_CR
+ "</D:lockdiscovery>" DEBUG_CR,
+ dav_lock_get_activelock(r, lock, NULL));
}
ap_rputs("</D:prop>", r);
@@ -2959,35 +2979,37 @@
if (locks_hooks == NULL)
return DECLINED;
- if ((const_locktoken_txt = apr_table_get(r->headers_in, "Lock-Token")) == NULL) {
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "Unlock failed (%s): No Lock-Token specified in header", r->filename);
- return HTTP_BAD_REQUEST;
+ if ((const_locktoken_txt = apr_table_get(r->headers_in,
+ "Lock-Token")) == NULL) {
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "Unlock failed (%s): "
+ "No Lock-Token specified in header", r->filename);
+ return HTTP_BAD_REQUEST;
}
locktoken_txt = apr_pstrdup(r->pool, const_locktoken_txt);
if (locktoken_txt[0] != '<') {
- /* ### should provide more specifics... */
- return HTTP_BAD_REQUEST;
+ /* ### should provide more specifics... */
+ return HTTP_BAD_REQUEST;
}
locktoken_txt++;
if (locktoken_txt[strlen(locktoken_txt) - 1] != '>') {
- /* ### should provide more specifics... */
- return HTTP_BAD_REQUEST;
+ /* ### should provide more specifics... */
+ return HTTP_BAD_REQUEST;
}
locktoken_txt[strlen(locktoken_txt) - 1] = '\0';
-
+
if ((err = (*locks_hooks->parse_locktoken)(r->pool, locktoken_txt,
- &locktoken)) != NULL) {
- err = dav_push_error(r->pool, HTTP_BAD_REQUEST, 0,
- apr_psprintf(r->pool,
- "The UNLOCK on %s failed -- an "
- "invalid lock token was specified "
- "in the \"If:\" header.",
- ap_escape_html(r->pool, r->uri)),
- err);
- return dav_handle_err(r, err, NULL);
+ &locktoken)) != NULL) {
+ err = dav_push_error(r->pool, HTTP_BAD_REQUEST, 0,
+ apr_psprintf(r->pool,
+ "The UNLOCK on %s failed -- an "
+ "invalid lock token was specified "
+ "in the \"If:\" header.",
+ ap_escape_html(r->pool, r->uri)),
+ err);
+ return dav_handle_err(r, err, NULL);
}
/* Ask repository module to resolve the resource */
@@ -2999,35 +3021,35 @@
resource_state = dav_get_resource_state(r, resource);
/*
- ** Check If-Headers and existing locks.
- **
- ** Note: depth == 0 normally requires no multistatus response. However,
- ** if we pass DAV_VALIDATE_PARENT, then we could get an error on a URI
- ** other than the Request-URI, thereby requiring a multistatus.
- **
- ** If the resource is a locknull resource, then the UNLOCK will affect
- ** the parent collection (much like a delete). For that case, we must
- ** validate the parent resource's conditions.
- */
+ * Check If-Headers and existing locks.
+ *
+ * Note: depth == 0 normally requires no multistatus response. However,
+ * if we pass DAV_VALIDATE_PARENT, then we could get an error on a URI
+ * other than the Request-URI, thereby requiring a multistatus.
+ *
+ * If the resource is a locknull resource, then the UNLOCK will affect
+ * the parent collection (much like a delete). For that case, we must
+ * validate the parent resource's conditions.
+ */
if ((err = dav_validate_request(r, resource, 0, locktoken,
&multi_response,
resource_state == DAV_RESOURCE_LOCK_NULL
? DAV_VALIDATE_PARENT
: DAV_VALIDATE_RESOURCE, NULL)) != NULL) {
- /* ### add a higher-level description? */
- return dav_handle_err(r, err, multi_response);
+ /* ### add a higher-level description? */
+ return dav_handle_err(r, err, multi_response);
}
/* ### RFC 2518 s. 8.11: If this resource is locked by locktoken,
* _all_ resources locked by locktoken are released. It does not say
* resource has to be the root of an infinte lock. Thus, an UNLOCK
* on any part of an infinte lock will remove the lock on all resources.
- *
+ *
* For us, if r->filename represents an indirect lock (part of an infinity lock),
* we must actually perform an UNLOCK on the direct lock for this resource.
- */
+ */
if ((result = dav_unlock(r, resource, locktoken)) != OK) {
- return result;
+ return result;
}
return HTTP_NO_CONTENT;
@@ -3060,7 +3082,7 @@
/* parse the request body (may be a version-control element) */
if ((result = ap_xml_parse_input(r, &doc)) != OK) {
- return result;
+ return result;
}
/* note: doc == NULL if no request body */
@@ -3069,34 +3091,34 @@
apr_size_t tsize;
if (!dav_validate_root(doc, "version-control")) {
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "The request body does not contain "
- "a \"version-control\" element.");
- return HTTP_BAD_REQUEST;
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "The request body does not contain "
+ "a \"version-control\" element.");
+ return HTTP_BAD_REQUEST;
}
/* get the version URI */
if ((child = dav_find_child(doc->root, "version")) == NULL) {
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "The \"version-control\" element does not contain "
- "a \"version\" element.");
- return HTTP_BAD_REQUEST;
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "The \"version-control\" element does not contain "
+ "a \"version\" element.");
+ return HTTP_BAD_REQUEST;
}
if ((child = dav_find_child(child, "href")) == NULL) {
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "The \"version\" element does not contain "
- "an \"href\" element.");
- return HTTP_BAD_REQUEST;
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "The \"version\" element does not contain "
+ "an \"href\" element.");
+ return HTTP_BAD_REQUEST;
}
/* get version URI */
ap_xml_to_text(r->pool, child, AP_XML_X2T_INNER, NULL, NULL,
&target, &tsize);
if (tsize == 0) {
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "An \"href\" element does not contain a URI.");
- return HTTP_BAD_REQUEST;
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "An \"href\" element does not contain a URI.");
+ return HTTP_BAD_REQUEST;
}
}
@@ -3110,14 +3132,14 @@
if (!resource->exists && target == NULL) {
err = dav_new_error(r->pool, HTTP_CONFLICT, 0,
"<DAV:initial-version-required/>");
- return dav_handle_err(r, err, NULL);
+ return dav_handle_err(r, err, NULL);
}
else if (resource->exists) {
/* cannot add resource to existing version history */
if (target != NULL) {
err = dav_new_error(r->pool, HTTP_CONFLICT, 0,
"<DAV:cannot-add-to-existing-history/>");
- return dav_handle_err(r, err, NULL);
+ return dav_handle_err(r, err, NULL);
}
/* resource must be unversioned and versionable, or version selector */
@@ -3125,7 +3147,7 @@
|| (!resource->versioned && !(vsn_hooks->versionable)(resource))) {
err = dav_new_error(r->pool, HTTP_CONFLICT, 0,
"<DAV:must-be-versionable/>");
- return dav_handle_err(r, err, NULL);
+ return dav_handle_err(r, err, NULL);
}
/* the DeltaV spec says if resource is a version selector,
@@ -3145,26 +3167,26 @@
/* Check If-Headers and existing locks */
/* Note: depth == 0. Implies no need for a multistatus response. */
if ((err = dav_validate_request(r, resource, 0, NULL, NULL,
- resource_state == DAV_RESOURCE_NULL ?
- DAV_VALIDATE_PARENT :
- DAV_VALIDATE_RESOURCE, NULL)) != NULL) {
- return dav_handle_err(r, err, NULL);
+ resource_state == DAV_RESOURCE_NULL ?
+ DAV_VALIDATE_PARENT :
+ DAV_VALIDATE_RESOURCE, NULL)) != NULL) {
+ return dav_handle_err(r, err, NULL);
}
/* if in versioned collection, make sure parent is checked out */
if ((err = dav_auto_checkout(r, resource, 1 /* parent_only */,
- &av_info)) != NULL) {
- return dav_handle_err(r, err, NULL);
+ &av_info)) != NULL) {
+ return dav_handle_err(r, err, NULL);
}
/* attempt to version-control the resource */
if ((err = (*vsn_hooks->vsn_control)(resource, target)) != NULL) {
dav_auto_checkin(r, resource, 1 /*undo*/, 0 /*unlock*/, &av_info);
- err = dav_push_error(r->pool, HTTP_CONFLICT, 0,
- apr_psprintf(r->pool,
- "Could not VERSION-CONTROL resource %s.",
- ap_escape_html(r->pool, r->uri)),
- err);
+ err = dav_push_error(r->pool, HTTP_CONFLICT, 0,
+ apr_psprintf(r->pool,
+ "Could not VERSION-CONTROL resource %s.",
+ ap_escape_html(r->pool, r->uri)),
+ err);
return dav_handle_err(r, err, NULL);
}
@@ -3172,44 +3194,44 @@
err = dav_auto_checkin(r, resource, 0 /*undo*/, 0 /*unlock*/, &av_info);
if (err != NULL) {
/* just log a warning */
- err = dav_push_error(r->pool, err->status, 0,
- "The VERSION-CONTROL was successful, but there "
- "was a problem automatically checking in "
- "the parent collection.",
- err);
+ err = dav_push_error(r->pool, err->status, 0,
+ "The VERSION-CONTROL was successful, but there "
+ "was a problem automatically checking in "
+ "the parent collection.",
+ err);
dav_log_err(r, err, APLOG_WARNING);
}
/* if the resource is lockable, let lock system know of new resource */
if (locks_hooks != NULL
- && (*locks_hooks->get_supportedlock)(resource) != NULL) {
- dav_lockdb *lockdb;
+ && (*locks_hooks->get_supportedlock)(resource) != NULL) {
+ dav_lockdb *lockdb;
- if ((err = (*locks_hooks->open_lockdb)(r, 0, 0, &lockdb)) != NULL) {
- /* The resource creation was successful, but the locking failed. */
- err = dav_push_error(r->pool, err->status, 0,
- "The VERSION-CONTROL was successful, but there "
- "was a problem opening the lock database "
- "which prevents inheriting locks from the "
- "parent resources.",
- err);
- return dav_handle_err(r, err, NULL);
- }
-
- /* notify lock system that we have created/replaced a resource */
- err = dav_notify_created(r, lockdb, resource, resource_state, 0);
-
- (*locks_hooks->close_lockdb)(lockdb);
-
- if (err != NULL) {
- /* The dir creation was successful, but the locking failed. */
- err = dav_push_error(r->pool, err->status, 0,
- "The VERSION-CONTROL was successful, but there "
- "was a problem updating its lock "
- "information.",
- err);
- return dav_handle_err(r, err, NULL);
- }
+ if ((err = (*locks_hooks->open_lockdb)(r, 0, 0, &lockdb)) != NULL) {
+ /* The resource creation was successful, but the locking failed. */
+ err = dav_push_error(r->pool, err->status, 0,
+ "The VERSION-CONTROL was successful, but there "
+ "was a problem opening the lock database "
+ "which prevents inheriting locks from the "
+ "parent resources.",
+ err);
+ return dav_handle_err(r, err, NULL);
+ }
+
+ /* notify lock system that we have created/replaced a resource */
+ err = dav_notify_created(r, lockdb, resource, resource_state, 0);
+
+ (*locks_hooks->close_lockdb)(lockdb);
+
+ if (err != NULL) {
+ /* The dir creation was successful, but the locking failed. */
+ err = dav_push_error(r->pool, err->status, 0,
+ "The VERSION-CONTROL was successful, but there "
+ "was a problem updating its lock "
+ "information.",
+ err);
+ return dav_handle_err(r, err, NULL);
+ }
}
/* set the Cache-Control header, per the spec */
@@ -3239,7 +3261,7 @@
return DECLINED;
if ((result = ap_xml_parse_input(r, &doc)) != OK)
- return result;
+ return result;
if (doc != NULL) {
const ap_xml_elem *aset;
@@ -3307,6 +3329,7 @@
err = dav_get_resource(r, 1 /*label_allowed*/, apply_to_vsn, &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;
@@ -3317,18 +3340,18 @@
*/
if (resource->type != DAV_RESOURCE_TYPE_REGULAR
&& resource->type != DAV_RESOURCE_TYPE_VERSION) {
- return dav_error_response(r, HTTP_CONFLICT,
- "Cannot checkout this type of resource.");
+ return dav_error_response(r, HTTP_CONFLICT,
+ "Cannot checkout this type of resource.");
}
if (!resource->versioned) {
- return dav_error_response(r, HTTP_CONFLICT,
- "Cannot checkout unversioned resource.");
+ return dav_error_response(r, HTTP_CONFLICT,
+ "Cannot checkout unversioned resource.");
}
if (resource->working) {
- return dav_error_response(r, HTTP_CONFLICT,
- "The resource is already checked out to the workspace.");
+ return dav_error_response(r, HTTP_CONFLICT,
+ "The resource is already checked out to the workspace.");
}
/* ### do lock checks, once behavior is defined */
@@ -3338,11 +3361,11 @@
is_unreserved, is_fork_ok,
create_activity, activities,
&working_resource)) != NULL) {
- err = dav_push_error(r->pool, HTTP_CONFLICT, 0,
- apr_psprintf(r->pool,
- "Could not CHECKOUT resource %s.",
- ap_escape_html(r->pool, r->uri)),
- err);
+ err = dav_push_error(r->pool, HTTP_CONFLICT, 0,
+ apr_psprintf(r->pool,
+ "Could not CHECKOUT resource %s.",
+ ap_escape_html(r->pool, r->uri)),
+ err);
return dav_handle_err(r, err, NULL);
}
@@ -3374,7 +3397,7 @@
return DECLINED;
if ((result = ap_discard_request_body(r)) != OK) {
- return result;
+ return result;
}
/* Ask repository module to resolve the resource */
@@ -3382,6 +3405,7 @@
&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;
@@ -3391,29 +3415,29 @@
* must be versioned, and must be checked out.
*/
if (resource->type != DAV_RESOURCE_TYPE_REGULAR) {
- return dav_error_response(r, HTTP_CONFLICT,
- "Cannot uncheckout this type of resource.");
+ return dav_error_response(r, HTTP_CONFLICT,
+ "Cannot uncheckout this type of resource.");
}
if (!resource->versioned) {
- return dav_error_response(r, HTTP_CONFLICT,
- "Cannot uncheckout unversioned resource.");
+ return dav_error_response(r, HTTP_CONFLICT,
+ "Cannot uncheckout unversioned resource.");
}
if (!resource->working) {
- return dav_error_response(r, HTTP_CONFLICT,
- "The resource is not checked out to the workspace.");
+ return dav_error_response(r, HTTP_CONFLICT,
+ "The resource is not checked out to the workspace.");
}
/* ### do lock checks, once behavior is defined */
/* Do the uncheckout */
if ((err = (*vsn_hooks->uncheckout)(resource)) != NULL) {
- err = dav_push_error(r->pool, HTTP_CONFLICT, 0,
- apr_psprintf(r->pool,
- "Could not UNCHECKOUT resource %s.",
- ap_escape_html(r->pool, r->uri)),
- err);
+ err = dav_push_error(r->pool, HTTP_CONFLICT, 0,
+ apr_psprintf(r->pool,
+ "Could not UNCHECKOUT resource %s.",
+ ap_escape_html(r->pool, r->uri)),
+ err);
return dav_handle_err(r, err, NULL);
}
@@ -3439,7 +3463,7 @@
return DECLINED;
if ((result = ap_xml_parse_input(r, &doc)) != OK)
- return result;
+ return result;
if (doc != NULL) {
if (!dav_validate_root(doc, "checkin")) {
@@ -3458,6 +3482,7 @@
&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;
@@ -3467,18 +3492,18 @@
* must be versioned, and must be checked out.
*/
if (resource->type != DAV_RESOURCE_TYPE_REGULAR) {
- return dav_error_response(r, HTTP_CONFLICT,
- "Cannot checkin this type of resource.");
+ return dav_error_response(r, HTTP_CONFLICT,
+ "Cannot checkin this type of resource.");
}
if (!resource->versioned) {
- return dav_error_response(r, HTTP_CONFLICT,
- "Cannot checkin unversioned resource.");
+ return dav_error_response(r, HTTP_CONFLICT,
+ "Cannot checkin unversioned resource.");
}
if (!resource->working) {
- return dav_error_response(r, HTTP_CONFLICT,
- "The resource is not checked out.");
+ return dav_error_response(r, HTTP_CONFLICT,
+ "The resource is not checked out.");
}
/* ### do lock checks, once behavior is defined */
@@ -3486,11 +3511,11 @@
/* Do the checkin */
if ((err = (*vsn_hooks->checkin)(resource, keep_checked_out, &new_version))
!= NULL) {
- err = dav_push_error(r->pool, HTTP_CONFLICT, 0,
- apr_psprintf(r->pool,
- "Could not CHECKIN resource %s.",
- ap_escape_html(r->pool, r->uri)),
- err);
+ err = dav_push_error(r->pool, HTTP_CONFLICT, 0,
+ apr_psprintf(r->pool,
+ "Could not CHECKIN resource %s.",
+ ap_escape_html(r->pool, r->uri)),
+ err);
return dav_handle_err(r, err, NULL);
}
@@ -3519,22 +3544,22 @@
return DECLINED;
if ((depth = dav_get_depth(r, 0)) < 0) {
- /* dav_get_depth() supplies additional information for the
- * default message. */
- return HTTP_BAD_REQUEST;
+ /* dav_get_depth() supplies additional information for the
+ * default message. */
+ return HTTP_BAD_REQUEST;
}
/* parse the request body */
if ((result = ap_xml_parse_input(r, &doc)) != OK) {
- return result;
+ return result;
}
if (doc == NULL || !dav_validate_root(doc, "update")) {
- /* This supplies additional information for the default message. */
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "The request body does not contain "
- "an \"update\" element.");
- return HTTP_BAD_REQUEST;
+ /* This supplies additional information for the default message. */
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "The request body does not contain "
+ "an \"update\" element.");
+ return HTTP_BAD_REQUEST;
}
/* check for label-name or version element, but not both */
@@ -3543,34 +3568,34 @@
else if ((child = dav_find_child(doc->root, "version")) != NULL) {
/* get the href element */
if ((child = dav_find_child(child, "href")) == NULL) {
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "The version element does not contain "
- "an \"href\" element.");
- return HTTP_BAD_REQUEST;
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "The version element does not contain "
+ "an \"href\" element.");
+ return HTTP_BAD_REQUEST;
}
}
else {
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "The \"update\" element does not contain "
- "a \"label-name\" or \"version\" element.");
- return HTTP_BAD_REQUEST;
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "The \"update\" element does not contain "
+ "a \"label-name\" or \"version\" element.");
+ return HTTP_BAD_REQUEST;
}
/* a depth greater than zero is only allowed for a label */
if (!is_label && depth != 0) {
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "Depth must be zero for UPDATE with a version");
- return HTTP_BAD_REQUEST;
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "Depth must be zero for UPDATE with a version");
+ return HTTP_BAD_REQUEST;
}
/* get the target value (a label or a version URI) */
ap_xml_to_text(r->pool, child, AP_XML_X2T_INNER, NULL, NULL,
&target, &tsize);
if (tsize == 0) {
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "A \"label-name\" or \"href\" element does not contain "
- "any content.");
- return HTTP_BAD_REQUEST;
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "A \"label-name\" or \"href\" element does not contain "
+ "any content.");
+ return HTTP_BAD_REQUEST;
}
/* Ask repository module to resolve the resource */
@@ -3589,8 +3614,8 @@
*/
if (resource->type != DAV_RESOURCE_TYPE_REGULAR
|| !resource->versioned || resource->working) {
- return dav_error_response(r, HTTP_CONFLICT,
- "<DAV:must-be-checked-in-version-controlled-resource>");
+ return dav_error_response(r, HTTP_CONFLICT,
+ "<DAV:must-be-checked-in-version-controlled-resource>");
}
/* if target is a version, resolve the version resource */
@@ -3598,22 +3623,22 @@
if (!is_label) {
lookup = dav_lookup_uri(target, r, 0 /* must_be_absolute */);
if (lookup.rnew == NULL) {
- if (lookup.err.status == HTTP_BAD_REQUEST) {
- /* This supplies additional information for the default message. */
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- lookup.err.desc);
- return HTTP_BAD_REQUEST;
- }
+ if (lookup.err.status == HTTP_BAD_REQUEST) {
+ /* This supplies additional information for the default message. */
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ lookup.err.desc);
+ return HTTP_BAD_REQUEST;
+ }
- /* ### this assumes that dav_lookup_uri() only generates a status
- * ### that Apache can provide a status line for!! */
+ /* ### this assumes that dav_lookup_uri() only generates a status
+ * ### that Apache can provide a status line for!! */
- return dav_error_response(r, lookup.err.status, lookup.err.desc);
+ return dav_error_response(r, lookup.err.status, lookup.err.desc);
}
if (lookup.rnew->status != HTTP_OK) {
- /* ### how best to report this... */
- return dav_error_response(r, lookup.rnew->status,
- "Version URI had an error.");
+ /* ### how best to report this... */
+ return dav_error_response(r, lookup.rnew->status,
+ "Version URI had an error.");
}
/* resolve version resource */
@@ -3631,9 +3656,9 @@
if (err != NULL) {
err = dav_push_error(r->pool, err->status, 0,
- ap_psprintf(r->pool,
- "Could not UPDATE %s.",
- ap_escape_html(r->pool, r->uri)),
+ ap_psprintf(r->pool,
+ "Could not UPDATE %s.",
+ ap_escape_html(r->pool, r->uri)),
err);
return dav_handle_err(r, err, multi_response);
}
@@ -3681,19 +3706,19 @@
if (wres->resource->type != DAV_RESOURCE_TYPE_VERSION &&
(wres->resource->type != DAV_RESOURCE_TYPE_REGULAR
|| !wres->resource->versioned)) {
- err = dav_new_error(ctx->w.pool, HTTP_CONFLICT, 0,
- "<DAV:must-be-version-or-version-selector/>");
+ err = dav_new_error(ctx->w.pool, HTTP_CONFLICT, 0,
+ "<DAV:must-be-version-or-version-selector/>");
}
else if (wres->resource->working) {
- err = dav_new_error(ctx->w.pool, HTTP_CONFLICT, 0,
- "<DAV:must-not-be-checked-out/>");
+ err = dav_new_error(ctx->w.pool, HTTP_CONFLICT, 0,
+ "<DAV:must-not-be-checked-out/>");
}
else {
/* do the label operation */
if (ctx->label_op == DAV_LABEL_REMOVE)
- err = (*ctx->vsn_hooks->remove_label)(wres->resource, ctx->label);
+ err = (*ctx->vsn_hooks->remove_label)(wres->resource, ctx->label);
else
- err = (*ctx->vsn_hooks->add_label)(wres->resource, ctx->label,
+ err = (*ctx->vsn_hooks->add_label)(wres->resource, ctx->label,
ctx->label_op == DAV_LABEL_SET);
}
@@ -3735,22 +3760,22 @@
}
if ((depth = dav_get_depth(r, 0)) < 0) {
- /* dav_get_depth() supplies additional information for the
- * default message. */
- return HTTP_BAD_REQUEST;
+ /* dav_get_depth() supplies additional information for the
+ * default message. */
+ return HTTP_BAD_REQUEST;
}
/* parse the request body */
if ((result = ap_xml_parse_input(r, &doc)) != OK) {
- return result;
+ return result;
}
if (doc == NULL || !dav_validate_root(doc, "label")) {
- /* This supplies additional information for the default message. */
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "The request body does not contain "
- "a \"label\" element.");
- return HTTP_BAD_REQUEST;
+ /* This supplies additional information for the default message. */
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "The request body does not contain "
+ "a \"label\" element.");
+ return HTTP_BAD_REQUEST;
}
/* check for add, set, or remove element */
@@ -3764,27 +3789,27 @@
ctx.label_op = DAV_LABEL_REMOVE;
}
else {
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "The \"label\" element does not contain "
- "an \"add\", \"set\", or \"remove\" element.");
- return HTTP_BAD_REQUEST;
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "The \"label\" element does not contain "
+ "an \"add\", \"set\", or \"remove\" element.");
+ return HTTP_BAD_REQUEST;
}
/* get the label string */
if ((child = dav_find_child(child, "label-name")) == NULL) {
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "The label command element does not contain "
- "a \"label-name\" element.");
- return HTTP_BAD_REQUEST;
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "The label command element does not contain "
+ "a \"label-name\" element.");
+ return HTTP_BAD_REQUEST;
}
ap_xml_to_text(r->pool, child, AP_XML_X2T_INNER, NULL, NULL,
&ctx.label, &tsize);
if (tsize == 0) {
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "A \"label-name\" element does not contain "
- "a label name.");
- return HTTP_BAD_REQUEST;
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "A \"label-name\" element does not contain "
+ "a label name.");
+ return HTTP_BAD_REQUEST;
}
/* do the label operation walk */
@@ -3847,7 +3872,7 @@
return DECLINED;
if ((result = ap_xml_parse_input(r, &doc)) != OK)
- return result;
+ return result;
if (doc == NULL) {
/* This supplies additional information for the default msg. */
ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
@@ -3864,6 +3889,7 @@
&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;
@@ -3875,7 +3901,7 @@
* ### have to handle error responses as well.
*/
if ((err = (*vsn_hooks->get_report)(r, resource, doc, &hdr)) != NULL)
- return dav_handle_err(r, err, NULL);
+ return dav_handle_err(r, err, NULL);
/* send the report response */
r->status = HTTP_OK;
@@ -3912,15 +3938,15 @@
/* parse the request body (must be a mkworkspace element) */
if ((result = ap_xml_parse_input(r, &doc)) != OK) {
- return result;
+ return result;
}
if (doc == NULL
|| !dav_validate_root(doc, "mkworkspace")) {
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "The request body does not contain "
- "a \"mkworkspace\" element.");
- return HTTP_BAD_REQUEST;
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "The request body does not contain "
+ "a \"mkworkspace\" element.");
+ return HTTP_BAD_REQUEST;
}
/* Check request preconditions */
@@ -3933,18 +3959,18 @@
if (resource->exists) {
err = dav_new_error(r->pool, HTTP_CONFLICT, 0,
"<DAV:resource-must-be-null/>");
- return dav_handle_err(r, err, NULL);
+ return dav_handle_err(r, err, NULL);
}
/* ### what about locking? */
/* attempt to create the workspace */
if ((err = (*vsn_hooks->make_workspace)(resource, doc)) != NULL) {
- err = dav_push_error(r->pool, err->status, 0,
- apr_psprintf(r->pool,
- "Could not create workspace %s.",
- ap_escape_html(r->pool, r->uri)),
- err);
+ err = dav_push_error(r->pool, err->status, 0,
+ apr_psprintf(r->pool,
+ "Could not create workspace %s.",
+ ap_escape_html(r->pool, r->uri)),
+ err);
return dav_handle_err(r, err, NULL);
}
@@ -3976,7 +4002,7 @@
/* MKACTIVITY does not have a defined request body. */
if ((result = ap_discard_request_body(r)) != OK) {
- return result;
+ return result;
}
/* Check request preconditions */
@@ -3989,18 +4015,18 @@
if (resource->exists) {
err = dav_new_error(r->pool, HTTP_CONFLICT, 0,
"<DAV:resource-must-be-null/>");
- return dav_handle_err(r, err, NULL);
+ return dav_handle_err(r, err, NULL);
}
/* ### what about locking? */
/* attempt to create the activity */
if ((err = (*vsn_hooks->make_activity)(resource)) != NULL) {
- err = dav_push_error(r->pool, err->status, 0,
- apr_psprintf(r->pool,
- "Could not create activity %s.",
- ap_escape_html(r->pool, r->uri)),
- err);
+ err = dav_push_error(r->pool, err->status, 0,
+ apr_psprintf(r->pool,
+ "Could not create activity %s.",
+ ap_escape_html(r->pool, r->uri)),
+ err);
return dav_handle_err(r, err, NULL);
}
@@ -4038,29 +4064,29 @@
return DECLINED;
if ((result = ap_xml_parse_input(r, &doc)) != OK)
- return result;
+ return result;
if (doc == NULL || !dav_validate_root(doc, "merge")) {
/* This supplies additional information for the default msg. */
ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "The request body must be present and must be a "
- "DAV:merge element.");
- return HTTP_BAD_REQUEST;
+ "The request body must be present and must be a "
+ "DAV:merge element.");
+ return HTTP_BAD_REQUEST;
}
if ((source_elem = dav_find_child(doc->root, "source")) == NULL) {
/* This supplies additional information for the default msg. */
ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "The DAV:merge element must contain a DAV:source "
- "element.");
- return HTTP_BAD_REQUEST;
+ "The DAV:merge element must contain a DAV:source "
+ "element.");
+ return HTTP_BAD_REQUEST;
}
if ((href_elem = dav_find_child(source_elem, "href")) == NULL) {
/* This supplies additional information for the default msg. */
ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "The DAV:source element must contain a DAV:href "
- "element.");
- return HTTP_BAD_REQUEST;
+ "The DAV:source element must contain a DAV:href "
+ "element.");
+ return HTTP_BAD_REQUEST;
}
source = dav_xml_get_cdata(href_elem, r->pool, 1 /* strip_white */);
@@ -4069,24 +4095,24 @@
lookup = dav_lookup_uri(source, r, 0 /* must_be_absolute */);
if (lookup.rnew == NULL) {
if (lookup.err.status == HTTP_BAD_REQUEST) {
- /* This supplies additional information for the default message. */
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- lookup.err.desc);
- return HTTP_BAD_REQUEST;
- }
+ /* This supplies additional information for the default message. */
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ lookup.err.desc);
+ return HTTP_BAD_REQUEST;
+ }
- /* ### this assumes that dav_lookup_uri() only generates a status
- * ### that Apache can provide a status line for!! */
+ /* ### this assumes that dav_lookup_uri() only generates a status
+ * ### that Apache can provide a status line for!! */
- return dav_error_response(r, lookup.err.status, lookup.err.desc);
+ return dav_error_response(r, lookup.err.status, lookup.err.desc);
}
if (lookup.rnew->status != HTTP_OK) {
/* ### how best to report this... */
return dav_error_response(r, lookup.rnew->status,
- "Merge source URI had an error.");
+ "Merge source URI had an error.");
}
err = dav_get_resource(lookup.rnew, 0 /* label_allowed */,
- 0 /* use_checked_in */, &source_resource);
+ 0 /* use_checked_in */, &source_resource);
if (err != NULL)
return dav_handle_err(r, err, NULL);
@@ -4104,7 +4130,7 @@
/* Ask repository module to resolve the resource */
err = dav_get_resource(r, 0 /* label_allowed */, 0 /* use_checked_in */,
- &resource);
+ &resource);
if (err != NULL)
return dav_handle_err(r, err, NULL);
if (!resource->exists) {
@@ -4132,17 +4158,17 @@
/* Do the merge, including any response generation. */
if ((err = (*vsn_hooks->merge)(resource, source_resource,
- no_auto_merge, no_checkout,
- prop_elem,
- r->output_filters)) != NULL) {
+ no_auto_merge, no_checkout,
+ prop_elem,
+ r->output_filters)) != NULL) {
/* ### is err->status the right error here? */
- err = dav_push_error(r->pool, err->status, 0,
- apr_psprintf(r->pool,
- "Could not MERGE resource \"%s\" "
- "into \"%s\".",
- ap_escape_html(r->pool, source),
- ap_escape_html(r->pool, r->uri)),
- err);
+ err = dav_push_error(r->pool, err->status, 0,
+ apr_psprintf(r->pool,
+ "Could not MERGE resource \"%s\" "
+ "into \"%s\".",
+ ap_escape_html(r->pool, source),
+ ap_escape_html(r->pool, r->uri)),
+ err);
return dav_handle_err(r, err, NULL);
}
@@ -4173,28 +4199,29 @@
&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;
+ /* Apache will supply a default error for this. */
+ return HTTP_NOT_FOUND;
}
/* get the destination URI */
dest = apr_table_get(r->headers_in, "Destination");
if (dest == NULL) {
- /* This supplies additional information for the default message. */
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- "The request is missing a Destination header.");
- return HTTP_BAD_REQUEST;
+ /* This supplies additional information for the default message. */
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ "The request is missing a Destination header.");
+ return HTTP_BAD_REQUEST;
}
lookup = dav_lookup_uri(dest, r, 0 /* must_be_absolute */);
if (lookup.rnew == NULL) {
- if (lookup.err.status == HTTP_BAD_REQUEST) {
- /* This supplies additional information for the default message. */
- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
- lookup.err.desc);
- return HTTP_BAD_REQUEST;
- }
+ if (lookup.err.status == HTTP_BAD_REQUEST) {
+ /* This supplies additional information for the default message. */
+ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r,
+ lookup.err.desc);
+ return HTTP_BAD_REQUEST;
+ }
else if (lookup.err.status == HTTP_BAD_GATEWAY) {
/* ### Bindings protocol draft 02 says to return 507
* ### (Cross Server Binding Forbidden); Apache already defines 507
@@ -4202,18 +4229,19 @@
* ### HTTP_FORBIDDEN
*/
return dav_error_response(r, HTTP_FORBIDDEN,
- "Cross server bindings are not allowed by this server.");
+ "Cross server bindings are not "
+ "allowed by this server.");
}
- /* ### this assumes that dav_lookup_uri() only generates a status
- * ### that Apache can provide a status line for!! */
+ /* ### this assumes that dav_lookup_uri() only generates a status
+ * ### that Apache can provide a status line for!! */
- return dav_error_response(r, lookup.err.status, lookup.err.desc);
+ return dav_error_response(r, lookup.err.status, lookup.err.desc);
}
if (lookup.rnew->status != HTTP_OK) {
- /* ### how best to report this... */
- return dav_error_response(r, lookup.rnew->status,
- "Destination URI had an error.");
+ /* ### how best to report this... */
+ return dav_error_response(r, lookup.rnew->status,
+ "Destination URI had an error.");
}
/* resolve binding resource */
@@ -4224,117 +4252,117 @@
/* are the two resources handled by the same repository? */
if (resource->hooks != binding->hooks) {
- /* ### this message exposes some backend config, but screw it... */
- return dav_error_response(r, HTTP_BAD_GATEWAY,
- "Destination URI is handled by a "
- "different repository than the source URI. "
- "BIND between repositories is not possible.");
+ /* ### this message exposes some backend config, but screw it... */
+ return dav_error_response(r, HTTP_BAD_GATEWAY,
+ "Destination URI is handled by a "
+ "different repository than the source URI. "
+ "BIND between repositories is not possible.");
}
/* get and parse the overwrite header value */
if ((overwrite = dav_get_overwrite(r)) < 0) {
- /* dav_get_overwrite() supplies additional information for the
- * default message. */
- return HTTP_BAD_REQUEST;
+ /* dav_get_overwrite() supplies additional information for the
+ * default message. */
+ return HTTP_BAD_REQUEST;
}
/* quick failure test: if dest exists and overwrite is false. */
if (binding->exists && !overwrite) {
- return dav_error_response(r, HTTP_PRECONDITION_FAILED,
- "Destination is not empty and "
- "Overwrite is not \"T\"");
+ return dav_error_response(r, HTTP_PRECONDITION_FAILED,
+ "Destination is not empty and "
+ "Overwrite is not \"T\"");
}
/* are the source and destination the same? */
if ((*resource->hooks->is_same_resource)(resource, binding)) {
- return dav_error_response(r, HTTP_FORBIDDEN,
- "Source and Destination URIs are the same.");
+ return dav_error_response(r, HTTP_FORBIDDEN,
+ "Source and Destination URIs are the same.");
}
/*
- ** Check If-Headers and existing locks for destination. Note that we
- ** use depth==infinity since the target (hierarchy) will be deleted
- ** before the move/copy is completed.
- **
- ** Note that we are overwriting the target, which implies a DELETE, so
- ** we are subject to the error/response rules as a DELETE. Namely, we
- ** will return a 424 error if any of the validations fail.
- ** (see dav_method_delete() for more information)
- */
+ * Check If-Headers and existing locks for destination. Note that we
+ * use depth==infinity since the target (hierarchy) will be deleted
+ * before the move/copy is completed.
+ *
+ * Note that we are overwriting the target, which implies a DELETE, so
+ * we are subject to the error/response rules as a DELETE. Namely, we
+ * will return a 424 error if any of the validations fail.
+ * (see dav_method_delete() for more information)
+ */
if ((err = dav_validate_request(lookup.rnew, binding, DAV_INFINITY, NULL,
- &multi_response,
- DAV_VALIDATE_PARENT
+ &multi_response,
+ DAV_VALIDATE_PARENT
| DAV_VALIDATE_USE_424, NULL)) != NULL) {
- err = dav_push_error(r->pool, err->status, 0,
- apr_psprintf(r->pool,
- "Could not BIND %s due to a "
- "failed precondition on the "
- "destination (e.g. locks).",
- ap_escape_html(r->pool, r->uri)),
- err);
- return dav_handle_err(r, err, multi_response);
+ err = dav_push_error(r->pool, err->status, 0,
+ apr_psprintf(r->pool,
+ "Could not BIND %s due to a "
+ "failed precondition on the "
+ "destination (e.g. locks).",
+ ap_escape_html(r->pool, r->uri)),
+ err);
+ return dav_handle_err(r, err, multi_response);
}
/* guard against creating circular bindings */
if (resource->collection
- && (*resource->hooks->is_parent_resource)(resource, binding)) {
- return dav_error_response(r, HTTP_FORBIDDEN,
- "Source collection contains the Destination.");
+ && (*resource->hooks->is_parent_resource)(resource, binding)) {
+ return dav_error_response(r, HTTP_FORBIDDEN,
+ "Source collection contains the Destination.");
}
if (resource->collection
- && (*resource->hooks->is_parent_resource)(binding, resource)) {
- /* The destination must exist (since it contains the source), and
- * a condition above implies Overwrite==T. Obviously, we cannot
- * delete the Destination before the BIND, as that would
- * delete the Source.
- */
-
- return dav_error_response(r, HTTP_FORBIDDEN,
- "Destination collection contains the Source and "
- "Overwrite has been specified.");
+ && (*resource->hooks->is_parent_resource)(binding, resource)) {
+ /* The destination must exist (since it contains the source), and
+ * a condition above implies Overwrite==T. Obviously, we cannot
+ * delete the Destination before the BIND, as that would
+ * delete the Source.
+ */
+
+ return dav_error_response(r, HTTP_FORBIDDEN,
+ "Destination collection contains the Source and "
+ "Overwrite has been specified.");
}
/* prepare the destination collection for modification */
if ((err = dav_auto_checkout(r, binding, 1 /* parent_only */,
- &av_info)) != NULL) {
+ &av_info)) != NULL) {
/* could not make destination writable */
- return dav_handle_err(r, err, NULL);
+ return dav_handle_err(r, err, NULL);
}
/* If target exists, remove it first (we know Ovewrite must be TRUE).
* Then try to bind to the resource.
*/
if (binding->exists)
- err = (*resource->hooks->remove_resource)(binding, &multi_response);
+ err = (*resource->hooks->remove_resource)(binding, &multi_response);
if (err == NULL) {
- err = (*binding_hooks->bind_resource)(resource, binding);
+ err = (*binding_hooks->bind_resource)(resource, binding);
}
/* restore parent collection states */
err2 = dav_auto_checkin(r, NULL,
- err != NULL /* undo if error */,
- 0 /*unlock*/, &av_info);
+ err != NULL /* undo if error */,
+ 0 /* unlock */, &av_info);
/* check for error from remove/bind operations */
if (err != NULL) {
- err = dav_push_error(r->pool, err->status, 0,
- apr_psprintf(r->pool,
- "Could not BIND %s.",
- ap_escape_html(r->pool, r->uri)),
- err);
- return dav_handle_err(r, err, multi_response);
+ err = dav_push_error(r->pool, err->status, 0,
+ apr_psprintf(r->pool,
+ "Could not BIND %s.",
+ ap_escape_html(r->pool, r->uri)),
+ err);
+ return dav_handle_err(r, err, multi_response);
}
/* check for errors from reverting writability */
if (err2 != NULL) {
- /* just log a warning */
- err = dav_push_error(r->pool, err2->status, 0,
- "The BIND was successful, but there was a "
- "problem automatically checking in the "
- "source parent collection.",
- err2);
- dav_log_err(r, err, APLOG_WARNING);
+ /* just log a warning */
+ err = dav_push_error(r->pool, err2->status, 0,
+ "The BIND was successful, but there was a "
+ "problem automatically checking in the "
+ "source parent collection.",
+ err2);
+ dav_log_err(r, err, APLOG_WARNING);
}
/* return an appropriate response (HTTP_CREATED) */
@@ -4351,18 +4379,18 @@
dav_dir_conf *conf;
if (strcmp(r->handler, "dav-handler")) {
- return DECLINED;
+ return DECLINED;
}
/* quickly ignore any HTTP/0.9 requests */
if (r->assbackwards) {
- return DECLINED;
+ return DECLINED;
}
/* ### do we need to do anything with r->proxyreq ?? */
- conf = (dav_dir_conf *) ap_get_module_config(r->per_dir_config,
- &dav_module);
+ conf = (dav_dir_conf *)ap_get_module_config(r->per_dir_config,
+ &dav_module);
/*
* Set up the methods mask, since that's one of the reasons this handler
@@ -4377,131 +4405,137 @@
*/
r->allowed = 0
| (AP_METHOD_BIT << M_GET)
- | (AP_METHOD_BIT << M_PUT)
- | (AP_METHOD_BIT << M_DELETE)
- | (AP_METHOD_BIT << M_OPTIONS)
- | (AP_METHOD_BIT << M_INVALID);
+ | (AP_METHOD_BIT << M_PUT)
+ | (AP_METHOD_BIT << M_DELETE)
+ | (AP_METHOD_BIT << M_OPTIONS)
+ | (AP_METHOD_BIT << M_INVALID);
+
/*
* These are the DAV methods we handle.
*/
r->allowed |= 0
- | (AP_METHOD_BIT << M_COPY)
- | (AP_METHOD_BIT << M_LOCK)
- | (AP_METHOD_BIT << M_UNLOCK)
- | (AP_METHOD_BIT << M_MKCOL)
- | (AP_METHOD_BIT << M_MOVE)
- | (AP_METHOD_BIT << M_PROPFIND)
- | (AP_METHOD_BIT << M_PROPPATCH);
+ | (AP_METHOD_BIT << M_COPY)
+ | (AP_METHOD_BIT << M_LOCK)
+ | (AP_METHOD_BIT << M_UNLOCK)
+ | (AP_METHOD_BIT << M_MKCOL)
+ | (AP_METHOD_BIT << M_MOVE)
+ | (AP_METHOD_BIT << M_PROPFIND)
+ | (AP_METHOD_BIT << M_PROPPATCH);
+
/*
* These are methods that we don't handle directly, but let the
* server's default handler do for us as our agent.
*/
r->allowed |= 0
- | (AP_METHOD_BIT << M_POST);
-
+ | (AP_METHOD_BIT << M_POST);
+
/* ### hrm. if we return HTTP_METHOD_NOT_ALLOWED, then an Allow header
* ### is sent; it will need the other allowed states; since the default
* ### handler is not called on error, then it doesn't add the other
- * ### allowed states, so we must */
+ * ### allowed states, so we must
+ */
+
/* ### we might need to refine this for just where we return the error.
- * ### also, there is the issue with other methods (see ISSUES) */
+ * ### also, there is the issue with other methods (see ISSUES)
+ */
+
/* ### more work necessary, now that we have M_foo for DAV methods */
/* dispatch the appropriate method handler */
if (r->method_number == M_GET) {
- return dav_method_get(r);
+ return dav_method_get(r);
}
if (r->method_number == M_PUT) {
- return dav_method_put(r);
+ return dav_method_put(r);
}
if (r->method_number == M_POST) {
- return dav_method_post(r);
+ return dav_method_post(r);
}
if (r->method_number == M_DELETE) {
- return dav_method_delete(r);
+ return dav_method_delete(r);
}
if (r->method_number == M_OPTIONS) {
- return dav_method_options(r);
+ return dav_method_options(r);
}
if (r->method_number == M_PROPFIND) {
- return dav_method_propfind(r);
+ return dav_method_propfind(r);
}
if (r->method_number == M_PROPPATCH) {
- return dav_method_proppatch(r);
+ return dav_method_proppatch(r);
}
if (r->method_number == M_MKCOL) {
- return dav_method_mkcol(r);
+ return dav_method_mkcol(r);
}
if (r->method_number == M_COPY) {
- return dav_method_copymove(r, DAV_DO_COPY);
+ return dav_method_copymove(r, DAV_DO_COPY);
}
if (r->method_number == M_MOVE) {
- return dav_method_copymove(r, DAV_DO_MOVE);
+ return dav_method_copymove(r, DAV_DO_MOVE);
}
if (r->method_number == M_LOCK) {
- return dav_method_lock(r);
+ return dav_method_lock(r);
}
if (r->method_number == M_UNLOCK) {
- return dav_method_unlock(r);
+ return dav_method_unlock(r);
}
if (r->method_number == dav_methods[DAV_M_VERSION_CONTROL]) {
- return dav_method_vsn_control(r);
+ return dav_method_vsn_control(r);
}
if (r->method_number == dav_methods[DAV_M_CHECKOUT]) {
- return dav_method_checkout(r);
+ return dav_method_checkout(r);
}
if (r->method_number == dav_methods[DAV_M_UNCHECKOUT]) {
- return dav_method_uncheckout(r);
+ return dav_method_uncheckout(r);
}
if (r->method_number == dav_methods[DAV_M_CHECKIN]) {
- return dav_method_checkin(r);
+ return dav_method_checkin(r);
}
if (r->method_number == dav_methods[DAV_M_UPDATE]) {
- return dav_method_update(r);
+ return dav_method_update(r);
}
if (r->method_number == dav_methods[DAV_M_LABEL]) {
- return dav_method_label(r);
+ return dav_method_label(r);
}
if (r->method_number == dav_methods[DAV_M_REPORT]) {
- return dav_method_report(r);
+ return dav_method_report(r);
}
if (r->method_number == dav_methods[DAV_M_MKWORKSPACE]) {
- return dav_method_make_workspace(r);
+ return dav_method_make_workspace(r);
}
if (r->method_number == dav_methods[DAV_M_MKACTIVITY]) {
- return dav_method_make_activity(r);
+ return dav_method_make_activity(r);
}
if (r->method_number == dav_methods[DAV_M_BASELINE_CONTROL]) {
- return dav_method_baseline_control(r);
+ return dav_method_baseline_control(r);
}
if (r->method_number == dav_methods[DAV_M_MERGE]) {
- return dav_method_merge(r);
+ return dav_method_merge(r);
}
if (r->method_number == dav_methods[DAV_M_BIND]) {
- return dav_method_bind(r);
+ return dav_method_bind(r);
}
/* ### add'l methods for Advanced Collections, ACLs, DASL */
@@ -4513,29 +4547,29 @@
{
dav_dir_conf *conf;
- conf = (dav_dir_conf *) ap_get_module_config(r->per_dir_config,
- &dav_module);
+ conf = (dav_dir_conf *)ap_get_module_config(r->per_dir_config,
+ &dav_module);
/* if DAV is not enabled, then we've got nothing to do */
if (conf->provider == NULL) {
- return DECLINED;
+ return DECLINED;
}
if (r->method_number == M_GET) {
- /*
- ** ### need some work to pull Content-Type and Content-Language
- ** ### from the property database.
- */
-
- /*
- ** If the repository hasn't indicated that it will handle the
- ** GET method, then just punt.
- **
- ** ### this isn't quite right... taking over the response can break
- ** ### things like mod_negotiation. need to look into this some more.
- */
- if (!conf->provider->repos->handle_get) {
- return DECLINED;
+ /*
+ * ### need some work to pull Content-Type and Content-Language
+ * ### from the property database.
+ */
+
+ /*
+ * If the repository hasn't indicated that it will handle the
+ * GET method, then just punt.
+ *
+ * ### this isn't quite right... taking over the response can break
+ * ### things like mod_negotiation. need to look into this some more.
+ */
+ if (!conf->provider->repos->handle_get) {
+ return DECLINED;
}
}
@@ -4543,17 +4577,17 @@
/* ### the handler DOES handle POST, so we need to fix one of these */
if (r->method_number != M_POST) {
- /*
- ** ### anything else to do here? could another module and/or
- ** ### config option "take over" the handler here? i.e. how do
- ** ### we lock down this hierarchy so that we are the ultimate
- ** ### arbiter? (or do we simply depend on the administrator
- ** ### to avoid conflicting configurations?)
- **
- ** ### I think the OK stops running type-checkers. need to look.
- */
- r->handler = "dav-handler";
- return OK;
+ /*
+ * ### anything else to do here? could another module and/or
+ * ### config option "take over" the handler here? i.e. how do
+ * ### we lock down this hierarchy so that we are the ultimate
+ * ### arbiter? (or do we simply depend on the administrator
+ * ### to avoid conflicting configurations?)
+ *
+ * ### I think the OK stops running type-checkers. need to look.
+ */
+ r->handler = "dav-handler";
+ return OK;
}
return DECLINED;
@@ -4567,15 +4601,15 @@
dav_hook_find_liveprop(dav_core_find_liveprop, NULL, NULL, APR_HOOK_LAST);
dav_hook_insert_all_liveprops(dav_core_insert_all_liveprops,
- NULL, NULL, APR_HOOK_MIDDLE);
+ NULL, NULL, APR_HOOK_MIDDLE);
dav_core_register_uris(p);
}
/*---------------------------------------------------------------------------
-**
-** Configuration info for the module
-*/
+ *
+ * Configuration info for the module
+ */
static const command_rec dav_cmds[] =
{
@@ -4599,11 +4633,11 @@
module DAV_DECLARE_DATA dav_module =
{
STANDARD20_MODULE_STUFF,
- dav_create_dir_config, /* dir config creater */
- dav_merge_dir_config, /* dir merger --- default is to override */
- dav_create_server_config, /* server config */
- dav_merge_server_config, /* merge server config */
- dav_cmds, /* command table */
+ dav_create_dir_config, /* dir config creater */
+ dav_merge_dir_config, /* dir merger --- default is to override */
+ dav_create_server_config, /* server config */
+ dav_merge_server_config, /* merge server config */
+ dav_cmds, /* command table */
register_hooks, /* register hooks */
};
@@ -4612,14 +4646,17 @@
APR_HOOK_LINK(find_liveprop)
APR_HOOK_LINK(insert_all_liveprops)
)
+
APR_IMPLEMENT_EXTERNAL_HOOK_VOID(dav, DAV, gather_propsets,
(apr_array_header_t *uris),
(uris))
+
APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(dav, DAV, int, find_liveprop,
(const dav_resource *resource,
const char *ns_uri, const char *name,
const dav_hooks_liveprop **hooks),
- (resource, ns_uri, name, hooks), 0)
+ (resource, ns_uri, name, hooks), 0)
+
APR_IMPLEMENT_EXTERNAL_HOOK_VOID(dav, DAV, insert_all_liveprops,
(request_rec *r, const dav_resource *resource,
dav_prop_insert what, ap_text_header *phdr),