返される値は、本文の長さではなく、固定長が事前にわかっていて、ヘッダのcontent-length
に格納されている場合、コンテンツの固定長であるようです。
(http://ruby-doc.org/stdlib-2.3.1/libdoc/net/http/rdoc/Net/HTTPHeader.htmlから採取された)HTTPHeader#CONTENT_LENGTHの実装のソースを参照:これはおそらく、この場合には何を意味
# File net/http/header.rb, line 262
def content_length
return nil unless key?('Content-Length')
len = self['Content-Length'].slice(/\d+/) or
raise Net::HTTPHeaderSyntaxError, 'wrong Content-Length format'
len.to_i
end
応答がマルチパートMIME応答であり、content-length
ヘッダということですこの場合、使用されません。
この場合、最も可能性の高いものはbody.length
です。これは、マルチパートレスポンスのレスポンスボディの実際の長さを伝える唯一の方法だからです。
コンテンツの長さは、常にcontent.body
を使用することでパフォーマンスに影響する場合があります。最初にcontent_length
アプローチを試してみることもできます。それがゼロの場合は、body.length
にフォールバックしてください。個人的に
res2_content_length = res2.content_length
if res2_content_length.nil?
res2_content_length = res2.body.length
end
、私はちょうどに固執したい:または、いっそのこと、CONTENT_LENGTHをキャプチャして、比較のために撮影した値を使用し
require 'net/http'
res1 = Net::HTTP.get_response 'www.google.com' , '/'
res2 = Net::HTTP.get_response 'www.google.com' , '/search?q=abc'
res1.code #200
res2.code #200
res1.content_length #5213
res2.content_length.nil? ? res2.body.length : res2.content_length #57315 **<<<<<<<<<<<<<<< Works now **
res2.body[0..60]
=> "<!doctype html><html itemscope=\"\" itemtype=\"http://schema.org"
:ここ
はあなたのコードに例の修正です
body.length
を常にチェックし、発生する可能性のあるパフォーマンス上の問題が発生した場合には、それに対処してください。
これは、マルチパートレスポンスの簡単な応答を受け取ったかどうかにかかわらず、実際のコンテンツの長さを確実に取得するはずです。