2016-05-03 3 views
0

私は(単純なHTTP-PINGを書き込もうとした)次のRubyコードを持って良い結果でもNet :: HTTP.get_responseのcontent_lengthがnilになることはありますか?

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 **<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< WHY** 
res2.body[0..60] 
=> "<!doctype html><html itemscope=\"\" itemtype=\"http://schema.org" 

なぜres2 CONTENT_LENGTHが透けて見えていないのですか? res2の他の属性にありますか(それはどうやって見れますか)

私はRubyの新人です。 AWS Linuxでirb 0.9.6を使用

ありがとうございました。

答えて

1

返される値は、本文の長さではなく、固定長が事前にわかっていて、ヘッダの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を常にチェックし、発生する可能性のあるパフォーマンス上の問題が発生した場合には、それに対処してください。

これは、マルチパートレスポンスの簡単な応答を受け取ったかどうかにかかわらず、実際のコンテンツの長さを確実に取得するはずです。

関連する問題