webrickとsslをサポートするMITMプロキシを作成しています(クライアント側でVCRを使用してリクエストをモックアウトするには、このスレッドを参照してくださいVCRProxy:Capybaraまたは私のgithubリポジトリ内のVCRでPhantomJSajax呼び出しを記録するhttps://github.com/23tux/ vcr_proxy)、そして私はそれを本当に遠くまでやりました(私の意見では)。私の構成では、phantomjsはプロキシを使用し、SSLエラーを無視するように構成されています。そのプロキシ(webrickで記述)は、VCRを使用して通常のHTTPリクエストを記録します。SSLリクエストが行われると、プロキシは別のwebrickサーバーを起動し、リクエスト用にマウントして/
再書き込みしunparsed_uri
ます。これにより、元のサーバーではなく、起動したばかりのwebrickサーバーが呼び出されます。新しく起動したサーバーがリクエストを処理し、VCRなどで記録します。
cURLを使用してMITMプロキシをテストすると、すべてが正常に機能します。たとえば、curlによって行われたリクエストは次のようになります
curl --proxy localhost:11111 --ssl --insecure https://blekko.com/ws/?q=rails+/json -v
処理され、記録されます...
しかし:javascriptからポルターガイストによって提供されたページ内でjsonp ajaxリクエストを使用して同じリクエストを実行しようとすると、問題が発生します。問題の原因となっている行にデバッグしました。これは、 (Ruby 1.9.3)httpserver.rb
のrubyソースコード内のfromwebrick内にあります。line 80
def run(sock)
while true
res = HTTPResponse.new(@config)
req = HTTPRequest.new(@config)
server = self
begin
timeout = @config[:RequestTimeout]
while timeout > 0
break if IO.select([sock], nil, nil, 0.5)
timeout = 0 if @status != :Running
timeout -= 0.5
end
raise HTTPStatus::EOFError if timeout <= 0
raise HTTPStatus::EOFError if sock.eof?
最後の行では、 phantomjsraise HTTPStatus::EOFError if sock.eof?
を使用してリクエストを実行すると、エラーが発生します。理由は次のとおりです。sock.eof? == true
1.9.3p392 :002 > sock
=> #<OpenSSL::SSL::SSLSocket:0x007fa36885e090>
1.9.3p392 :003 > sock.eof?
=> true
私はcurlコマンドでそれを試しましたが、そこにあるsock.eof? == false
ので、エラーは発生せず、すべてが正常に機能します。
1.9.3p392 :001 > sock
=> #<OpenSSL::SSL::SSLSocket:0x007fa36b7156b8>
1.9.3p392 :002 > sock.eof?
=> false
私はルビーでのソケットプログラミングの経験がほとんどないので、少し行き詰まっています。
sock
変数に基づいて、2つのリクエストの違いをどのように知ることができますか?rubyのIOドキュメントでわかるようにeof?
、反対側がデータを送信するか、データを閉じるまでブロックします。私は正しいですか?しかし、同じリクエスト、同じパラメーター、同じメソッドをphantomjsで呼び出すと閉じられ、curlを使用すると閉じられないのはなぜですか?
誰かが私がこれを理解するのを手伝ってくれることを願っています。どうも!