VCRProxy:记录PhantomJS Ajax和内水豚VCR呼吁(VCRProxy: Recor

2019-08-01 19:36发布

我已经做了在这一领域的一些研究,但没有发现任何解决方案。 我有一个网站,其中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。 他们为什么不一起玩?

Answer 1:

所以,我做了一些研究,现在我有一个工作VCR代理服务器,用于处理HTTPS调用的MITM访问代理服务器(如果您停用您的客户端安全检查)的一个非常基本的例子。 我将非常高兴,如果有人能做出贡献,并帮我把这个东西生活。

这里是GitHub库: https://github.com/23tux/vcr_proxy



Answer 2:

帕芬比利是一个非常好的工具。 你需要指定哪些域绕过,以及哪些URL需要存根。 这也是一个有点棘手存根HTTPS URL中。 您需要存根HTTPS URL中的https://www.example.com:443/path/



文章来源: VCRProxy: Record PhantomJS ajax calls with VCR inside Capybara