WEBrick套接字返回eof? ==是的

时间:2013-03-22 08:49:54

标签: ruby sockets proxy phantomjs webrick

我正在编写一个带有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!

1 个答案:

答案 0 :(得分:1)

由于这是一个HTTPS我打赌客户端正在关闭连接。在HTTPS中,当服务器证书例如无效时,可能会发生这种情况。你使用什么样的HTTPS库?这些库通常可以配置为忽略SSL CERT,并在无效时继续工作。

在curl中,你实际上是在使用-k(--insecure),没有它就行不通。如果没有此选项,请尝试此操作,如果curl失败,那么您的服务器证书无效。请注意,要使其正常工作,您通常需要关闭检查或向客户端提供有效证书,以便进行验证。