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」という文字列を得ました。
これがちゃんとデコードできるか試してみます。
サンプルコードを参考に試行錯誤して書いた関数は以下のとおり。
- static ngx_int_t
- ngx_http_sample_handler(ngx_http_request_t *r)
- {
- ngx_str_t uri = ngx_string("%e6%97%a5%e6%9c%ac%e8%aa%9e");
- u_char *src, *dst;
- src = uri.data;
- dst = ngx_pnalloc(r->pool, uri.len);
- if (dst == NULL) {
- return NGX_ERROR;
- }
- uri.data = dst;
- ngx_unescape_uri(&dst, &src, uri.len, 0);
- uri.len = dst - uri.data;
- ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, "access sample module args:symfo value:%V", &uri);
- return NGX_OK;
- }
サーバーにアクセスすると、狙い通りデコード済のログが出力されます。
2014/12/21 15:12:01 [debug] 5852#0: *1 access sample module args:symfo value:日本語
クエリのデコード
リクエストで受け取った値のデコードを行ってみます。
- static ngx_int_t
- ngx_http_sample_handler(ngx_http_request_t *r)
- {
- ngx_str_t value;
- u_char *src, *dst;
- // 引数の受け取り
- if (ngx_http_arg(r, (u_char *) "symfo", 5, &value) != NGX_OK) {
- return NGX_ERROR;
- }
- // 元データ表示
- ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, "access sample module args:symfo value:%V", &value);
- // デコード実行
- src = value.data;
- dst = ngx_pnalloc(r->pool, value.len);
- if (dst == NULL) {
- return NGX_ERROR;
- }
- value.data = dst;
- ngx_unescape_uri(&dst, &src, value.len, 0);
- value.len = dst - value.data;
- ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, "access sample module args:symfo value:%V", &value);
- return NGX_OK;
- }
適当にこんな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
- 関連記事
-
- nginx拡張モジュール リクエストヘッダー情報を取得する
- nginx 拡張モジュールでapache2 mod_access_tokenを実装
- nginx 拡張モジュール URLデコードの方法(ngx_unescape_uri)
- nginx 拡張モジュール SHA1ハッシュの計算とbase64エンコード
- nginx 拡張モジュール 設定ファイルの値を取得する
コメント