我已经在这个领域做了一些研究,但没有找到任何解决方案。我有一个网站,其中对脸书进行异步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。为什么他们不一起玩?
膨化比利是一个非常好的工具。您需要指定要绕过的域,以及需要存根的URL。这也是一个有点棘手的存根https网址。您需要将https urls存根化为< code > https://www . example . com:443/path/
所以我做了一些研究,现在我有一个非常基本的VCR代理服务器的例子,它作为MITM代理服务器处理HTTPS调用(如果你在你的客户端中停用安全检查)。如果有人能做出贡献并帮助我将这件事变为现实,我将非常高兴。
这里是github回购:https://github.com/23tux/vcr_proxy
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),现在运行良好。