我已经做了在这一领域的一些研究,但没有发现任何解决方案。 我有一个网站,其中asynchron Ajax调用给Facebook(使用JSONP)制成。 我记录在Ruby侧VCR我所有的HTTP请求,所以我想它会很酷,对于AJAX调用,以及使用此功能。
所以我打得有点左右,并与代理尝试走了过来。 我使用PhantomJS作为一个无头的浏览器和骚灵为内水豚的整合。 鬼驱人现在配置为使用代理这样的:
Capybara.register_driver :poltergeist_vcr do |app|
options = {
:phantomjs_options => [
"--proxy=127.0.0.1:9100",
"--proxy-type=http",
"--ignore-ssl-errors=yes",
"--web-security=no"
],
:inspector => true
}
Capybara::Poltergeist::Driver.new(app, options)
end
Capybara.javascript_driver = :poltergeist_vcr
出于测试目的,我写的基础上的WEBrick代理服务器,集成了VCR:
require 'io/wait'
require 'webrick'
require 'webrick/httpproxy'
require 'rubygems'
require 'vcr'
module WEBrick
class VCRProxyServer < HTTPProxyServer
def service(*args)
VCR.use_cassette('proxied') { super(*args) }
end
end
end
VCR.configure do |c|
c.stub_with :webmock
c.cassette_library_dir = '.'
c.default_cassette_options = { :record => :new_episodes }
c.ignore_localhost = true
end
IP = '127.0.0.1'
PORT = 9100
reader, writer = IO.pipe
@pid = fork do
reader.close
$stderr = writer
server = WEBrick::VCRProxyServer.new(:BindAddress => IP, :Port => PORT)
trap('INT') { server.shutdown }
server.start
end
raise 'VCR Proxy did not start in 10 seconds' unless reader.wait(10)
这与每一个本地主机通话效果很好,而且他们得到良好记录。 在HTML,JS和CSS文件通过VCR记录。 然后我启用了c.ignore_localhost = true
选项,因为它是无用的(在我看来)来记录本地主机通话。
然后我又试了一次,但我必须弄清楚,那是在页面上的Ajax调用不会被记录。 更糟的是,他们并没有测试里面工作了。
因此,要开门见山,我的问题是:为什么对记录的本地主机JS文件的所有调用,并JSONP调用外部ressources不? 它不可能是JSONP的事情,因为它是一个“正常”的Ajax请求。 或者是有内部phantomjs一个bug,那AJAX调用不代理? 如果是这样,我们怎么可能解决呢?
如果它的运行,我要开始整合和内停止程序
------- -------更新
我做了一些研究,并得出如下观点:代理通过HTTPS调用有一些问题与HTTPS电话和二进制数据。
我启动了服务器,并取得了一定的卷曲电话:
curl --proxy 127.0.0.1:9100 http://d3jgo56a5b0my0.cloudfront.net/images/v7/application/stories_view/icons/bug.png
该呼叫被记录,因为它应该。 来自代理的请求和响应的输出是
GET http://d3jgo56a5b0my0.cloudfront.net/images/v7/application/stories_view/icons/bug.png HTTP/1.1
User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5
Host: d3jgo56a5b0my0.cloudfront.net
Accept: */*
Proxy-Connection: Keep-Alive
HTTP/1.1 200 OK
Server: WEBrick/1.3.1 (Ruby/1.9.3/2012-10-12)
Date: Tue, 20 Nov 2012 10:13:10 GMT
Content-Length: 0
Connection: Keep-Alive
但是,此调用不会被记录下来,一定是有问题的HTTPS:
curl --proxy 127.0.0.1:9100 https://d3jgo56a5b0my0.cloudfront.net/images/v7/application/stories_view/icons/bug.png
报头输出是:
CONNECT d3jgo56a5b0my0.cloudfront.net:443 HTTP/1.1
Host: d3jgo56a5b0my0.cloudfront.net:443
User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5
Proxy-Connection: Keep-Alive
HTTP/1.1 200 OK
Server: WEBrick/1.3.1 (Ruby/1.9.3/2012-10-12)
Date: Tue, 20 Nov 2012 10:15:48 GMT
Content-Length: 0
Connection: close
所以,我想,也许代理无法处理HTTPS,但它可以(只要我得到卷曲呼叫后在控制台上输出)。 后来我想,也许VCR不能嘲笑HTTPS请求。 但是使用这个脚本,VCR嘲笑了HTTPS请求,当我不使用它的代理中:
require 'vcr'
VCR.configure do |c|
c.hook_into :webmock
c.cassette_library_dir = 'cassettes'
end
uri = URI("https://d3jgo56a5b0my0.cloudfront.net/images/v7/application/stories_view/icons/bug.png")
VCR.use_cassette('https', :record => :new_episodes) do
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
response = http.request_get(uri.path)
puts response.body
end
那么,什么是问题呢? VCR处理HTTPS和代理处理HTTPS。 他们为什么不一起玩?