Symfoware

Symfowareについての考察blog

nginx拡張モジュール リクエストヘッダー情報を取得する

nginx拡張モジュールでリクエストヘッダーの情報を取得する方法を調べてみました。


参考ソース



参考になたのは、lua-nginx-moduleです。
lua-nginx-module

ngx_http_lua_headers.cのngx_http_lua_ngx_req_get_headersあたりを
見ながらプログラムを書いています。

ngx_http_lua_headers.c




サンプル



サンプルはこんな感じになりました。


  1. #include <ngx_config.h>
  2. #include <ngx_core.h>
  3. #include <ngx_http.h>
  4. static ngx_int_t ngx_http_sample_handler(ngx_http_request_t *r);
  5. static ngx_int_t ngx_http_sample_init(ngx_conf_t *cf);
  6. static ngx_http_module_t ngx_http_sample_module_ctx = {
  7.     NULL, /* preconfiguration */
  8.     ngx_http_sample_init, /* postconfiguration */
  9.     NULL, /* create main configuration */
  10.     NULL, /* init main configuration */
  11.     NULL, /* create server configuration */
  12.     NULL, /* merge server configuration */
  13.     NULL, /* create location configuration */
  14.     NULL /* merge location configuration */
  15. };
  16. ngx_module_t ngx_http_sample_module = {
  17.     NGX_MODULE_V1,
  18.     &ngx_http_sample_module_ctx, /* module context */
  19.     NULL, /* module directives */
  20.     NGX_HTTP_MODULE,             /* module type */
  21.     NULL,                         /* init master */
  22.     NULL,                         /* init module */
  23.     NULL,                         /* init process */
  24.     NULL,                         /* init thread */
  25.     NULL,                         /* exit thread */
  26.     NULL,                         /* exit process */
  27.     NULL,                         /* exit master */
  28.     NGX_MODULE_V1_PADDING
  29. };
  30. // 初期化処理
  31. static ngx_int_t
  32. ngx_http_sample_init(ngx_conf_t *cf)
  33. {
  34.     ngx_http_handler_pt        *h;
  35.     ngx_http_core_main_conf_t *cmcf;
  36.     cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
  37.     h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers);
  38.     if (h == NULL) {
  39.         return NGX_ERROR;
  40.     }
  41.     *h = ngx_http_sample_handler;
  42.     
  43.     return NGX_OK;
  44. }
  45. static ngx_int_t
  46. ngx_http_sample_handler(ngx_http_request_t *r)
  47. {
  48.     
  49.     ngx_list_part_t             *part;
  50.     ngx_table_elt_t             *header;
  51.     ngx_uint_t                    i;
  52.     
  53.     // リクエストからヘッダー情報を取得
  54.     part = &r->headers_in.headers.part;
  55.     header = part->elts;
  56.     
  57.     while (part) {
  58.         header = part->elts;
  59.         
  60.         // neltsがヘッダー情報の個数
  61.         for (i = 0; i < part->nelts; i++) {
  62.             ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0,
  63.                          "request header: \"%V: %V\"",
  64.                          &header[i].key, &header[i].value);
  65.         }
  66.         
  67.         part = part->next;
  68.     }
  69.     
  70.     return NGX_OK;
  71. }




r->headers_in.headers.partでヘッダーのパーツを取得。
ループしながら全件表示します。


テストに使用したPythonプログラムは以下のとおり。


  1. # -*- coding:utf-8 -*-
  2. import urllib
  3. import urllib2
  4. import base64
  5. url = "http://192.168.1.102/"
  6. req = urllib2.Request(url)
  7. req.add_header('file-name', 'upload.png')
  8. res = urllib2.urlopen(req)
  9. print res.read()




ちゃんと独自ヘッダーも読めていますね。


2014/12/21 17:31:37 [debug] 11164#0: *1 request header: "Accept-Encoding: identity"
2014/12/21 17:31:37 [debug] 11164#0: *1 request header: "Host: 192.168.1.102"
2014/12/21 17:31:37 [debug] 11164#0: *1 request header: "User-Agent: Python-urllib/2.7"
2014/12/21 17:31:37 [debug] 11164#0: *1 request header: "Connection: close"
2014/12/21 17:31:37 [debug] 11164#0: *1 request header: "File-Name: upload.png"





注意点としては、「file-name」というヘッダー名でリクエストを送っても
「File-Name」と正規化された値が取得できるという点でしょうか。
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2014/12/21(日) 17:34:23|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<遅延環境変数の展開を行わずforループ内で変数を参照する | ホーム | nginx 拡張モジュールでapache2 mod_access_tokenを実装>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1571-be49c95f
この記事にトラックバックする(FC2ブログユーザー)