[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)

In This Thread

Prev Next