Thank you very much!<br><br>this is my new patch, I use bitmask and ngx_list.<br><br>Index: src/http/modules/ngx_http_fastcgi_module.c<br>===================================================================<br>--- src/http/modules/ngx_http_fastcgi_module.c (revision 3937)<br>
+++ src/http/modules/ngx_http_fastcgi_module.c (working copy)<br>@@ -691,11 +691,13 @@<br> u_char ch, *pos, *lowcase_key;<br> size_t size, len, key_len, val_len, padding,<br>
allocated;<br>- ngx_uint_t i, n, next, hash, header_params;<br>+ uint64_t *bitmask;<br>+ ngx_uint_t i, k, n, next, hash, bm_index;<br>
ngx_buf_t *b;<br>+ ngx_list_t ignore_bitmask;<br> ngx_chain_t *cl, *body;<br>- ngx_list_part_t *part;<br>- ngx_table_elt_t *header, **ignored;<br>
+ ngx_list_part_t *part, *bitmask_part;<br>+ ngx_table_elt_t *header;<br> ngx_http_script_code_pt code;<br> ngx_http_script_engine_t e, le;<br> ngx_http_fastcgi_header_t *h;<br>
@@ -703,8 +705,8 @@<br> ngx_http_script_len_code_pt lcode;<br> <br> len = 0;<br>- header_params = 0;<br>- ignored = NULL;<br>+ bm_index = 0;<br>+ bitmask = NULL;<br> <br> flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module);<br>
<br>@@ -737,16 +739,24 @@<br> lowcase_key = NULL;<br> <br> if (flcf->header_params) {<br>- ignored = ngx_palloc(r->pool, flcf->header_params * sizeof(void *));<br>- if (ignored == NULL) {<br>
+ if (ngx_list_init(&ignore_bitmask, r->pool, 3, sizeof(uint64_t))<br>+ != NGX_OK)<br>+ {<br> return NGX_ERROR;<br> }<br>+<br>+ bitmask = ngx_list_push(&ignore_bitmask);<br>
+ if (bitmask == NULL) {<br>+ return NGX_ERROR;<br>+ }<br>+<br>+ *bitmask = 0;<br> }<br> <br> part = &r->headers_in.headers.part;<br> header = part->elts;<br>
<br>- for (i = 0; /* void */; i++) {<br>+ for (i = 0, k = 0; /* void */; i++, k++) {<br> <br> if (i >= part->nelts) {<br> if (part->next == NULL) {<br>@@ -767,6 +777,16 @@<br>
}<br> }<br> <br>+ if (k >= sizeof(uint64_t) * 8) {<br>+ bitmask = ngx_list_push(&ignore_bitmask);<br>+ if (bitmask == NULL) {<br>
+ return NGX_ERROR;<br>+ }<br>+<br>+ *bitmask = 0;<br>+ k = 0;<br>+ }<br>+<br> hash = 0;<br> <br> for (n = 0; n < header[i].key.len; n++) {<br>
@@ -784,7 +804,7 @@<br> }<br> <br> if (ngx_hash_find(&flcf->headers_hash, hash, lowcase_key, n)) {<br>- ignored[header_params++] = &header[i];<br>+ *bitmask |= (uint64_t) 1 << k;<br>
continue;<br> }<br> <br>@@ -903,8 +923,13 @@<br> part = &r->headers_in.headers.part;<br> header = part->elts;<br> <br>- for (i = 0; /* void */; i++) {<br>
+ if (flcf->header_params) {<br>+ bitmask_part = &ignore_bitmask.part;<br>+ bitmask = bitmask_part->elts;<br>+ }<br> <br>+ for (i = 0, k = 0; /* void */; i++, k++) {<br>
+<br> if (i >= part->nelts) {<br> if (part->next == NULL) {<br> break;<br>@@ -915,10 +940,26 @@<br> i = 0;<br> }<br> <br>- for (n = 0; n < header_params; n++) {<br>
- if (&header[i] == ignored[n]) {<br>- goto next;<br>+ if (flcf->header_params) {<br>+<br>+ if (k >= sizeof(uint64_t) * 8) {<br>+ k = 0;<br>
+ bm_index++;<br> }<br>+<br>+ if (bm_index >= bitmask_part->nelts) {<br>+ if (bitmask_part->next == NULL) {<br>+ break;<br>
+ }<br>+<br>+ bitmask_part = bitmask_part->next;<br>+ bitmask = bitmask_part->elts;<br>+ bm_index = 0;<br>+ }<br>+<br>+ if (bitmask[bm_index] & ((uint64_t) 1 << k)) {<br>
+ continue;<br>+ }<br> }<br> <br> key_len = sizeof("HTTP_") - 1 + header[i].key.len;<br>@@ -964,9 +1005,6 @@<br> "fastcgi param: \"%*s: %*s\"",<br>
key_len, b->last - (key_len + val_len),<br> val_len, b->last - val_len);<br>- next:<br>-<br>- continue;<br> }<br> }<br><br> <br> <br>
<br><div class="gmail_quote">On Sat, Jun 11, 2011 at 8:30 PM, Maxim Dounin <span dir="ltr"><<a href="mailto:mdounin@mdounin.ru" target="_blank">mdounin@mdounin.ru</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello!<br>
<div><br>
On Fri, Jun 10, 2011 at 04:55:55PM +0800, Simon Liu wrote:<br>
<br>
> Thanks!<br>
><br>
> I refactor the prev patch.<br>
><br>
> this is new patch:<br>
<br>
</div>[...]<br>
<div><br>
> @@ -707,7 +769,10 @@<br>
> ignored = NULL;<br>
><br>
> flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module);<br>
> + cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);<br>
><br>
> + allow_underscores = cscf->underscores_in_headers;<br>
> +<br>
<br>
</div>This is a layering violation. This is also a good example of why<br>
layering violation is bad: this is incorrect as underscores may as<br>
well appear in headers with "ignore_invalid_headers off;", even if<br>
undescores_in_headers is off.<br>
<div><br>
> if (flcf->params_len) {<br>
> ngx_memzero(&le, sizeof(ngx_http_script_engine_t));<br>
><br>
> @@ -784,6 +849,14 @@<br>
> }<br>
><br>
> if (ngx_hash_find(&flcf->headers_hash, hash, lowcase_key,<br>
> n)) {<br>
> +<br>
> + if (header_params == flcf->header_params<br>
> + || ngx_http_fastcgi_ignored_header(ignored,<br>
> &header[i],<br>
> + header_params, allow_underscores) == NGX_OK)<br>
> + {<br>
> + continue;<br>
> + }<br>
> +<br>
> ignored[header_params++] = &header[i];<br>
<br>
</div>I would suggest using bitmask sized after number of headers in<br>
request instead.<br>
<br>
Alternatively, nginx dynamically sized array or list may be used<br>
for ignored, this should be a bit closer to original code. Though<br>
I personally think bitmask would be better.<br>
<div><div></div><div><br>
Maxim Dounin<br>
<br>
_______________________________________________<br>
nginx-devel mailing list<br>
<a href="mailto:nginx-devel@nginx.org" target="_blank">nginx-devel@nginx.org</a><br>
<a href="http://nginx.org/mailman/listinfo/nginx-devel" target="_blank">http://nginx.org/mailman/listinfo/nginx-devel</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>博观约取<br><br>豆瓣:<a href="http://www.douban.com/people/mustang/" target="_blank">www.douban.com/people/mustang/</a><br><br>blog: <a href="http://www.pagefault.info" target="_blank">www.pagefault.info</a><br>
<br>twitter: <a href="http://www.twitter.com/minibobo" target="_blank">www.twitter.com/minibobo</a><br><br>sina 微博: <a href="http://www.weibo.com/diaoliang" target="_blank">www.weibo.com/diaoliang</a><br><br>