Add option min_propset

This commit is contained in:
wbaumann
2014-06-09 18:38:46 +00:00
parent f4ac4f739a
commit 53ee4afb75
10 changed files with 419 additions and 297 deletions

View File

@ -202,6 +202,12 @@
/* Use "Content-Encoding: gzip" for GET requests. */
#define DAV_USE_COMPRESSION 1
/* Only request a minimal set or properties (getcontentlength and
resourcetype). For read-only filesystems to speed up PROPFIND
requests.
May be overridden by system config file and user config file. */
#define DAV_MIN_PROPSET 0
/* Timeout in seconds used when libneon supports non blocking io
A value of zero means use the TCP default
May be overriden by system config file and user config file. */

View File

@ -1717,6 +1717,7 @@ new_args(void)
args->precheck = DAV_PRECHECK;
args->ignore_dav_header = DAV_IGNORE_DAV_HEADER;
args->use_compression = DAV_USE_COMPRESSION;
args->min_propset = DAV_MIN_PROPSET;
args->connect_timeout = DAV_CONNECT_TIMEOUT;
args->read_timeout = DAV_READ_TIMEOUT;
args->retry = DAV_RETRY;
@ -2206,6 +2207,8 @@ read_config(dav_args *args, const char * filename, int system)
args->ignore_dav_header = arg_to_int(parmv[1], 10, parmv[0]);
} else if (strcmp(parmv[0], "use_compression") == 0) {
args->use_compression = arg_to_int(parmv[1], 10, parmv[0]);
} else if (strcmp(parmv[0], "min_propset") == 0) {
args->min_propset = arg_to_int(parmv[1], 10, parmv[0]);
} else if (strcmp(parmv[0], "connect_timeout") == 0) {
args->connect_timeout = arg_to_int(parmv[1], 10, parmv[0]);
} else if (strcmp(parmv[0], "read_timeout") == 0) {

View File

@ -93,6 +93,7 @@ typedef struct {
int precheck; /* User config file, system config file */
int ignore_dav_header; /* User config file, system config file */
int use_compression; /* User config file, system config file */
int min_propset; /* User config file, system config file */
time_t connect_timeout; /* User config file, system config file */
time_t read_timeout; /* User config file, system config file */
time_t retry; /* User config file, system config file */

View File

@ -114,27 +114,38 @@ typedef struct {
/* Properties to be retrieved from the server. This constants
are used by dav_get_collection(). */
enum {
ETAG = 0,
TYPE = 0,
LENGTH,
MODIFIED,
TYPE,
END
ETAG,
MODIFIED
};
static const ne_propname prop_names[] = {
[ETAG] = {"DAV:", "getetag"},
[LENGTH] = {"DAV:", "getcontentlength"},
[MODIFIED] = {"DAV:", "getlastmodified"},
static const ne_propname full_prop_names[] = {
[TYPE] = {"DAV:", "resourcetype"},
[END] = {NULL, NULL}
[LENGTH] = {"DAV:", "getcontentlength"},
[ETAG] = {"DAV:", "getetag"},
[MODIFIED] = {"DAV:", "getlastmodified"},
{NULL, NULL}
};
static const ne_propname anonymous_prop_names[] = {
[ETAG] = {NULL, "getetag"},
[LENGTH] = {NULL, "getcontentlength"},
[MODIFIED] = {NULL, "getlastmodified"},
static const ne_propname full_anonymous_prop_names[] = {
[TYPE] = {NULL, "resourcetype"},
[END] = {NULL, NULL}
[LENGTH] = {NULL, "getcontentlength"},
[ETAG] = {NULL, "getetag"},
[MODIFIED] = {NULL, "getlastmodified"},
{NULL, NULL}
};
static const ne_propname min_prop_names[] = {
[TYPE] = {"DAV:", "resourcetype"},
[LENGTH] = {"DAV:", "getcontentlength"},
{NULL, NULL}
};
static const ne_propname min_anonymous_prop_names[] = {
[TYPE] = {NULL, "resourcetype"},
[LENGTH] = {NULL, "getcontentlength"},
{NULL, NULL}
};
/* Properties to be retrieved from the server. This constants
@ -199,6 +210,11 @@ static int ignore_dav_header;
/* Use "Content-Encoding: gzip" for GET requests. */
static int use_compression;
/* Only request a minimal set of properties. */
static int min_propset;
static const ne_propname *prop_names;
static const ne_propname *anonymous_prop_names;
/* Will be set to 1 when dav_init_connection() succeeded. */
static int initialized;
@ -431,6 +447,14 @@ dav_init_webdav(dav_args *args)
precheck = args->precheck;
ignore_dav_header = args->ignore_dav_header;
use_compression = args->use_compression & ne_has_support(NE_FEATURE_ZLIB);
min_propset = args->min_propset;
if (min_propset) {
prop_names = min_prop_names;
anonymous_prop_names = min_anonymous_prop_names;
} else {
prop_names = full_prop_names;
anonymous_prop_names = full_anonymous_prop_names;
}
}
@ -1713,10 +1737,6 @@ prop_result(void *userdata, const ne_uri *uri, const ne_prop_result_set *set)
#endif
}
data = ne_propset_value(set, &prop_names[ETAG]);
if (!data)
data = ne_propset_value(set, &anonymous_prop_names[ETAG]);
result->etag = normalize_etag(data);
data = ne_propset_value(set, &prop_names[LENGTH]);
if (!data)
@ -1728,15 +1748,22 @@ prop_result(void *userdata, const ne_uri *uri, const ne_prop_result_set *set)
result->size = strtol(data, NULL, 10);
#endif /* _FILE_OFFSET_BITS != 64 */
data = ne_propset_value(set, &prop_names[MODIFIED]);
if (!data)
data = ne_propset_value(set, &anonymous_prop_names[MODIFIED]);
if (data) {
result->mtime = ne_httpdate_parse(data);
if (result->mtime == (time_t) -1)
result->mtime = ne_iso8601_parse(data);
if (result->mtime == (time_t) -1)
result->mtime = 0;
if (!min_propset) {
data = ne_propset_value(set, &prop_names[ETAG]);
if (!data)
data = ne_propset_value(set, &anonymous_prop_names[ETAG]);
result->etag = normalize_etag(data);
data = ne_propset_value(set, &prop_names[MODIFIED]);
if (!data)
data = ne_propset_value(set, &anonymous_prop_names[MODIFIED]);
if (data) {
result->mtime = ne_httpdate_parse(data);
if (result->mtime == (time_t) -1)
result->mtime = ne_iso8601_parse(data);
if (result->mtime == (time_t) -1)
result->mtime = 0;
}
}
result->next = ctx->results;