diff options
author | Glenn Strauss <gstrauss@gluelogic.com> | 2020-06-11 21:55:47 -0400 |
---|---|---|
committer | Glenn Strauss <gstrauss@gluelogic.com> | 2020-07-08 22:51:31 -0400 |
commit | 965c47c85acde42864e3c271e9f75fd3a8a77b20 (patch) | |
tree | 58ad287de5d894ec72f9b2e23eba25fdf0126c6f | |
parent | a479d08b7cebb0f20e67dd173505093402f59aa0 (diff) | |
download | lighttpd-git-965c47c85acde42864e3c271e9f75fd3a8a77b20.tar.gz |
[mod_webdav] store webdav.opts as bitflags
-rw-r--r-- | src/mod_webdav.c | 44 |
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")); |