summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn Strauss <gstrauss@gluelogic.com>2020-06-11 21:55:47 -0400
committerGlenn Strauss <gstrauss@gluelogic.com>2020-07-08 22:51:31 -0400
commit965c47c85acde42864e3c271e9f75fd3a8a77b20 (patch)
tree58ad287de5d894ec72f9b2e23eba25fdf0126c6f
parenta479d08b7cebb0f20e67dd173505093402f59aa0 (diff)
downloadlighttpd-git-965c47c85acde42864e3c271e9f75fd3a8a77b20.tar.gz
[mod_webdav] store webdav.opts as bitflags
-rw-r--r--src/mod_webdav.c44
1 files changed, 26 insertions, 18 deletions
diff --git a/src/mod_webdav.c b/src/mod_webdav.c
index e8bbbd64..1aa5941f 100644
--- a/src/mod_webdav.c
+++ b/src/mod_webdav.c
@@ -315,16 +315,19 @@ typedef struct {
#endif
} sql_config;
+enum { /* opts bitflags */
+ MOD_WEBDAV_UNSAFE_PARTIAL_PUT_COMPAT = 0x1
+};
+
typedef struct {
unsigned short enabled;
unsigned short is_readonly;
unsigned short log_xml;
- unsigned short deprecated_unsafe_partial_put_compat;
+ unsigned short opts;
sql_config *sql;
buffer *tmpb;
buffer *sqlite_db_name; /* not used after worker init */
- array *opts;
} plugin_config;
typedef struct {
@@ -404,8 +407,7 @@ static void mod_webdav_merge_config_cpv(plugin_config * const pconf, const confi
break;
case 4: /* webdav.opts */
if (cpv->vtype == T_CONFIG_LOCAL)
- pconf->deprecated_unsafe_partial_put_compat =
- (unsigned short)cpv->v.u;
+ pconf->opts = (unsigned short)cpv->v.u;
break;
default:/* should not happen */
return;
@@ -485,19 +487,24 @@ SETDEFAULTS_FUNC(mod_webdav_set_defaults) {
case 3: /* webdav.log-xml */
break;
case 4: /* webdav.opts */
- for (uint32_t j = 0, used = cpv->v.a->used; j < used; ++j) {
- data_string *ds = (data_string *)cpv->v.a->data[j];
- if (buffer_is_equal_string(&ds->key,
- CONST_STR_LEN("deprecated-unsafe-partial-put"))) {
- cpv->v.u =
- buffer_eq_slen(&ds->value,CONST_STR_LEN("enable"));
- cpv->vtype = T_CONFIG_LOCAL;
- continue;
+ if (cpv->v.a->used) {
+ unsigned short opts = 0;
+ for (uint32_t j = 0, used = cpv->v.a->used; j < used; ++j) {
+ data_string *ds = (data_string *)cpv->v.a->data[j];
+ if (buffer_is_equal_string(&ds->key,
+ CONST_STR_LEN("deprecated-unsafe-partial-put"))
+ && buffer_eq_slen(&ds->value,
+ CONST_STR_LEN("enable"))) {
+ opts |= MOD_WEBDAV_UNSAFE_PARTIAL_PUT_COMPAT;
+ continue;
+ }
+ log_error(srv->errh, __FILE__, __LINE__,
+ "unrecognized webdav.opts: %.*s",
+ BUFFER_INTLEN_PTR(&ds->key));
+ return HANDLER_ERROR;
}
- log_error(srv->errh, __FILE__, __LINE__,
- "unrecognized webdav.opts: %.*s",
- BUFFER_INTLEN_PTR(&ds->key));
- return HANDLER_ERROR;
+ cpv->v.u = opts;
+ cpv->vtype = T_CONFIG_LOCAL;
}
break;
default:/* should not happen */
@@ -4239,7 +4246,8 @@ mod_webdav_put_prep (request_st * const r, const plugin_config * const pconf)
{
if (NULL != http_header_request_get(r, HTTP_HEADER_OTHER,
CONST_STR_LEN("Content-Range"))) {
- if (pconf->deprecated_unsafe_partial_put_compat) return HANDLER_GO_ON;
+ if (pconf->opts & MOD_WEBDAV_UNSAFE_PARTIAL_PUT_COMPAT)
+ return HANDLER_GO_ON;
/* [RFC7231] 4.3.4 PUT
* An origin server that allows PUT on a given target resource MUST
* send a 400 (Bad Request) response to a PUT request that contains a
@@ -4476,7 +4484,7 @@ mod_webdav_put (request_st * const r, const plugin_config * const pconf)
return HANDLER_FINISHED;
}
- if (pconf->deprecated_unsafe_partial_put_compat) {
+ if (pconf->opts & MOD_WEBDAV_UNSAFE_PARTIAL_PUT_COMPAT) {
const buffer * const h =
http_header_request_get(r, HTTP_HEADER_OTHER,
CONST_STR_LEN("Content-Range"));