ruby-trunk-changes r34341 - r34347

今日は Net::HTTP の persistent connection のサーバ側のタイムアウトに対応する修正と CGI.escape の修正などがありました。

naruse:r34341 2012-01-20 14:56:35 +0900

Net::HTTP でサーバとの接続を保持したままリクエストを送信する場合、サーバ側でタイムアウトして接続を閉じられてしまったために read に失敗することがあり、その場合 GET, HEAD など繰り返し実行しても問題ないリクエストの場合は自動的にリトライするべきらしいので EOFError, Errno::ECONNRESET が発生したら一旦ソケットを閉じて再接続して 1度だけリトライするようにしています。ちなみに DELETE も IDEMPOTENT なリクエストなんですね。 POST だととりあえず例外がそのまま発生するようになっています(ただし後述のように Net::HTTP 側もタイムアウトを持つようになっているので、絶妙なタイミングで close されたソケットから読む可能性はのこっているものの、繋げっぱなしの Net::HTTP を時間を空けて使い回すぶんには大丈夫になっているはずです)。 [ruby-dev:45030] [Bug #5790] [ruby-core:41821] [Bug #5813]
また Net::HTTP のクライアント側でもタイムアウトの設定を持つようにして、リクエストを送信する時に前回の通信から一定時間が経っていたら接続しなおすようにしています。デフォルトのタイムアウト時間は 2秒になっています。 Net::HTTP#keep_alive_timeout= で秒単位で設定できるようになっています。

svn:r34342 2012-01-20 14:56:40 +0900

version.h の日付更新。

nobu:r34343 2012-01-20 17:27:24 +0900

r34327 で $0 への代入でプロセス名を変更する機能を Mac OS X (Darwin) でサポートするようにしたので、そのためのテストのスキップの条件も変更して Darwin 上でテスト対象とするようにしています。

naruse:r34345 2012-01-20 17:39:24 +0900

vm.c, vm_insnhelper.c での clang でコンパイルした時の最適化で Fiber などがうまく動かないのを最適化避けを作って対処していたところは r34278 の Continuation のスタック領域の切り替え時の最適化を回避するので修正されたようで、これらは削除されています。

mrkn:r34346 2012-01-20 20:48:52 +0900

CGI.escape で渡された文字列にそのエンコーディングにおいて不正な文字が含まれている場合に例外が発生してしまうので、一旦 ASCII-8BIT に変換してエスケープ処理した後に元のエンコーディングに戻すようにしています。 [ruby-dev:45139] [Bug #5913]

mrkn:r34347 2012-01-20 20:51:00 +0900

r34346 の ChangeLog のエントリにチケット番号の参照を追加しています。