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-&gt;header_params) {<br>-            ignored = ngx_palloc(r-&gt;pool, flcf-&gt;header_params * sizeof(void *));<br>-            if (ignored == NULL) {<br>

+            if (ngx_list_init(&amp;ignore_bitmask, r-&gt;pool, 3, sizeof(uint64_t))<br>+                != NGX_OK)<br>+            {<br>                 return NGX_ERROR;<br>             }<br>+<br>+            bitmask = ngx_list_push(&amp;ignore_bitmask);<br>

+            if (bitmask == NULL) {<br>+                return NGX_ERROR;<br>+            }<br>+<br>+            *bitmask = 0;<br>         }<br> <br>         part = &amp;r-&gt;headers_in.headers.part;<br>         header = part-&gt;elts;<br>

 <br>-        for (i = 0; /* void */; i++) {<br>+        for (i = 0, k = 0; /* void */; i++, k++) {<br> <br>             if (i &gt;= part-&gt;nelts) {<br>                 if (part-&gt;next == NULL) {<br>@@ -767,6 +777,16 @@<br>

                     }<br>                 }<br> <br>+                if (k &gt;= sizeof(uint64_t) * 8) {<br>+                    bitmask = ngx_list_push(&amp;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 &lt; header[i].key.len; n++) {<br>

@@ -784,7 +804,7 @@<br>                 }<br> <br>                 if (ngx_hash_find(&amp;flcf-&gt;headers_hash, hash, lowcase_key, n)) {<br>-                    ignored[header_params++] = &amp;header[i];<br>+                    *bitmask |= (uint64_t) 1 &lt;&lt; k;<br>

                     continue;<br>                 }<br> <br>@@ -903,8 +923,13 @@<br>         part = &amp;r-&gt;headers_in.headers.part;<br>         header = part-&gt;elts;<br> <br>-        for (i = 0; /* void */; i++) {<br>

+        if (flcf-&gt;header_params) {<br>+            bitmask_part = &amp;ignore_bitmask.part;<br>+            bitmask = bitmask_part-&gt;elts;<br>+        }<br> <br>+        for (i = 0, k = 0; /* void */; i++, k++) {<br>

+<br>             if (i &gt;= part-&gt;nelts) {<br>                 if (part-&gt;next == NULL) {<br>                     break;<br>@@ -915,10 +940,26 @@<br>                 i = 0;<br>             }<br> <br>-            for (n = 0; n &lt; header_params; n++) {<br>

-                if (&amp;header[i] == ignored[n]) {<br>-                    goto next;<br>+            if (flcf-&gt;header_params) {<br>+<br>+                if (k &gt;= sizeof(uint64_t) * 8) {<br>+                    k = 0;<br>

+                    bm_index++;<br>                 }<br>+<br>+                if (bm_index &gt;= bitmask_part-&gt;nelts) {<br>+                    if (bitmask_part-&gt;next == NULL) {<br>+                        break;<br>

+                    }<br>+<br>+                    bitmask_part = bitmask_part-&gt;next;<br>+                    bitmask = bitmask_part-&gt;elts;<br>+                    bm_index = 0;<br>+                }<br>+<br>+                if (bitmask[bm_index] &amp; ((uint64_t) 1 &lt;&lt; k)) {<br>

+                    continue;<br>+                }<br>             }<br> <br>             key_len = sizeof(&quot;HTTP_&quot;) - 1 + header[i].key.len;<br>@@ -964,9 +1005,6 @@<br>                            &quot;fastcgi param: \&quot;%*s: %*s\&quot;&quot;,<br>

                            key_len, b-&gt;last - (key_len + val_len),<br>                            val_len, b-&gt;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">&lt;<a href="mailto:mdounin@mdounin.ru" target="_blank">mdounin@mdounin.ru</a>&gt;</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>
&gt; Thanks!<br>
&gt;<br>
&gt; I refactor the prev patch.<br>
&gt;<br>
&gt; this is new patch:<br>
<br>
</div>[...]<br>
<div><br>
&gt; @@ -707,7 +769,10 @@<br>
&gt;      ignored = NULL;<br>
&gt;<br>
&gt;      flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module);<br>
&gt; +    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);<br>
&gt;<br>
&gt; +    allow_underscores = cscf-&gt;underscores_in_headers;<br>
&gt; +<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 &quot;ignore_invalid_headers off;&quot;, even if<br>
undescores_in_headers is off.<br>
<div><br>
&gt;      if (flcf-&gt;params_len) {<br>
&gt;          ngx_memzero(&amp;le, sizeof(ngx_http_script_engine_t));<br>
&gt;<br>
&gt; @@ -784,6 +849,14 @@<br>
&gt;                  }<br>
&gt;<br>
&gt;                  if (ngx_hash_find(&amp;flcf-&gt;headers_hash, hash, lowcase_key,<br>
&gt; n)) {<br>
&gt; +<br>
&gt; +                    if (header_params == flcf-&gt;header_params<br>
&gt; +                       || ngx_http_fastcgi_ignored_header(ignored,<br>
&gt; &amp;header[i],<br>
&gt; +                           header_params, allow_underscores) == NGX_OK)<br>
&gt; +                    {<br>
&gt; +                        continue;<br>
&gt; +                    }<br>
&gt; +<br>
&gt;                      ignored[header_params++] = &amp;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>