nginx 拡張モジュール URLデコードの方法(ngx_unescape_uri)

nginx拡張モジュールの作り方を調べています。
nginx モジュール作成 メソッド、URL、クエリパラメーターの取得方法

クエリパラメーターを取得してみたところ、URLエンコード済みの値で、
自動的にデコードは行われないようでした。

URLデコードする方法を調べてみます。



デコード関数



デコード用の関数がないか調べてみると
core/ngx_string.c


void
ngx_unescape_uri(u_char **dst, u_char **src, size_t size, ngx_uint_t type)



これが使えそうです。


使い方の例を調べてみると

http/ngx_http_parse.c


ngx_int_t
ngx_http_parse_unsafe_uri(ngx_http_request_t *r, ngx_str_t *uri, ngx_str_t *args, ngx_uint_t *flags)



ここが参考になりました。





簡単なサンプル



クエリを受け取る前に、関数の使い方を調べます。
http://www.tagindex.com/cgi-lib/encode/url.cgi

こちらで適当な文字列をutf-8でエンコード。
「%e6%97%a5%e6%9c%ac%e8%aa%9e」という文字列を得ました。

これがちゃんとデコードできるか試してみます。

サンプルコードを参考に試行錯誤して書いた関数は以下のとおり。


  1. static ngx_int_t
  2. ngx_http_sample_handler(ngx_http_request_t *r)
  3. {
  4.     
  5.     ngx_str_t uri = ngx_string("%e6%97%a5%e6%9c%ac%e8%aa%9e");
  6.     u_char *src, *dst;
  7.     
  8.     src = uri.data;
  9.     dst = ngx_pnalloc(r->pool, uri.len);
  10.     if (dst == NULL) {
  11.         return NGX_ERROR;
  12.     }
  13.     uri.data = dst;
  14.     ngx_unescape_uri(&dst, &src, uri.len, 0);
  15.     uri.len = dst - uri.data;
  16.     
  17.     ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, "access sample module args:symfo value:%V", &uri);
  18.     return NGX_OK;
  19. }



サーバーにアクセスすると、狙い通りデコード済のログが出力されます。


2014/12/21 15:12:01 [debug] 5852#0: *1 access sample module args:symfo value:日本語








クエリのデコード



リクエストで受け取った値のデコードを行ってみます。


  1. static ngx_int_t
  2. ngx_http_sample_handler(ngx_http_request_t *r)
  3. {
  4.     
  5.     ngx_str_t value;
  6.     u_char *src, *dst;
  7.     
  8.     // 引数の受け取り
  9.     if (ngx_http_arg(r, (u_char *) "symfo", 5, &value) != NGX_OK) {
  10.         return NGX_ERROR;
  11.     }
  12.     
  13.     // 元データ表示
  14.     ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, "access sample module args:symfo value:%V", &value);
  15.     
  16.     
  17.     // デコード実行
  18.     src = value.data;
  19.     dst = ngx_pnalloc(r->pool, value.len);
  20.     if (dst == NULL) {
  21.         return NGX_ERROR;
  22.     }
  23.     
  24.     value.data = dst;
  25.     ngx_unescape_uri(&dst, &src, value.len, 0);
  26.     value.len = dst - value.data;
  27.     
  28.     ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, "access sample module args:symfo value:%V", &value);
  29.     return NGX_OK;
  30. }





適当にこんなgetリクエストを行ってみます。
http://192.168.1.102/test.html?symfo=%E3%82%B7%E3%83%B3%E3%83%95%E3%82%A9


狙い通りのログが出力されました。


2014/12/21 15:19:39 [debug] 5912#0: *1 access sample module args:symfo value:シンフォ






【参考URL】

http://lxr.nginx.org/ident
関連記事

コメント

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
https://symfo.web.fc2.com/

PR

検索フォーム

月別アーカイブ