[ruby-list:50663] OSXのNet::HTTPResponse の bodyについて
From:
nst <nst329@...>
Date:
2018-05-15 05:46:34 UTC
List:
ruby-list #50663
那須と申します
Net::HTTPResponseのbodyメソッドについてですが、
OSX High SierraにてNet::HTTPのGETで大きな物を取ってくると、
bodyメソッドの戻り値が壊れたものが戻ってくるようです。
Rubyソースのhttp.rbを見ると、bodyはメモリに展開すると書いてあり、
メモリ展開出来なかったのかと思います。
展開に失敗したことを知る方法は無いのでしょうか?
(今はbodyを使わずread_bodyを使っているので問題ないのですが…)
=== test.rb ===
require 'open-uri'
require 'net/http'
uri = URI('http://example.com/large_file’) # 3Gぐらいのファイル
http = Net::HTTP.new(uri.host, uri.port)
res = http.start {|h|
h.get(uri)
}
p res
b = res.body # 正常の様に見える
open( 'dum.txt' , 'wb' ) { |f|
f.write( b )
}
===
OS: macOS High Sierra 10.13.4
・homebrewでインストールしたrubyを使用
$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
$ ruby test.rb
#<Net::HTTPOK 200 OK readbody=true>
Traceback (most recent call last):
4: from test.rb:12:in `<main>'
3: from /usr/local/Cellar/ruby/2.5.1/lib/ruby/2.5.0/open-uri.rb:37:in `open'
2: from /usr/local/Cellar/ruby/2.5.1/lib/ruby/2.5.0/open-uri.rb:37:in `open'
1: from test.rb:13:in `block in <main>'
test.rb:13:in `write': Invalid argument @ io_write - dum (Errno::EINVAL)
#このエラーを見てres.bodyがおかしいと気がつくのにかなり時間がかかりました
・システムのrubyを使用
$ /usr/bin/ruby -v
ruby 2.3.3p222 (2016-11-21 revision 56859) [universal.x86_64-darwin17]
$ /usr/bin/ruby test.rb
#<Net::HTTPOK 200 OK readbody=true>
test.rb:13:in `write': Invalid argument @ io_write - dum.txt (Errno::EINVAL)
from test.rb:13:in `block in <main>'
from /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/open-uri.rb:37:in `open'
from /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/open-uri.rb:37:in `open'
from test.rb:12:in `<main>'
Ubuntu 16.04では、NoMemoryErrorとなったのでOSX限定??
$ ruby2.5 ./test.rb
Traceback (most recent call last):
./test.rb: failed to allocate memory (NoMemoryError)