我已经在这个领域做了一些研究,但没有找到任何解决方案.我有一个网站,在那里可以对facebook进行异步ajax调用(使用JSONP).我正在用VCR在Ruby端记录我的所有HTTP请求,所以我觉得在AJAX调用中也使用这个功能会很酷.

所以我玩了一下,想出了一个代理try .我正在使用PhantomJS作为无头浏览器和恶作剧,以实现水豚内部的集成.Poltergeist现在配置为使用如下代理:

  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调用却没有记录下来?这不可能是jsonP,因为这是一个"正常"的ajax请求.还是说phantomjs中有一个错误,AJAX调用没有代理?如果是这样的话,我们如何解决这个问题?

如果它正在运行,我想将启动和停止过程集成到

------- UPDATE -------

我做了一些研究,得出了以下观点:代理在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,但它可以(只要我在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.他们为什么不一起玩?

推荐答案

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

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

Ruby相关问答推荐

ruby:比较两个单词并从中提取不常见的字母

Rails 7 - 访问连接模型生成新查询

警告 Selenium [弃用] Manager#logs 已弃用.使用 Chrome::Driver#logs 代替

Symfony 2assets资源过滤器异常中的指南针

从 Time 对象获取下/上个月

为什么 ruby​​ 在 Windows 上这么慢?

Ruby 中的 :+ 和 &:+ 是什么?

Ruby 中的 Fail vs. raise:我们真的应该相信风格指南吗?

Ruby 中 Postgres 查询的简单示例

我如何 expect期望在 RSpec 中引发异常的东西?

用mustache迭代数组

Ruby 中的关联数组

Broken pipe (Errno::EPIPE)

如何通过一组新的给定键更改哈希的所有键

在 Ruby 中,有没有办法使用 hash.each_with_index do |[k,v], i| 之类的东西?

Ruby 中的 $1 和 \1

从字符串中删除所有特殊字符 - ruby

无法在 Windows 上安装 Aptana Studio 3.6

Ruby 将标题发布到 slug

你怎么说不等于在 Ruby 中?