当前位置: 首页 > 知识库问答 >
问题:

VCR代理:在水豚内使用VCR录制幻影JS阿贾克斯通话

越飞鸾
2023-03-14

我已经在这个领域做了一些研究,但没有找到任何解决方案。我有一个网站,其中对脸书进行异步ajax调用(使用JSONP)。我正在使用VCR在Ruby端记录我的所有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调用没有被记录下来。更糟糕的是,它们在测试中不再有效。

说到重点,我的问题是:为什么localhost上所有对JS文件的调用都被记录下来,而对外部资源的JSONP调用没有记录下来?这不可能是jsonP的事情,因为这是一个“正常”的ajax请求。或者phantomjs内部有一个错误,即AJAX调用没有代理?如果是这样,我们如何解决这个问题?

如果它在运行,我想在里面集成启动和停止程序

------- 更新 -------

我做了一些研究,得出以下结论:代理在HTTPS调用和通过HTTPS访问的二进制数据方面存在一些问题。

我启动了服务器,并进行了一些 curl 调用:

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,但它可以(只要我在cURL调用后在控制台上获得输出)。然后我想,也许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。为什么他们不一起玩?

共有2个答案

皇甫飞跃
2023-03-14

膨化比利是一个非常好的工具。您需要指定要绕过的域,以及需要存根的URL。这也是一个有点棘手的存根https网址。您需要将https urls存根化为< code > https://www . example . com:443/path/

鄂和璧
2023-03-14

所以我做了一些研究,现在我有一个非常基本的VCR代理服务器的例子,它作为MITM代理服务器处理HTTPS调用(如果你在你的客户端中停用安全检查)。如果有人能做出贡献并帮助我将这件事变为现实,我将非常高兴。

这里是github回购:https://github.com/23tux/vcr_proxy

 类似资料:
  • VCR

    VCR 是 Ruby 开发的一个用于简化 HTTP 交互测试的工具包。 示例代码: require 'rubygems'require 'test/unit'require 'vcr'VCR.configure do |c|  c.cassette_library_dir = 'fixtures/vcr_cassettes'  c.hook_into :webmock # or :fakewebe

  • PHP-VCR 可以记录你测试套件的 HTTP 交互,并且在今后运行更快、更准确的测试中重放。它有以下特点: 以最少的设置/配置代码自动记录和重播HTTP交互。 支持常见的http功能和扩展 使用streamWrapper的所有内容:fopen(),fread(),file_get_contents(),...,无需任何修改($http_response_header请参阅#96) 通过添加\VC

  • 我创建了一个表单。我以 JSON 格式发送此表单中的数据。 如果我只提交表单数据(我还将控制器更改为[来自正文]图像请求)并将内容类型和进程数据设置为假,则表单数据不为空。 我认为“document”返回null,因为我将数据作为JSON发送。我如何解决这个问题?我陷入了这个问题。 阿贾克斯请求 断续器 控制器 类

  • 我是cucumber和水豚的新手,我对以下错误感到困惑: 在我的功能中,我有: 我的步骤如下所示: 我尝试了“click(button\u text)和click\u link”方法。我想这可能是我没有看到的明显的东西。我试图找到按钮元素的css定位器,然后单击该元素。我认为regex不需要更改,因为我正在更改“button\u text”局部变量的内容。还是我?

  • 据我所知: 在quarkus文档中,quarkus正在使用工作线程来执行jaxrsendpoint 这个垂直。在x文档中,工作线程是为调用阻塞代码而设计的 可能存在误解:以下术语的确切含义是什么? 服务器非阻塞代码。 服务器异步响应处理。 服务器响应代码。 我的问题是:为什么我不能使用jax-rsendpoint创建非阻塞代码并利用标准事件循环线程? 编辑: 有几个问题困扰着我: 默认情况下,re

  • 我有一个关于SPOCK+Drools测试的问题。事情是这样的, 我正在部署的webapp W/O中运行测试(如果这有任何意义的话:))。我将jar添加到类路径中(而不是WEB-INF/libs),现在运行良好。