[#48450] 1.8.7と1.9.2の挙動の違いについて — "Jun'ya Shimoda" <jun-shimo@...>

下田です。

13 messages 2011/10/09

[ruby-list:48468] Re: net/https のproxy経由接続シーケンスについて

From: 名島太樹 <h.najima@...>
Date: 2011-10-14 08:25:45 UTC
List: ruby-list #48468
名島と申します。

よくこのメールの目的が分からないのですが、問題の解決が目的ならば、
「Firewallそのものか、Firewallのフィルタ定義がバグってるので、そちらを直してください。」となります。

伝送路(ここではFirewall)が明らかにおかしいことが分かってるだから、そちらを対処すれば万事解決です。

また、net::httpsの該当部分は、極めてまっとうです。

たぶんTCP通信を誤解しているようですが、TCPはストリーム通信なのでパケットの切れ目はプログラム側で意識してはなりませんし、出来ません。
パケットへの分割は、Rubyよりも下のレイヤーでやってます。

Hostの送信も削除してはいけません。削除してしまうとRFC違反になりますし、なによりName Base Virtual
Hostを使ってるサーバと正常に通信できなくなります。

-- 2011-10-14
Hiroki NAJIMA aka Nazy

2011/10/14 11:32 "KASUGA Toru" <kasuga.toru@jp.fujitsu.com>:
>
> 春日と申します。
>
> Windows/MinGW で、
> ruby 1.9.2p290 (2011-07-09) [i386-mingw32]
> を使用しております。
> ----
> require 'net/https'
>
> Net::HTTP.version_1_2
>
> http = Net::HTTP::Proxy("proxy.example.com", 8080).new('www.google.com',
443)
>
> http.use_ssl = true
> http.verify_mode = OpenSSL::SSL::VERIFY_NONE
> http.start {|w|
>  response = w.get('/')
>  puts response.body
> }
> ----
> と言うようなコードで、proxy 経由のhttps接続を試みますと、うまく接続できない場合があります。
>
> というのも、
> net/http.rb のL.664辺りが、
> ----
>      if use_ssl?
>        begin
>          if proxy?
>            @socket.writeline sprintf('CONNECT %s:%s HTTP/%s',
>                                      @address, @port, HTTPVersion)
>            @socket.writeline "Host: #{@address}:#{@port}"
>            if proxy_user
>              credential = ["#{proxy_user}:#{proxy_pass}"].pack('m')
>              credential.delete!("\r\n")
>              @socket.writeline "Proxy-Authorization: Basic #{credential}"
>            end
>            @socket.writeline ''
>            HTTPResponse.read_new(@socket).value
>          end
> ----
> となっており、
>            @socket.writeline sprintf('CONNECT %s:%s HTTP/%s',
>                                      @address, @port, HTTPVersion)
> のが実行された結果、
> CONNECT ...
> を含む行が、先行してtcp reassembled pduとして送信されます。
> # その後、Host を含む行が、続きのパケットとして送信されます。
>
> この先行のtcp reassembled
pduパケットが、あるfirewallソフトだと黙って廃棄されてしまい、クライアントとしてはACKを待つので、接続がタイムアウトしてしまいます。
> # このfirewallが、この小さいtcp reassembled pduを黙って廃棄している理由はわかりませんでした。
>
> もちろん、このfirewallソフトを無効化すれば接続シーケンスは無事完了します。
>
> また、
>            @socket.writeline "Host: #{@address}:#{@port}"
> をコメントアウトすると、CONNECTを含む行は、tcp reassembled pdu
ではなく、単一のパケットとして送信され、接続シーケンスは無事完了します。
>
> net/http.rb
の実装は、何となく、CONNECTとHostを1つのパケットとして送ることを想定しているように思いますが、私が検証したように、tcp
reassembled pdu で送信されることは想定した動作なのでしょうか?
>
> # もしかして、openssl側の問題かも知れませんが…
>
> -----------------------------------------
> 春日  玄 (KASUGA Toru)
> E-mail : kasuga.toru@jp.fujitsu.com
>
>

In This Thread