atlassian-connect-js-request
Advanced tools
Comparing version 0.2.3 to 0.2.4
@@ -22,9 +22,2 @@ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.connectHostRequest = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){ | ||
}); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } | ||
var _dollar = _dereq_('./dollar'); | ||
var _dollar2 = _interopRequireDefault(_dollar); | ||
var XHR_PROPERTIES = ['status', 'statusText', 'responseText']; | ||
@@ -50,3 +43,3 @@ var XHR_HEADERS = ['Content-Type', 'ETag']; | ||
// only copy key properties and headers for transport across the bridge | ||
_dollar2['default'].each(XHR_PROPERTIES, function (i, v) { | ||
XHR_PROPERTIES.forEach(function (v, i) { | ||
json[v] = xhr[v]; | ||
@@ -60,7 +53,7 @@ if (v === 'responseText') { | ||
} | ||
}); | ||
}, this); | ||
// only copy key response headers for transport across the bridge | ||
_dollar2['default'].each(XHR_HEADERS, function (i, v) { | ||
XHR_HEADERS.forEach(function (v, i) { | ||
json.headers[v] = xhr.getResponseHeader(v); | ||
}); | ||
}, this); | ||
return json; | ||
@@ -162,7 +155,7 @@ } | ||
url = url.replace(/\/\.\.\//ig, ''); // strip /../ from urls | ||
args.headers = args.headers || {}; | ||
Object.getOwnPropertyNames(args.headers).forEach(function (k) { | ||
headers[k.toLowerCase()] = args.headers[k]; | ||
}, this); | ||
_dollar2['default'].each(args.headers || {}, function (k, v) { | ||
headers[k.toLowerCase()] = v; | ||
}); | ||
function done(data, textStatus, xhr) { | ||
@@ -175,5 +168,2 @@ callback(false, toJSON(xhr), data); | ||
// Disable system ajax settings. This stops confluence mobile from injecting callbacks and then throwing exceptions. | ||
// $.ajaxSettings = {}; | ||
// execute the request with our restricted set of inputs | ||
@@ -202,23 +192,52 @@ var ajaxOptions = { | ||
if (args.experimental === true) { | ||
ajaxOptions.headers["X-ExperimentalApi"] = "opt-in"; | ||
ajaxOptions.headers['X-ExperimentalApi'] = 'opt-in'; | ||
} | ||
_dollar2['default'].each(REQUEST_HEADERS_WHITELIST, function (index, header) { | ||
REQUEST_HEADERS_WHITELIST.forEach(function (header, index) { | ||
if (headers[header.toLowerCase()]) { | ||
ajaxOptions.headers[header] = headers[header.toLowerCase()]; | ||
} | ||
}, this); | ||
if (!ajaxOptions.cache) { | ||
ajaxOptions.url += (ajaxOptions.url.indexOf('?') >= 0 ? '&' : '?') + '_r=' + new Date().getTime(); | ||
} | ||
var request = new XMLHttpRequest(); | ||
request.open(ajaxOptions.type, ajaxOptions.url, true); | ||
// set headers | ||
if (ajaxOptions.contentType) { | ||
ajaxOptions.headers['Content-type'] = ajaxOptions.contentType; | ||
} | ||
Object.getOwnPropertyNames(ajaxOptions.headers).forEach(function (headerName) { | ||
request.setRequestHeader(headerName, ajaxOptions.headers[headerName]); | ||
}); | ||
_dollar2['default'].ajax(ajaxOptions).then(done, fail); | ||
// response loaded | ||
request.onload = function () { | ||
if (this.status >= 200 && this.status < 300) { | ||
// Success! | ||
done(request.responseText, request.statusText, request); | ||
} else { | ||
fail(request, request.statusText, request.responseText); | ||
// We reached our target server, but it returned an error | ||
} | ||
}; | ||
// response failed to load | ||
request.onerror = function () { | ||
// There was a connection error of some sort | ||
fail(request, request.statusText, request.responseText); | ||
}; | ||
try { | ||
request.send(ajaxOptions.data || null); | ||
} catch (e) { | ||
fail(request, undefined, e); | ||
console.error('ACJS Request: ', e.message, e); | ||
} | ||
} | ||
}; | ||
},{"./dollar":2}],2:[function(_dereq_,module,exports){ | ||
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
exports["default"] = AJS.$; | ||
module.exports = exports["default"]; | ||
},{}]},{},[1])(1) | ||
}); |
{ | ||
"name": "atlassian-connect-js-request", | ||
"version": "0.2.3", | ||
"version": "0.2.4", | ||
"description": "Request module for Atlassian Connect", | ||
@@ -23,2 +23,2 @@ "devDependencies": { | ||
} | ||
} | ||
} |
@@ -5,2 +5,10 @@ import requestHost, { stripJWTUrls } from '../../src/host'; | ||
beforeEach(function() { | ||
jasmine.Ajax.install(); | ||
}); | ||
afterEach(function() { | ||
jasmine.Ajax.uninstall(); | ||
}); | ||
window.AJS.contextPath = () => ''; | ||
@@ -61,3 +69,3 @@ | ||
it('calls $.ajax with correct options', () => { | ||
it('calls ajax with correct options', () => { | ||
const requestOptions = { | ||
@@ -69,15 +77,13 @@ url: '/some/url' | ||
spyOn($, 'ajax').and.callFake((options) => { | ||
expect(options.url).toEqual(requestOptions.url); | ||
expect(options.type).toEqual('GET'); | ||
expect(options.data).not.toBeDefined(); | ||
expect(options.headers['Accept']).toEqual('*/*'); | ||
expect(options.headers['AP-Client-Key']).toEqual(defaultContext.extension.addon_key); | ||
return $.Deferred((defer) => { | ||
defer.resolve('data', 'statusText', new XMLHttpRequest()); | ||
}); | ||
jasmine.Ajax.stubRequest(/.*/).andReturn({ | ||
'responseText': 'immediate response' | ||
}); | ||
requestHost.request(requestOptions, callback); | ||
expect($.ajax).toHaveBeenCalled(); | ||
expect(jasmine.Ajax.requests.mostRecent().method).toBe('GET'); | ||
expect(jasmine.Ajax.requests.mostRecent().params).toEqual(null); | ||
expect(jasmine.Ajax.requests.mostRecent().requestHeaders['Accept']).toEqual('*/*'); | ||
expect(jasmine.Ajax.requests.mostRecent().requestHeaders['AP-Client-Key']).toEqual(defaultContext.extension.addon_key); | ||
expect(jasmine.Ajax.requests.mostRecent().url).toContain(requestOptions.url); | ||
}); | ||
@@ -99,13 +105,10 @@ | ||
spyOn($, 'ajax').and.callFake((options) => { | ||
expect(options.headers['If-Match']).toEqual(ifMatchVal); | ||
expect(options.headers['If-None-Match']).toEqual(ifNoneMatchVal); | ||
expect(options.headers['Not-Valid-Header']).not.toBeDefined(); | ||
return $.Deferred((defer) => { | ||
defer.resolve('data', 'statusText', new XMLHttpRequest()); | ||
}); | ||
jasmine.Ajax.stubRequest(/.*/).andReturn({ | ||
'responseText': 'response text' | ||
}); | ||
requestHost.request(requestOptions, callback); | ||
expect($.ajax).toHaveBeenCalled(); | ||
expect(jasmine.Ajax.requests.mostRecent().requestHeaders['If-Match']).toEqual(ifMatchVal); | ||
expect(jasmine.Ajax.requests.mostRecent().requestHeaders['If-None-Match']).toEqual(ifNoneMatchVal); | ||
expect(jasmine.Ajax.requests.mostRecent().requestHeaders['Not-Valid-Header']).not.toBeDefined(); | ||
}); | ||
@@ -121,11 +124,8 @@ | ||
spyOn($, 'ajax').and.callFake((options) => { | ||
expect(options.headers['X-ExperimentalApi']).not.toBeDefined(); | ||
return $.Deferred((defer) => { | ||
defer.resolve('data', 'statusText', new XMLHttpRequest()); | ||
}); | ||
jasmine.Ajax.stubRequest(/.*/).andReturn({ | ||
'responseText': 'response text' | ||
}); | ||
requestHost.request(requestOptions, callback); | ||
expect($.ajax).toHaveBeenCalled() | ||
expect(jasmine.Ajax.requests.mostRecent().requestHeaders['X-ExperimentalApi']).not.toBeDefined(); | ||
}); | ||
@@ -141,11 +141,7 @@ | ||
spyOn($, 'ajax').and.callFake((options) => { | ||
expect(options.headers['X-ExperimentalApi']).toEqual('opt-in'); | ||
return $.Deferred((defer) => { | ||
defer.resolve('data', 'statusText', new XMLHttpRequest()); | ||
}); | ||
jasmine.Ajax.stubRequest(/.*/).andReturn({ | ||
'responseText': 'response text' | ||
}); | ||
requestHost.request(requestOptions, callback); | ||
expect($.ajax).toHaveBeenCalled() | ||
expect(jasmine.Ajax.requests.mostRecent().requestHeaders['X-ExperimentalApi']).toEqual('opt-in'); | ||
}); | ||
@@ -172,19 +168,15 @@ }); | ||
it('adds the X-Atlassian-Token header to the request', () => { | ||
spyOn($, 'ajax').and.callFake((options) => { | ||
expect(options.headers['X-Atlassian-Token']).toEqual('no-check'); | ||
return $.Deferred((defer) => { | ||
defer.resolve('data', 'statusText', new XMLHttpRequest()); | ||
}); | ||
jasmine.Ajax.stubRequest(/.*/).andReturn({ | ||
'responseText': 'response text' | ||
}); | ||
requestHost.request(requestOptions, callback); | ||
expect(jasmine.Ajax.requests.mostRecent().requestHeaders['X-Atlassian-Token']).toEqual('no-check'); | ||
}); | ||
it('constructs the FormData', () => { | ||
spyOn($, 'ajax').and.callFake((options) => { | ||
expect(options.data instanceof FormData).toBe(true); | ||
return $.Deferred((defer) => { | ||
defer.resolve('data', 'statusText', new XMLHttpRequest()); | ||
}); | ||
jasmine.Ajax.stubRequest(/.*/).andReturn({ | ||
'responseText': 'response text' | ||
}); | ||
requestHost.request(requestOptions, callback); | ||
expect(jasmine.Ajax.requests.mostRecent().params instanceof FormData).toBe(true); | ||
}); | ||
@@ -200,2 +192,5 @@ | ||
try { | ||
jasmine.Ajax.stubRequest(/.*/).andReturn({ | ||
'responseText': 'response text' | ||
}); | ||
requestHost.request(badrequestOptions, callback); | ||
@@ -226,7 +221,7 @@ } catch (e) { | ||
spyOn($, 'ajax').and.callFake((options) => { | ||
return $.Deferred((defer) => { | ||
defer.resolve(data, statusText, xhr); | ||
}); | ||
jasmine.Ajax.stubRequest(/.*/).andReturn({ | ||
'responseText': data, | ||
'status': statusText | ||
}); | ||
requestHost.request(requestOptions, callback); | ||
@@ -239,3 +234,2 @@ expect(callback).toHaveBeenCalled(); | ||
const statusText = '500'; | ||
const xhr = new XMLHttpRequest(); | ||
@@ -250,6 +244,5 @@ const callback = jasmine.createSpy('callback').and.callFake((errorThrown, textStatus, error2) => { | ||
spyOn($, 'ajax').and.callFake((options) => { | ||
return $.Deferred((defer) => { | ||
defer.reject(xhr, statusText, 'some error'); | ||
}); | ||
jasmine.Ajax.stubRequest(/.*/).andReturn({ | ||
'responseText': error, | ||
'status': statusText | ||
}); | ||
@@ -256,0 +249,0 @@ requestHost.request(requestOptions, callback); |
@@ -16,4 +16,2 @@ /** | ||
import $ from './dollar'; | ||
const XHR_PROPERTIES = ['status', 'statusText', 'responseText']; | ||
@@ -40,3 +38,3 @@ const XHR_HEADERS = ['Content-Type', 'ETag']; | ||
// only copy key properties and headers for transport across the bridge | ||
$.each(XHR_PROPERTIES, function (i, v) { | ||
XHR_PROPERTIES.forEach(function (v, i) { | ||
json[v] = xhr[v]; | ||
@@ -50,5 +48,7 @@ if(v === 'responseText'){ | ||
} | ||
}); | ||
}, this); | ||
// only copy key response headers for transport across the bridge | ||
$.each(XHR_HEADERS, function (i, v) { json.headers[v] = xhr.getResponseHeader(v); }); | ||
XHR_HEADERS.forEach(function (v, i) { | ||
json.headers[v] = xhr.getResponseHeader(v); | ||
}, this); | ||
return json; | ||
@@ -152,7 +152,7 @@ } | ||
url = url.replace(/\/\.\.\//ig,''); // strip /../ from urls | ||
args.headers = args.headers || {} | ||
Object.getOwnPropertyNames(args.headers).forEach(function(k) { | ||
headers[k.toLowerCase()] = args.headers[k]; | ||
}, this); | ||
$.each(args.headers || {}, function (k, v) { | ||
headers[k.toLowerCase()] = v; | ||
}); | ||
function done(data, textStatus, xhr) { | ||
@@ -165,5 +165,2 @@ callback(false, toJSON(xhr), data); | ||
// Disable system ajax settings. This stops confluence mobile from injecting callbacks and then throwing exceptions. | ||
// $.ajaxSettings = {}; | ||
// execute the request with our restricted set of inputs | ||
@@ -192,13 +189,50 @@ var ajaxOptions = { | ||
if (args.experimental === true) { | ||
ajaxOptions.headers["X-ExperimentalApi"] = "opt-in"; | ||
ajaxOptions.headers['X-ExperimentalApi'] = 'opt-in'; | ||
} | ||
$.each(REQUEST_HEADERS_WHITELIST, function (index, header) { | ||
REQUEST_HEADERS_WHITELIST.forEach(function (header, index) { | ||
if (headers[header.toLowerCase()]) { | ||
ajaxOptions.headers[header] = headers[header.toLowerCase()]; | ||
} | ||
}, this); | ||
if(!ajaxOptions.cache) { | ||
ajaxOptions.url += (ajaxOptions.url.indexOf('?') >= 0 ? '&' : '?') + '_r=' + new Date().getTime(); | ||
} | ||
var request = new XMLHttpRequest(); | ||
request.open(ajaxOptions.type, ajaxOptions.url, true); | ||
// set headers | ||
if(ajaxOptions.contentType) { | ||
ajaxOptions.headers['Content-type'] = ajaxOptions.contentType; | ||
} | ||
Object.getOwnPropertyNames(ajaxOptions.headers).forEach((headerName) => { | ||
request.setRequestHeader(headerName, ajaxOptions.headers[headerName]); | ||
}); | ||
$.ajax(ajaxOptions).then(done, fail); | ||
// response loaded | ||
request.onload = function() { | ||
if (this.status >= 200 && this.status < 300) { | ||
// Success! | ||
done(request.responseText, request.statusText, request); | ||
} else { | ||
fail(request, request.statusText, request.responseText); | ||
// We reached our target server, but it returned an error | ||
} | ||
}; | ||
// response failed to load | ||
request.onerror = function() { | ||
// There was a connection error of some sort | ||
fail(request, request.statusText, request.responseText); | ||
}; | ||
try { | ||
request.send(ajaxOptions.data || null); | ||
} catch ( e ) { | ||
fail(request, undefined, e); | ||
console.error('ACJS Request: ', e.message, e); | ||
} | ||
} | ||
}; |
52868
1180
8