我正在编写一个带有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
得到处理,记录......
但是:当我尝试在javascript中使用jsonp ajax请求从poltergeist服务的页面内执行相同的请求时,出现问题。我把它调试到导致问题的那一行。它位于httpserver.rb
内的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?
(Ruby 1.9.3)的ruby源代码中:
raise HTTPStatus::EOFError if sock.eof?
使用 phantomjs 执行请求时,最后一行sock.eof? == true
会引发错误,因为1.9.3p392 :002 > sock
=> #<OpenSSL::SSL::SSLSocket:0x007fa36885e090>
1.9.3p392 :003 > sock.eof?
=> true
:
sock.eof? == false
我使用 curl 命令尝试了它,并且它是1.9.3p392 :001 > sock
=> #<OpenSSL::SSL::SSLSocket:0x007fa36b7156b8>
1.9.3p392 :002 > sock.eof?
=> false
,因此错误不会被提升,一切正常:
sock
我对ruby中的套接字编程只有很少的经验,所以我有点被卡住了。
如何根据eof?
变量找出两个请求之间的区别?正如我在ruby的IO文档中看到的那样,{{1}}阻塞,直到另一方发送一些数据或关闭它。我对吗?但是为什么在调用相同的请求,相同的参数,使用phantomjs的相同方法时关闭它,并且在使用curl时它没有关闭?
希望有人能帮助我解决这个问题。 THX!
答案 0 :(得分:1)
由于这是一个HTTPS我打赌客户端正在关闭连接。在HTTPS中,当服务器证书例如无效时,可能会发生这种情况。你使用什么样的HTTPS库?这些库通常可以配置为忽略SSL CERT,并在无效时继续工作。
在curl中,你实际上是在使用-k(--insecure),没有它就行不通。如果没有此选项,请尝试此操作,如果curl失败,那么您的服务器证书无效。请注意,要使其正常工作,您通常需要关闭检查或向客户端提供有效证书,以便进行验证。