この前のエントリでPOSTを扱うVMODを作ってみたというのを上げたのですが
あの後、使ってくれた人とかからインタフェース変えるとイイヨーイイヨーと言われたので
req.http.*に格納するのではなくvmod_curlのように良い感じに使いやすくしてみました。
それだけじゃつまらないということで、おまけでGETとCOOKIEに対応してみました。
今回の特徴は以下です。
・application/x-www-form-urlencodedとmultipart/form-data両方に対応
・GET・POST・COOKIEに対応
・格納されているキーの一覧を取得することができます。
インラインCと併用することですべてのGET・POST・COOKIEのキーに対して特定の値
(攻撃っぽいコードなど)が含まれているかなどのチェックが容易です
使い方はこんな感じです。
たとえばPOSTでhogeというキーを取得してレスポンスする場合はこんな感じです。
import parsereq; vcl_recv{ parsereq.init();//必ずvcl_recvの先頭で宣言する } vcl_deliver{ set resp.http.hoge = parsereq.post_header("hoge"); }
前に比べてわかりやすくなったんではないかと思います。
また今回は値はurlencodeされていません。生の値です。
そのため改行を含む可能性がある場合はresp.http.*などに含めると
意図しない結果が起きるので注意が必要です。
ココらへんはencode/decodeメソッドを用意して解決する予定ですので
少し待ってもらえるとありがたいです。
関数はこんな感じです。
VOID init()
初期化を行う。
必ずvcl_recvの先頭で呼び出す必要があります。
INT errcode()
初期化の結果を受け取る
(成功) 2 content-typeが無いかサポート外 (成功) 1 パースに成功 (失敗) -1 sess_workspaceの残りサイズがなくなってメモリ確保に失敗 (失敗) -2 content-lengthが無い (失敗) -3 読み取れるサイズがcontent-length以下
STRING post_header(STRING)
STRING get_header(STRING)
STRING cookie_header(STRING)
指定したキーの値を取得する
STRING post_body()
STRING get_body()
STRING cookie_body()
POST,GET,COOKIEの生データを取得
STRING post_read_keylist()
STRING get_read_keylist()
STRING cookie_read_keylist()
呼び出すごとに格納されているキーを取得する
//req /?name1=a&name2=b //vcl vcl_deliver{ set resp.http.n1 = parsereq.get_read_keylist(); set resp.http.n2 = parsereq.get_read_keylist(); //nothing set resp.http.n3 = parsereq.get_read_keylist(); } //return n1: name2 n2: name1
VOID post_seek_reset()
VOID get_seek_reset()
VOID cookie_seek_reset()
前述のXXX_read_keylistで、何処まで取得したかをリセットする。
リセットしてXXX_read_keylistを呼び出すとまた最初から読み出す。
今後リリースされる3.0.3についても
rc1において正常動作を確認していますので多分動くと思います。
基本的に3.0.1以降であれば動きます。
今後の予定は
・エンコード・デコードロジック追加
・値の変更した後にリビルドしてそれを使う
・コードが若干カオスってるので綺麗にする
・etc…
です