You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by gs...@locus.apache.org on 2000/10/10 10:25:50 UTC
cvs commit: apache-2.0/src/modules/dav/main mod_dav.c
gstein 00/10/10 01:25:47
Modified: src/modules/dav/main mod_dav.c
Log:
*) fix GET handling: cache the provider; test through the provider rather
than the handle_get config member (which is now gone)
*) use "DAV/2" for the server token rather than dup'ing the apache vsn
Revision Changes Path
1.24 +45 -29 apache-2.0/src/modules/dav/main/mod_dav.c
Index: mod_dav.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/modules/dav/main/mod_dav.c,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- mod_dav.c 2000/10/07 01:29:38 1.23
+++ mod_dav.c 2000/10/10 08:25:44 1.24
@@ -104,10 +104,10 @@
/* per-dir configuration */
typedef struct {
- const char *provider;
+ const char *provider_name;
+ const dav_provider *provider;
const char *dir;
int locktimeout;
- int handle_get; /* cached from repository hook structure */
int allow_depthinfinity;
apr_table_t *d_params; /* per-directory DAV config parameters */
@@ -132,7 +132,7 @@
{
/* DBG0("dav_init_handler"); */
- ap_add_version_component(p, "DAV/" DAV_VERSION);
+ ap_add_version_component(p, "DAV/2");
}
static void *dav_create_server_config(apr_pool_t *p, server_rec *s)
@@ -182,14 +182,15 @@
/* DBG3("dav_merge_dir_config: new=%08lx base=%08lx overrides=%08lx",
(long)newconf, (long)base, (long)overrides); */
- newconf->provider = child->provider;
- if (parent->provider != NULL) {
- if (child->provider == NULL) {
+ newconf->provider_name = child->provider_name;
+ if (parent->provider_name != NULL) {
+ if (child->provider_name == NULL) {
ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, NULL,
"\"DAV Off\" cannot be used to turn off a subtree "
"of a DAV-enabled location.");
}
- else if (strcasecmp(child->provider, parent->provider) != 0) {
+ else if (strcasecmp(child->provider_name,
+ parent->provider_name) != 0) {
ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, NULL,
"A subtree cannot specify a different DAV provider "
"than its parent.");
@@ -205,6 +206,17 @@
apr_overlap_tables(newconf->d_params, child->d_params,
APR_OVERLAP_TABLES_SET);
+ if (newconf->provider_name == NULL)
+ newconf->provider = NULL;
+ else {
+ newconf->provider = dav_lookup_provider(newconf->provider_name);
+
+ if (newconf->provider == NULL) {
+ ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, NULL,
+ "Unknown DAV provider: %s", newconf->provider_name);
+ }
+ }
+
return newconf;
}
@@ -221,11 +233,12 @@
dav_dir_conf *conf;
conf = ap_get_module_config(r->per_dir_config, &dav_module);
- /* assert: conf->provider != NULL
- (otherwise, DAV is disabled, and we wouldn't be here */
+ /* assert: conf->provider_name != NULL
+ (otherwise, DAV is disabled, and we wouldn't be here) */
- /* ### assert that we find it? (return value != NULL) */
- return dav_lookup_provider(conf->provider);
+ /* assert: conf->provider != NULL
+ (checked when conf->provider_name is set) */
+ return conf->provider;
}
const dav_hooks_locks *dav_get_lock_hooks(request_rec *r)
@@ -251,21 +264,27 @@
dav_dir_conf *conf = (dav_dir_conf *) config;
if (strcasecmp(arg1, "on") == 0) {
- conf->provider = DAV_DEFAULT_PROVIDER;
+ conf->provider_name = DAV_DEFAULT_PROVIDER;
}
else if (strcasecmp(arg1, "off") == 0) {
- conf->provider = NULL;
+ conf->provider_name = NULL;
+ conf->provider = NULL;
}
else {
- conf->provider = apr_pstrdup(cmd->pool, arg1);
+ conf->provider_name = apr_pstrdup(cmd->pool, arg1);
}
- if (conf->provider != NULL
- && dav_lookup_provider(conf->provider) == NULL) {
- /* by the time they use it, the provider should be loaded and
- registered with us. */
- return apr_psprintf(cmd->pool,
- "Unknown DAV provider: %s", conf->provider);
+ if (conf->provider_name != NULL) {
+ /* lookup and cache the actual provider now */
+ conf->provider = dav_lookup_provider(conf->provider_name);
+
+ if (conf->provider == NULL) {
+ /* by the time they use it, the provider should be loaded and
+ registered with us. */
+ return apr_psprintf(cmd->pool,
+ "Unknown DAV provider: %s",
+ conf->provider_name);
+ }
}
return NULL;
@@ -597,7 +616,6 @@
{
void *data;
dav_dir_conf *conf;
- const dav_provider *provider;
const char *workspace = NULL;
const char *target_selector = NULL;
int is_label = 0;
@@ -610,11 +628,6 @@
return OK;
}
- conf = ap_get_module_config(r->per_dir_config, &dav_module);
-
- /* assert: conf->provider != NULL */
- provider = dav_lookup_provider(conf->provider);
-
/* get any workspace header */
if ((result = dav_get_workspace(r, &workspace)) != OK)
return result;
@@ -627,9 +640,12 @@
return result;
}
+ conf = ap_get_module_config(r->per_dir_config, &dav_module);
+ /* assert: conf->provider != NULL */
+
/* resolve the resource */
- *res_p = (*provider->repos->get_resource)(r, conf->dir, workspace,
- target_selector, is_label);
+ *res_p = (*conf->provider->repos->get_resource)(r, conf->dir, workspace,
+ target_selector, is_label);
if (*res_p == NULL) {
/* Apache will supply a default error for this. */
return HTTP_NOT_FOUND;
@@ -3177,7 +3193,7 @@
** ### this isn't quite right... taking over the response can break
** ### things like mod_negotiation. need to look into this some more.
*/
- if (!conf->handle_get) {
+ if (!conf->provider->repos->handle_get) {
return DECLINED;
}
}