uwsgi: added "if_not_empty" flag support to the "uwsgi_param" directive.

This commit is contained in:
Valentin Bartenev 2011-12-09 13:47:04 +00:00
parent bf51ac2b4b
commit a5e50b92f1

View file

@ -305,8 +305,8 @@ static ngx_command_t ngx_http_uwsgi_commands[] = {
&ngx_http_uwsgi_next_upstream_masks }, &ngx_http_uwsgi_next_upstream_masks },
{ ngx_string("uwsgi_param"), { ngx_string("uwsgi_param"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2, NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE23,
ngx_conf_set_keyval_slot, ngx_http_upstream_param_set_slot,
NGX_HTTP_LOC_CONF_OFFSET, NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_uwsgi_loc_conf_t, params_source), offsetof(ngx_http_uwsgi_loc_conf_t, params_source),
NULL }, NULL },
@ -553,7 +553,7 @@ ngx_http_uwsgi_create_request(ngx_http_request_t *r)
{ {
u_char ch, *lowcase_key; u_char ch, *lowcase_key;
size_t key_len, val_len, len, allocated; size_t key_len, val_len, len, allocated;
ngx_uint_t i, n, hash, header_params; ngx_uint_t i, n, hash, skip_empty, header_params;
ngx_buf_t *b; ngx_buf_t *b;
ngx_chain_t *cl, *body; ngx_chain_t *cl, *body;
ngx_list_part_t *part; ngx_list_part_t *part;
@ -583,11 +583,18 @@ ngx_http_uwsgi_create_request(ngx_http_request_t *r)
lcode = *(ngx_http_script_len_code_pt *) le.ip; lcode = *(ngx_http_script_len_code_pt *) le.ip;
key_len = lcode(&le); key_len = lcode(&le);
lcode = *(ngx_http_script_len_code_pt *) le.ip;
skip_empty = lcode(&le);
for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode (&le)) { for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode (&le)) {
lcode = *(ngx_http_script_len_code_pt *) le.ip; lcode = *(ngx_http_script_len_code_pt *) le.ip;
} }
le.ip += sizeof(uintptr_t); le.ip += sizeof(uintptr_t);
if (skip_empty && val_len == 0) {
continue;
}
len += 2 + key_len + 2 + val_len; len += 2 + key_len + 2 + val_len;
} }
} }
@ -706,11 +713,28 @@ ngx_http_uwsgi_create_request(ngx_http_request_t *r)
lcode = *(ngx_http_script_len_code_pt *) le.ip; lcode = *(ngx_http_script_len_code_pt *) le.ip;
key_len = (u_char) lcode (&le); key_len = (u_char) lcode (&le);
lcode = *(ngx_http_script_len_code_pt *) le.ip;
skip_empty = lcode(&le);
for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) { for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) {
lcode = *(ngx_http_script_len_code_pt *) le.ip; lcode = *(ngx_http_script_len_code_pt *) le.ip;
} }
le.ip += sizeof(uintptr_t); le.ip += sizeof(uintptr_t);
if (skip_empty && val_len == 0) {
e.skip = 1;
while (*(uintptr_t *) e.ip) {
code = *(ngx_http_script_code_pt *) e.ip;
code((ngx_http_script_engine_t *) &e);
}
e.ip += sizeof(uintptr_t);
e.skip = 0;
continue;
}
*e.pos++ = (u_char) (key_len & 0xff); *e.pos++ = (u_char) (key_len & 0xff);
*e.pos++ = (u_char) ((key_len >> 8) & 0xff); *e.pos++ = (u_char) ((key_len >> 8) & 0xff);
@ -1379,9 +1403,9 @@ ngx_http_uwsgi_merge_params(ngx_conf_t *cf, ngx_http_uwsgi_loc_conf_t *conf,
#if (NGX_HTTP_CACHE) #if (NGX_HTTP_CACHE)
ngx_array_t params_merged; ngx_array_t params_merged;
#endif #endif
ngx_keyval_t *src;
ngx_hash_key_t *hk; ngx_hash_key_t *hk;
ngx_hash_init_t hash; ngx_hash_init_t hash;
ngx_http_upstream_param_t *src;
ngx_http_script_compile_t sc; ngx_http_script_compile_t sc;
ngx_http_script_copy_code_t *copy; ngx_http_script_copy_code_t *copy;
@ -1442,9 +1466,11 @@ ngx_http_uwsgi_merge_params(ngx_conf_t *cf, ngx_http_uwsgi_loc_conf_t *conf,
#if (NGX_HTTP_CACHE) #if (NGX_HTTP_CACHE)
if (conf->upstream.cache) { if (conf->upstream.cache) {
ngx_keyval_t *h, *s; ngx_keyval_t *h;
ngx_http_upstream_param_t *s;
if (ngx_array_init(&params_merged, cf->temp_pool, 4, sizeof(ngx_keyval_t)) if (ngx_array_init(&params_merged, cf->temp_pool, 4,
sizeof(ngx_http_upstream_param_t))
!= NGX_OK) != NGX_OK)
{ {
return NGX_ERROR; return NGX_ERROR;
@ -1478,7 +1504,9 @@ ngx_http_uwsgi_merge_params(ngx_conf_t *cf, ngx_http_uwsgi_loc_conf_t *conf,
return NGX_ERROR; return NGX_ERROR;
} }
*s = *h; s->key = h->key;
s->value = h->value;
s->skip_empty = 0;
next: next:
@ -1520,6 +1548,15 @@ ngx_http_uwsgi_merge_params(ngx_conf_t *cf, ngx_http_uwsgi_loc_conf_t *conf,
copy->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code; copy->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code;
copy->len = src[i].key.len; copy->len = src[i].key.len;
copy = ngx_array_push_n(conf->params_len,
sizeof(ngx_http_script_copy_code_t));
if (copy == NULL) {
return NGX_ERROR;
}
copy->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code;
copy->len = src[i].skip_empty;
size = (sizeof(ngx_http_script_copy_code_t) size = (sizeof(ngx_http_script_copy_code_t)
+ src[i].key.len + sizeof(uintptr_t) - 1) + src[i].key.len + sizeof(uintptr_t) - 1)