CGIでWebDAVもどき

えー、フリーオがあるのですが、iCalを使って予約とかできるようにしたいなー、などと思い、いろいろやっているのですよ。
で、iCalを使うにはcaldavというWebDAVのwrapperみたいなのを使うといいらしいということなのですが、これがpythonで、やたらでかくて、もうちょっと簡単にできないかなーと思って調べてみるに、まぁ要するにRFC2445だと、HTTPでcontent-typeがtext/calendarのものをputしたりgetしたりdeleteしたりすればいいらしいということで、CGIWebDAVもどきを作って、text/calendarがきたらREQUEST_METHODに応じて内容を保存したり、更新したり、破棄したりすることにしました。それに、この方法だったらCGIの処理でDBにも情報を入れられるので、実際に録画したファイルの処理と連携がとりやすそうだし。で、mod_actionsを使えば、content-typeに応じた処理が可能になるということで、text/calendarに反応するcgirubyで書くことにしました。
で、cgi.rbを使ってみたのですが、どうもPUTされた内容が取れない。いや、とれるんだけど、順番がバラバラになってしまっている。で、cgi.rbを見てみると、とにかく受け取った情報はparseしてしまえという感じで、CGI::parseに渡ってしまっているんですね。せめてRFC2445に応じた形でparseしてくれていればまだ使えるんですが、とりあえず行の中でkeyとvalueになりそうな形を見繕ってhashに入れている様子。こういう場合、cgi.rbを継承するクラスを作って利用したり、ruby-devに改造案を送ったりすべきなんですかね、オープンソースであるrubyを使っている身としては。でもま、とりあえずcgi.rbを参考にしてreadlinesでPUTの内容をとって、ゴリゴリ処理することにします。
えー、もし変更するとしたら、こんな感じなんですかね。未テストですが。

*** /usr/lib/ruby/1.8/cgi.rb 2007-05-23 06:58:09.000000000 +0900
--- cgi.rb 2008-07-25 17:51:51.000000000 +0900
***************
*** 1107,1112 ****
--- 1107,1118 ----
boundary = $1.dup
@multipart = true
@params = read_multipart(boundary, Integer(env_table['CONTENT_LENGTH']))
+ elsif env_table['REQUEST_METHOD'] == "PUT"
+ if env_table['CONTENT_TYPE'] == "text/calendar"
+ @params = CGI::rfc2445parse(read_from_cmdline)
+ else
+ @content = read_from_cmdline
+ end
else
@multipart = false
@params = CGI::parse(

ていうかそもそも、rfc2445parseも作ってないから、このままだと動かないか。rfc2445parseができたら、ruby-devにちょっとだけ入ってみる、というのが正解なのかしらん。でも、rubyのエキスパートの人に見せられるソースができるのか、かなり不安。