ruby-trunk-changes r62935 - r63008

今日は webrick, tmpdir, tempfile, socket など標準添付ライブラリの不具合修正がたくさんありました。

ko1: r62935 2018-03-28 12:18:00 +0900

r62924 の rdoc 更新で正規表現の文字クラス内で "-" のエスケープ漏れで文字クラス重複の警告が出てたので修正しています。

svn: r62936 2018-03-28 12:18:01 +0900

version.h の日付更新。

nobu: r62952 2018-03-28 16:01:48 +0900

Windows 環境で File.expand_path で "~" を展開した時に環境変数 HOME がドライブレターつきの相対パスだった時(そんなのありなのかな)に絶対パスとして展開してしまっていたのを修正しています。 [ruby-core:86356] [Bug #14638]

normal: r62953 2018-03-28 17:05:46 +0900

標準添付ライブラリ webrickWEBrick::HTTPResponse#_write_data というメソッドでソケットへの書き込みしていたのを write メソッドを直接呼ぶようにリファクタリングしています。

normal: r62954 2018-03-28 17:05:52 +0900

標準添付ライブラリ webrickWEBrick::HTTPResponse で読み書きを IO.copy_stream を利用するようにしています。 [ruby-core:84456] [Feature #14237]

normal: r62955 2018-03-28 17:05:57 +0900

標準添付ライブラリ webrickWEBrick::HTTPResponse で Content-Range ヘッダの指定があった時にも IO.copy_stream を利用するようにしています。

normal: r62956 2018-03-28 17:06:02 +0900

r62955 に関するテストを追加しています。

normal: r62957 2018-03-28 17:06:08 +0900

標準添付ライブラリ webrick で multipart のレスポンスで複数の範囲を含む Content-Range ヘッダがあった時に chunked で返すようにしています。

normal: r62958 2018-03-28 17:06:13 +0900

標準添付ライブラリ webrickWEBrick::HTTPResponse::ChunkedWrapper#write メソッドを書き込んだ byte 数を返すように IO#write 互換にしています。alias だった << メソッドも定義して明示的に self を返すようにしています。

normal: r62959 2018-03-28 17:06:18 +0900

標準添付ライブラリ webrick の multipart で複数の範囲を含む Content-Type が指定された時に IO.copy_stream を利用する実装に変更しています。

normal: r62960 2018-03-28 17:06:23 +0900

標準添付ライブラリ webrick でリクエストのヘッダ領域として読む上限を 112KB と定めてそれを超えたら例外を発生させて接続を閉じるようにしています。

normal: r62961 2018-03-28 17:06:28 +0900

標準添付ライブラリ webrickWEBrick::HTTPServlet::CGIHandler で WEBrick::HTTPRequest#body メソッドをブロック付きで呼び出してちょっとずつ読むようにしています。

normal: r62962 2018-03-28 17:06:34 +0900

標準添付ライブラリ webrickWEBrick::HTTPRequest で例外クラスの定数の参照がまちがってて NameError になってたのを修正しています。

normal: r62963 2018-03-28 17:06:39 +0900

標準添付ライブラリ webrickWEBrick::HTTPRequest#read_chunked で @buffer_size のサイズ毎に読み込んでコールバックに渡すようにしています。

normal: r62964 2018-03-28 17:06:44 +0900

標準添付ライブラリ webrick で digest 認証の機能のテストを追加しています。

normal: r62965 2018-03-28 17:06:49 +0900

標準添付ライブラリ webrick の digest 認証で digest の計算を WEBrick::HTTPRequest#body のブロック付き呼び出しを使って少しずつ読み込むようにしています。

normal: r62966 2018-03-28 17:06:55 +0900

標準添付ライブラリ webrickWEBrick::HTTPProxyServer でも chunked のリクエストをちょっとずつ読み書きする対応を入れています。 Fiber 使ってる…。

normal: r62967 2018-03-28 17:38:21 +0900

IO#write に引数を渡さなかった時(2.5 から複数の引数が渡せるようになったので、引数なしでも呼べるようになった) self が渡されたかのように出力していたので何も出力せず 0 を返すようにしています。 [ruby-core:86285] [Bug #14338]

normal: r62968 2018-03-28 17:38:26 +0900

標準添付ライブラリ webrick でレスポンスのヘッダの値に改行が含まれていたらエラーにするようにしています。

nobu: r62969 2018-03-28 17:48:52 +0900

r62966 のテストのインデント修正。

nobu: r62989 2018-03-28 18:58:52 +0900

Dir の各種メソッドでファイルパスとして NUL 文字が含まれた文字列が渡されたら ArgumentError を発生させるようにしています。

hsbt: r62990 2018-03-28 19:03:03 +0900

標準添付ライブラリ tmpdir でディレクトリ名の元になる prefix に File::SEPARATOR が含まれてたら削るようにしています。

nobu: r62991 2018-03-28 19:08:57 +0900

標準添付ライブラリ socket の UNIXSocket でファイルパスとして NUL 文字を含む文字列が渡されたら ArgumentError を発生させるようにしていす。

nobu: r62992 2018-03-28 19:12:17 +0900

String#unpack で "@" 指示子による位置の指定が大きすぎて underflow して負の値になった時に RangeError を発生させるようにしています。

nobu: r62993 2018-03-28 19:22:57 +0900

標準添付ライブラリ time.rb で正規表現を使ったチェックで Regexp#match? を使うように最適化しています。 https://github.com/ruby/ruby/pull/1852

nobu: r63000 2018-03-28 20:30:27 +0900

r62991 で UNIXSocket に NUL 文字を含む文字列を渡すとエラーになるようにしたのですが、Linux では NUL 文字からはじまる名前を渡すと abstract namespace といってファイルシステムとは関係ない UNIX Socket というのが作れるそうで、その機能と衝突していたので、Linux では先頭の NUL 文字のみ許容するようにしています。

usa: r63008 2018-03-28 22:27:35 +0900

r62955 および r62959 で IO.copy_stream の第4引数 offset つきの利用をしていたのですが、Windows 環境では offset を指定した IO.copy_stream は NotImplementedError を発生させるので、呼び元で rescue して IO#seek でファイルポジションを移動してから offset 指定なしの IO.copy_stream を呼ぶようにしています。ここで使われてる IO はすぐ閉じられるので seek しても問題ないみたいです。