我正在写一个带有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记录它,等等。WEBrick套接字返回eof? == true
使用cURL测试MITM代理时,一切正常。例如请求由卷曲做出像
curl --proxy localhost:11111 --ssl --insecure https://blekko.com/ws/?q=rails+/json -v
得到处理,记录...
但是:当我尝试做的骚灵从JavaScript与JSONP Ajax请求提供的页面内相同的请求,东西出错。我将其调试到导致问题的线路。这是httpserver.rb
从Ruby源代码中的WEBrick内的line 80
(红宝石1.9.3):
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?
最后一行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
我试过用curl命令,那里是sock.eof? == false
,所以错误没有得到提高,并且一切正常:
1.9.3p392 :001 > sock
=> #<OpenSSL::SSL::SSLSocket:0x007fa36b7156b8>
1.9.3p392 :002 > sock.eof?
=> false
我只有很少的红宝石套接字编程的经验,所以我有点陷入困境。
我怎样才能找出,基于sock
变量的两个请求之间有什么区别?正如我在红宝石IO文档中看到的那样,eof?
阻塞,直到对方发送一些数据或关闭它。我对吗?但是为什么在调用相同的请求,相同的参数,与phantomjs相同的方法时它关闭,并且在使用curl时没有关闭?
希望有人能帮我弄清楚这一点。谢谢!
Thx为您的答案!我使用webrick自动生成的自签名证书,但我配置了phantomjs以使用'--ignore-ssl-errors = true'。我认为这会忽略ssl错误。自签名证书总是无效的,不是吗?有没有办法通过webrick提供适当的证书? – 23tux 2013-03-22 10:50:19
我重新安装了phantomjs,现在一切正常。奇怪,但thx为您的支持! – 23tux 2013-03-22 14:03:37