6月 102012
 

この前のエントリで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…
です

downloadはこちら


 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください