6月 132012
 

Difficult to access the POST/GET/Cookie value in Varnish.
I want more easily to access it.
Therefore, I tried to make a VMOD to parse.

Feature

  • Support POST/GET request and Cookie header.
  • Support application/x-www-form-urlencoded and multipart/form-data Content-type in POST request.
  • Can be getting a list of key.
  • Support Varnish 3.0.1, 3.0.2 , 3.0.3-rc1

How to use

For example, how to set the response header from the POST key of hoge.
It’s a simple.


import parsereq;

vcl_recv{
  //please write "parsereq.init();" to 1st line in vcl_recv.
  parsereq.init();
}
vcl_deliver{
  set resp.http.hoge = parsereq.post_header("hoge");
}

Future plans

  • urlencode/decode
  • change the value and set to bereq
  • refactoring

I hope that this code is of help to you.

download here.
vmod-parsereq


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はこちら