diff --git a/packages/web3-providers-http/README.md b/packages/web3-providers-http/README.md index 528e883fb71..ac46853390c 100644 --- a/packages/web3-providers-http/README.md +++ b/packages/web3-providers-http/README.md @@ -31,7 +31,11 @@ This will expose the `Web3HttpProvider` object on the window object. // in node.js var Web3HttpProvider = require('web3-providers-http'); -var http = new Web3HttpProvider('http://localhost:8545'); +var options = { + timeout: 20000, // milliseconds, + headers: [{name: 'Access-Control-Allow-Origin', value: '*'},{...}] +}; +var http = new Web3HttpProvider('http://localhost:8545', options); ``` diff --git a/packages/web3-providers-http/package.json b/packages/web3-providers-http/package.json index f83a8708116..b53670d7033 100644 --- a/packages/web3-providers-http/package.json +++ b/packages/web3-providers-http/package.json @@ -8,6 +8,6 @@ "main": "src/index.js", "dependencies": { "web3-core-helpers": "1.0.0-beta.34", - "xhr2": "0.1.4" + "xhr2-cookies": "1.1.0" } } diff --git a/packages/web3-providers-http/src/index.js b/packages/web3-providers-http/src/index.js index 38b2c548f4e..a79e792a32d 100644 --- a/packages/web3-providers-http/src/index.js +++ b/packages/web3-providers-http/src/index.js @@ -23,16 +23,17 @@ */ var errors = require('web3-core-helpers').errors; -var XHR2 = require('xhr2'); // jshint ignore: line +var XHR2 = require('xhr2-cookies').XMLHttpRequest // jshint ignore: line /** * HttpProvider should be used to send rpc calls over http */ -var HttpProvider = function HttpProvider(host, timeout, headers) { +var HttpProvider = function HttpProvider(host, options) { + options = options || {}; this.host = host || 'http://localhost:8545'; - this.timeout = timeout || 0; + this.timeout = options.timeout || 0; + this.headers = options.headers; this.connected = false; - this.headers = headers; }; HttpProvider.prototype._prepareRequest = function(){ @@ -40,6 +41,8 @@ HttpProvider.prototype._prepareRequest = function(){ request.open('POST', this.host, true); request.setRequestHeader('Content-Type','application/json'); + request.timeout = this.timeout && this.timeout !== 1 ? this.timeout : 0; + request.withCredentials = true; if(this.headers) { this.headers.forEach(function(header) { @@ -61,7 +64,6 @@ HttpProvider.prototype.send = function (payload, callback) { var _this = this; var request = this._prepareRequest(); - request.onreadystatechange = function() { if (request.readyState === 4 && request.timeout !== 1) { var result = request.responseText; diff --git a/packages/web3-providers-ws/src/index.js b/packages/web3-providers-ws/src/index.js index bf1b6553afc..915e833dc6f 100644 --- a/packages/web3-providers-ws/src/index.js +++ b/packages/web3-providers-ws/src/index.js @@ -28,7 +28,7 @@ var errors = require('web3-core-helpers').errors; var Ws = null; var _btoa = null; var parseURL = null; -if (typeof window !== 'undefined') { +if (typeof window !== 'undefined' && typeof window.WebSocket !== 'undefined') { Ws = window.WebSocket; _btoa = btoa; parseURL = function(url) { @@ -39,8 +39,18 @@ if (typeof window !== 'undefined') { _btoa = function(str) { return Buffer(str).toString('base64'); }; - // Web3 supports Node.js 5, so we need to use the legacy URL API - parseURL = require('url').parse; + var url = require('url'); + if (url.URL) { + // Use the new Node 6+ API for parsing URLs that supports username/password + var newURL = url.URL; + parseURL = function(url) { + return new newURL(url); + }; + } + else { + // Web3 supports Node.js 5, so fall back to the legacy URL API if necessary + parseURL = require('url').parse; + } } // Default connection ws://localhost:8546 @@ -60,11 +70,12 @@ var WebsocketProvider = function WebsocketProvider(url, options) { // pass through with any additional headers supplied in constructor var parsedURL = parseURL(url); var headers = options.headers || {}; + var protocol = options.protocol || undefined; if (parsedURL.username && parsedURL.password) { headers.authorization = 'Basic ' + _btoa(parsedURL.username + ':' + parsedURL.password); } - this.connection = new Ws(url, undefined, undefined, headers); + this.connection = new Ws(url, protocol, undefined, headers); this.addDefaultEvents(); diff --git a/test/helpers/FakeXHR2.js b/test/helpers/FakeXHR2.js index d9f3493a9b4..36340fa8a8c 100644 --- a/test/helpers/FakeXHR2.js +++ b/test/helpers/FakeXHR2.js @@ -33,4 +33,4 @@ FakeXHR2.prototype.send = function (payload) { } }; -module.exports = FakeXHR2; +module.exports = {XMLHttpRequest: FakeXHR2}; diff --git a/test/httpprovider.js b/test/httpprovider.js index 590d2698242..de545bae522 100644 --- a/test/httpprovider.js +++ b/test/httpprovider.js @@ -5,7 +5,7 @@ var SandboxedModule = require('sandboxed-module'); SandboxedModule.registerBuiltInSourceTransformer('istanbul'); var HttpProvider = SandboxedModule.require('../packages/web3-providers-http', { requires: { - 'xhr2': require('./helpers/FakeXHR2'), + 'xhr2-cookies': require('./helpers/FakeXHR2'), // 'xmlhttprequest': require('./helpers/FakeXMLHttpRequest') }, singleOnly: true @@ -14,7 +14,7 @@ var HttpProvider = SandboxedModule.require('../packages/web3-providers-http', { describe('web3-providers-http', function () { describe('prepareRequest', function () { it('should set request header', function () { - var provider = new HttpProvider('http://localhost:8545', 0 , [{name: 'Access-Control-Allow-Origin', value: '*'}]); + var provider = new HttpProvider('http://localhost:8545', {headers: [{name: 'Access-Control-Allow-Origin', value: '*'}]}); var result = provider._prepareRequest(); assert.equal(typeof result, 'object');