0

我正在编写一个支持 webrick 和 ssl 的 MITM 代理(对于在客户端使用 VCR 模拟请求,请参阅此线程VCRProxy:Record PhantomJS ajax calls with VCR inside Capybara或我的 github 存储库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

被处理,被记录...

但是:当我尝试使用 jsonp ajax 请求在 poltergeist 提供的页面内执行相同的请求时,出现问题。我将它调试到导致问题的行。它在(Ruby 1.9.3)httpserver.rb的 ruby​​ 源代码中的 from webrick 内: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?

使用phantomjs进行请求时,最后一行raise 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 

我对 ruby​​ 中的套接字编程经验很少,所以我有点卡住了。

如何根据变量找出两个请求之间的区别sock?正如我在 ruby​​ 的 IO 文档中看到的那样,eof?阻塞直到对方发送一些数据或关闭它。我对吗?但是为什么用phantomjs调用同一个请求,同一个参数,同一个方法的时候是关闭的,而使用curl的时候却没有关闭呢?

希望有人可以帮助我解决这个问题。谢谢!

4

1 回答 1

1

Since this is a HTTPS I bet the client is closing the connection. In HTTPS this can happen when the server certificate is for example not valid. What kind of HTTPS library do you use? These libraries can be usually configured to ignore SSL CERT and continue working when it is not valid.

In curl you are actually doing that using -k (--insecure), without this it would not work. Try this without this option and if curl fails, then your server certificate is not valid. Note to get this working you usually either need to turn the checking off or to provide valid certificate to the client so it can verify it.

于 2013-03-22T09:18:54.747 回答