VCRProxy: VCR ile Kayıt PhantomJS ajax çağrıları içinde Kapibara
Ben zaten bu alanda biraz araştırma yaptım ama herhangi bir çözüm bulamadı. Asynchron ajax çağrıları facebook (JSONP kullanarak) yapıldığı bir site var. VCR ile Ruby tarafındaki tüm HTTP istekleri benim kaydediyorum, serin, AJAX aramalar için bu özelliği kullanmak olacağını düşündüm.
Etrafta biraz oynadım ve bir proxy girişimi ile geldi. Başsız bir tarayıcı olarak PhantomJS kullanarak ve Kapibara içinde entegrasyonu için poltergeist ediyorum. Poltergeist şimdi böyle bir proxy kullanacak biçimde yapılandırılmış
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
Test amaçlı, bir proxy sunucusu VCR entegre WEbrick,: dayanarak yazdım
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)
Bu şey her localhost çağrı ile çalışır, ve kayıt altına almak. HTML, JS ve CSS dosyaları VCR ile kayıt edilir. Sonra c.ignore_localhost = true
seçeneği etkin, işe yaramaz (bence) localhost aramaları kaydetmek için.
Tekrar denedim ama sayfada yapılan AJAX çağrıları kayıtlı olmadığını anlamaya vardı. Daha da kötüsü, bu testler içinde artık işe yaramıyor.
Sadede gelmek Peki, sorum şu: Neden localhost dosyaları kaydedilmiş ve JSONP dış ressources çağrıları değil JS için tüm aramalar? JsonP şey olamaz, "" ajax isteği. normal değil çünkü Yoksa phantomjs içinde bir hata, AJAX çağrıları vekalet değil mi? Eğer öyleyse, bunu nasıl telafi edebiliriz?
Eğer çalışıyorsa, Başlat entegre ve yordam içinde bitmesini istiyorum
------- GÜNCELLEME -------
Biraz araştırma yaptım ve şu noktaya geldi: proxy HTTPS aramaları HTTPS üzerinden çağırır ve ikili veri ile bazı sorunları var.
Sunucu başladım, ve birkaç telefon görüşmesi yaptı curl:
curl --proxy 127.0.0.1:9100 http://d3jgo56a5b0my0.cloudfront.net/images/v7/application/stories_view/icons/bug.png
Bu aramayı olması gerektiği gibi kaydı tutuluyor. Proxy istek ve yanıt çıktı
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
Ama bu çağrı kayıt alır değil, HTTPS ile bir sorun olmalı
curl --proxy 127.0.0.1:9100 https://d3jgo56a5b0my0.cloudfront.net/images/v7/application/stories_view/icons/bug.png
Başlık çıktı
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
Belki proxy HTTPS kaldıramaz, ama olabilir diye düşündüm (sonra konsolda çıktı Ara cURL alıyorum sürece). O zaman, belki VCR HTTPS istekleri sahte olabilir mi diye düşündüm. Ama bu komut dosyası kullanarak, VCR proxy kullanmıyorum, HTTPS istekleri alay,:
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
Sorun nedir? VCR HTTPS ve proxy HTTPS ele alır. Birlikte oynamıyorlar neden?
CEVAP
Bu yüzden biraz araştırma yaptım ve şimdi MITM bir proxyserver olarak HTTPS çağrıları işleyen bir çalışma VCR bir proxy sunucusu, çok temel bir örnek, eğer müvekkiliniz güvenlik denetimi devre dışı ise). Eğer birisi katkıda bulunmak ve bana bu şeyi hayata için yardımcı olabilir eğer ben çok mutlu olurdu.
Burada github repo: https://github.com/23tux/vcr_proxy
AJAX Mailchimp kayıt formu entegrasyon...
Alma "net::ERR_BLOCKED_BY_CLİENT&...
Jquery $.çapraz etki alanı ajax çağrıl...
Ajax çağrıları işleme oturum zaman aşı...
Neden aynı ASP.NET MVC eylem için aynı...