Skip to content

Commit

Permalink
Adding support for web workers, and react-native
Browse files Browse the repository at this point in the history
closes #70, closes #98
  • Loading branch information
mzabriskie committed Sep 29, 2015
1 parent c221d03 commit 6aa766e
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 7 deletions.
21 changes: 14 additions & 7 deletions lib/adapters/xhr.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,8 @@
var defaults = require('./../defaults');
var utils = require('./../utils');
var buildUrl = require('./../helpers/buildUrl');
var cookies = require('./../helpers/cookies');
var parseHeaders = require('./../helpers/parseHeaders');
var transformData = require('./../helpers/transformData');
var urlIsSameOrigin = require('./../helpers/urlIsSameOrigin');

module.exports = function xhrAdapter(resolve, reject, config) {
// Transform request data
Expand Down Expand Up @@ -65,11 +63,20 @@ module.exports = function xhrAdapter(resolve, reject, config) {
};

// Add xsrf header
var xsrfValue = urlIsSameOrigin(config.url) ?
cookies.read(config.xsrfCookieName || defaults.xsrfCookieName) :
undefined;
if (xsrfValue) {
requestHeaders[config.xsrfHeaderName || defaults.xsrfHeaderName] = xsrfValue;
// This is only done if running in a standard browser environment.
// Specifically not if we're in a web worker, or react-native.
if (utils.isStandardBrowserEnv()) {
var cookies = require('./../helpers/cookies');
var urlIsSameOrigin = require('./../helpers/urlIsSameOrigin');

// Add xsrf header
var xsrfValue = urlIsSameOrigin(config.url) ?
cookies.read(config.xsrfCookieName || defaults.xsrfCookieName) :
undefined;

if (xsrfValue) {
requestHeaders[config.xsrfHeaderName || defaults.xsrfHeaderName] = xsrfValue;
}
}

// Add headers to the request
Expand Down
6 changes: 6 additions & 0 deletions lib/helpers/cookies.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
'use strict';

/**
* WARNING:
* This file makes references to objects that aren't safe in all environments.
* Please see lib/utils.isStandardBrowserEnv before including this file.
*/

var utils = require('./../utils');

module.exports = {
Expand Down
6 changes: 6 additions & 0 deletions lib/helpers/urlIsSameOrigin.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
'use strict';

/**
* WARNING:
* This file makes references to objects that aren't safe in all environments.
* Please see lib/utils.isStandardBrowserEnv before including this file.
*/

var utils = require('./../utils');
var msie = /(msie|trident)/i.test(navigator.userAgent);
var urlParsingNode = document.createElement('a');
Expand Down
22 changes: 22 additions & 0 deletions lib/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,27 @@ function isArguments(val) {
return toString.call(val) === '[object Arguments]';
}

/**
* Determine if we're running in a standard browser environment
*
* This allows axios to run in a web worker, and react-native.
* Both environments support XMLHttpRequest, but not fully standard globals.
*
* web workers:
* typeof window -> undefined
* typeof document -> undefined
*
* react-native:
* typeof document.createelement -> undefined
*/
function isStandardBrowserEnv() {
return (
typeof window !== 'undefined' &&
typeof document !== 'undefined' &&
typeof document.createElement === 'function'
);
}

/**
* Iterate over an Array or an Object invoking a function for each item.
*
Expand Down Expand Up @@ -221,6 +242,7 @@ module.exports = {
isDate: isDate,
isFile: isFile,
isBlob: isBlob,
isStandardBrowserEnv: isStandardBrowserEnv,
forEach: forEach,
merge: merge,
trim: trim
Expand Down

1 comment on commit 6aa766e

@kodmunki
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why did this need to be done? I just discovered this after days of trying various things to get my xsrf working on react-native, and now that I have found this, it is unclear as to why Axios would not support xsrf on React Native.

Please sign in to comment.