我正在编写一个支持 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的时候却没有关闭呢?
希望有人可以帮助我解决这个问题。谢谢!