Прикладная демонология, практические рецепты

Заголовки запроса в виде хеша Perl

В поставке веб-сервера Nginx имеется встроенная поддержка интерпретатора Perl.
Интерфейсный метод header_in позволяет получить значение произвольного заголовка запроса.
Но иногда, в процессе веб-разработки, появляется потребность получить все заголовки запроса в виде хеша (например чтобы проитерироваться по заголовкам с известным префиксом).
В этом случае может помочь приведенный ниже патч (проверен на ряде крупных проектов).

--- src/http/modules/perl/nginx.xs.orig 2011-12-20 21:46:31.000000000 +0400
+++ src/http/modules/perl/nginx.xs  2011-12-20 21:46:35.000000000 +0400
@@ -214,6 +214,44 @@
     ST(0) = TARG;


+HV*
+headers_in(r)
+    CODE:
+
+    dXSTARG;
+    ngx_http_request_t  *r;
+    ngx_list_part_t     *part;
+    ngx_table_elt_t     *h;
+    ngx_uint_t           i;
+    HV *hh;
+    SV *v;
+
+    ngx_http_perl_set_request(r);
+
+    hh = newHV();
+
+    part = &r->headers_in.headers.part;
+    h = part->elts;
+
+    for (i = 0;; i++) {
+        if (i >= part->nelts) {
+            if (!part->next)
+                break;
+            part = part->next;
+            h = part->elts;
+            i = 0;
+        }
+        v = newSVpv(h[i].value.data, h[i].value.len);
+        hv_store(hh, h[i].key.data, h[i].key.len, v, 0);
+    }
+
+    RETVAL = hh;
+    sv_2mortal((SV*)RETVAL);
+
+    OUTPUT:
+        RETVAL
+
+
 void
 header_in(r, key)
     CODE: