6月 042012
 

Varnishは基本的にPOSTデータを解釈してなにかしらの処理をすることができません。
そこまで不便はないとは思うのですが、たとえば特定のキーワードがPOSTに入ってたら
Varnishではじきたいといったことは普通は出来ません。(インジェクションっぽいクエリとか)
そのためVarnishでPOSTを手軽に扱うためのVMODを作ってみました。

以下のような特徴・機能があります。
 ・application/x-www-form-urlencodedとmultipart/form-data両方に対応
 ・パースした値をreq.http.*に格納する
 ・指定されたヘッダにパースしていない生データを格納可能
 ・multipartのデータはurlencodeして格納
 ・multipartの生データは(扱いづらいので)application/x-www-form-urlencodedと同じ形式に直して格納
 ・multipart時のファイルについても格納

こんな感じで利用します。


//VCL
if(parsepost.parse("x-raw",true,"p_",true,true) == 1){
  std.log("raw: " + req.http.x-raw);
  std.log("submitter: " + req.http.p_submitter);
  std.log("submitter2: " + req.http.p_submitter2);
}

//response
12 VCL_Log      c raw: submitter=abcdef&submitter2=b
12 VCL_Log      c submitter: abcdef
12 VCL_Log      c submitter2: b

また特性上セッションワークスペースとスタックを多く使います。
そのためエラーが出る場合は
Varnishのsess_workspaceの値の引き上げとulimit -sの値の引き上げを行なってください。
またhttp_req_sizeを大きめにしておくと結果としてメモリの節約になります

あと生データは大きくなりがちなので使い終わったらunsetをおすすめします
そうしないとバックエンドにフェッチする際のリクエストに含まれてヘッダ大きすぎエラー(413 Request Entity Too Large/400 Bad Request)が出る可能性もあります。

ダウンロードはこちらから