2007年12月 6日

[ruby-list:44319] Re: multipartで送信した時のRails/cgi.rbの動作について

こせきです。
桑田さん、回答ありがとうございます。

On Dec 5, 2007 6:31 PM, Makoto Kuwata <kwa@xxxxx> wrote:
> 動作自体は仕様通りだと思うのですが、そもそもこの仕様が正しいのかと
> いう疑問はあります。
> type="file" の場合は値がTempfileオブジェクトでいいと思いますが、
> type="text" や type="radio" までもがTempfileオブジェクトになるのは

> なんか間違ってるように思います。
> Content-Disposition で filename が指定されていた場合のみTempfileに
> して、それ以外はStringでいいように思います。

そうですよね……。

メモリの問題があるとしても、/tmpに空のファイルを
作る理由は無いと思いました。

最初はStringIOに入れておいて、そのフィールドの入力が
一定サイズを超えたらTempfileに移行するといいのではと
思ったんですが、、。

> > 繰り返しpostするとDOS攻撃に利用できそうだと思ったんですが……。
> > このくらいは平気なものでしょうか。
>
> 確かに、個数制限を設けたほうがいいと思います。
> あと、1ファイルあたりのデータサイズの制限とかも。
> 今のcgi.rbだと、際限なく受け付けてしまいます。

うむむ。。

> 試しにパッチを作成してみました。Ruby1.8.6のcgi.rbをもとにしています。

ありがとうございます!
試してみます。

あと、大きなフォームをPOSTする実験をしていて、
いくつか自分が誤解していた事に気づきました。

■ POST時に古いtmpファイルはクリアされる。

ソースをちゃんと追ってないんですが、そういう動作を
しているようでした。無闇に増え続けるわけではないんですね。。

■ tmpファイルが一定数以上になるとToo many open file
で止まる。

Thu Dec 06 16:25:42 +0900 2007: Error calling Dispatcher.dispatch
#<Errno::EMFILE: Too many open files - /tmp/CGI.10296.1015>

手元の環境だと1000個ちょっとで止まっていました。
その後しばらくはエラーになったりしますが、
サーバ(mongrel/webrick)は動作し続けるようでした。

止まるまでに数分かかっていて、たぶん

irb(main):002:0> (1..1000).inject(0){|s,i| s + i}
=> 500500

50万回くらいループしているんだと思います。

--
koseki

投稿者 xml-rpc : 2007年12月 6日 17:36
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/67305
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。