protocol: support custom session with interceptHttpProtocol

This commit is contained in:
deepak1556 2016-11-28 00:37:50 +05:30
Родитель f1f73eff04
Коммит 2b8b76a527
2 изменённых файлов: 45 добавлений и 10 удалений

Просмотреть файл

@ -7,9 +7,12 @@
#include <algorithm> #include <algorithm>
#include <string> #include <string>
#include "atom/browser/api/atom_api_session.h"
#include "atom/browser/atom_browser_context.h"
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
#include "native_mate/dictionary.h" #include "native_mate/dictionary.h"
#include "native_mate/handle.h"
#include "net/base/io_buffer.h" #include "net/base/io_buffer.h"
#include "net/base/net_errors.h" #include "net/base/net_errors.h"
#include "net/http/http_response_headers.h" #include "net/http/http_response_headers.h"
@ -89,15 +92,20 @@ void URLRequestFetchJob::BeforeStartInUI(
return; return;
// When |session| is set to |null| we use a new request context for fetch job. // When |session| is set to |null| we use a new request context for fetch job.
// TODO(zcbenz): Handle the case when it is not null. mate::Handle<api::Session> session;
v8::Local<v8::Value> session; if (options.Get("session", &session)) {
if (options.Get("session", &session) && session->IsNull()) { if (session.IsEmpty()) {
// We have to create the URLRequestContextGetter on UI thread. // We have to create the URLRequestContextGetter on UI thread.
url_request_context_getter_ = new brightray::URLRequestContextGetter( url_request_context_getter_ = new brightray::URLRequestContextGetter(
this, nullptr, nullptr, base::FilePath(), true, this, nullptr, nullptr, base::FilePath(), true,
BrowserThread::UnsafeGetMessageLoopForThread(BrowserThread::IO), BrowserThread::UnsafeGetMessageLoopForThread(BrowserThread::IO),
BrowserThread::UnsafeGetMessageLoopForThread(BrowserThread::FILE), BrowserThread::UnsafeGetMessageLoopForThread(BrowserThread::FILE),
nullptr, content::URLRequestInterceptorScopedVector()); nullptr, content::URLRequestInterceptorScopedVector());
} else {
AtomBrowserContext* browser_context = session->browser_context();
url_request_context_getter_ =
browser_context->url_request_context_getter();
}
} }
} }

Просмотреть файл

@ -4,7 +4,7 @@ const path = require('path')
const qs = require('querystring') const qs = require('querystring')
const {closeWindow} = require('./window-helpers') const {closeWindow} = require('./window-helpers')
const remote = require('electron').remote const remote = require('electron').remote
const {BrowserWindow, ipcMain, protocol, webContents} = remote const {BrowserWindow, ipcMain, protocol, session, webContents} = remote
describe('protocol module', function () { describe('protocol module', function () {
var protocolName = 'sp' var protocolName = 'sp'
@ -870,6 +870,33 @@ describe('protocol module', function () {
}) })
}) })
}) })
it('can use custom session', function (done) {
const customSession = session.fromPartition('custom-ses', {
cache: false
})
customSession.webRequest.onBeforeRequest(function (details, callback) {
assert.equal(details.url, 'http://fake-host/')
callback({cancel: true})
})
const handler = function (request, callback) {
callback({
url: request.url,
session: customSession
})
}
protocol.interceptHttpProtocol('http', handler, function (error) {
if (error) {
return done(error)
}
fetch('http://fake-host').then(function () {
done('request succeeded but it should not')
}).catch(function () {
customSession.webRequest.onBeforeRequest(null)
done()
})
})
})
}) })
describe('protocol.uninterceptProtocol', function () { describe('protocol.uninterceptProtocol', function () {