mirror of
https://github.com/tenrok/axios.git
synced 2026-05-15 11:59:42 +03:00
Returned error treated when requesting uncommon URL (#3544)
* Fixing error returned when requesting illegal URL * Adding unit tests http.js * Fixing error message axios invalid request from browser * Adding unit tests requests.spec.js * Adding at utils.js a new method: getProtocol Co-authored-by: Jay <jasonsaayman@gmail.com>
This commit is contained in:
committed by
GitHub
parent
412d3bd607
commit
195c8e5ff5
@@ -122,7 +122,15 @@ module.exports = function httpAdapter(config) {
|
||||
// Parse url
|
||||
var fullPath = buildFullPath(config.baseURL, config.url);
|
||||
var parsed = url.parse(fullPath);
|
||||
var protocol = parsed.protocol || 'http:';
|
||||
var protocol = utils.getProtocol(parsed.protocol);
|
||||
|
||||
if (parsed.path === null) {
|
||||
return reject(createError('Malformed URL ' + fullPath, config));
|
||||
}
|
||||
|
||||
if (!utils.supportedProtocols.includes(protocol)) {
|
||||
return reject(createError('Unsupported protocol ' + protocol, config));
|
||||
}
|
||||
|
||||
if (!auth && parsed.auth) {
|
||||
var urlAuth = parsed.auth.split(':');
|
||||
|
||||
@@ -8,6 +8,7 @@ var buildFullPath = require('../core/buildFullPath');
|
||||
var parseHeaders = require('./../helpers/parseHeaders');
|
||||
var isURLSameOrigin = require('./../helpers/isURLSameOrigin');
|
||||
var createError = require('../core/createError');
|
||||
var url = require('url');
|
||||
var transitionalDefaults = require('../defaults/transitional');
|
||||
var Cancel = require('../cancel/Cancel');
|
||||
|
||||
@@ -41,6 +42,9 @@ module.exports = function xhrAdapter(config) {
|
||||
}
|
||||
|
||||
var fullPath = buildFullPath(config.baseURL, config.url);
|
||||
var parsed = url.parse(fullPath);
|
||||
var protocol = utils.getProtocol(parsed.protocol);
|
||||
|
||||
request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);
|
||||
|
||||
// Set the request timeout in MS
|
||||
@@ -206,6 +210,16 @@ module.exports = function xhrAdapter(config) {
|
||||
requestData = null;
|
||||
}
|
||||
|
||||
if (parsed.path === null) {
|
||||
reject(createError('Malformed URL ' + fullPath, config));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!utils.supportedProtocols.includes(protocol)) {
|
||||
reject(createError('Unsupported protocol ' + protocol, config));
|
||||
return;
|
||||
}
|
||||
|
||||
// Send the request
|
||||
request.send(requestData);
|
||||
});
|
||||
|
||||
@@ -6,6 +6,22 @@ var bind = require('./helpers/bind');
|
||||
|
||||
var toString = Object.prototype.toString;
|
||||
|
||||
/**
|
||||
* Array with axios supported protocols.
|
||||
*/
|
||||
var supportedProtocols = [ 'http:', 'https:', 'file:' ];
|
||||
|
||||
/**
|
||||
* Returns URL protocol passed as param if is not undefined or null,
|
||||
* otherwise just returns 'http:'
|
||||
*
|
||||
* @param {String} protocol The String value of URL protocol
|
||||
* @returns {String} Protocol if the value is not undefined or null
|
||||
*/
|
||||
function getProtocol(protocol) {
|
||||
return protocol || 'http:';
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if a value is an Array
|
||||
*
|
||||
@@ -324,6 +340,8 @@ function stripBOM(content) {
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
supportedProtocols: supportedProtocols,
|
||||
getProtocol: getProtocol,
|
||||
isArray: isArray,
|
||||
isArrayBuffer: isArrayBuffer,
|
||||
isBuffer: isBuffer,
|
||||
|
||||
@@ -481,4 +481,53 @@ describe('requests', function () {
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should support HTTP protocol', function (done) {
|
||||
var response;
|
||||
|
||||
axios.get('/foo')
|
||||
.then(function (res) {
|
||||
response = res
|
||||
})
|
||||
|
||||
getAjaxRequest().then(function (request) {
|
||||
expect(request.method).toBe('GET');
|
||||
request.respondWith({
|
||||
status: 200
|
||||
});
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should support HTTPS protocol', function (done) {
|
||||
var response;
|
||||
axios.get('https://www.google.com')
|
||||
.then(function (res) {
|
||||
response = res
|
||||
})
|
||||
|
||||
getAjaxRequest().then(function (request) {
|
||||
expect(request.method).toBe('GET');
|
||||
request.respondWith({
|
||||
status: 200
|
||||
});
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should return malformed url error message', function (done) {
|
||||
axios.get('tel:484-695-3408')
|
||||
.catch(function (error) {
|
||||
expect(error.message).toEqual('Malformed URL tel:484-695-3408')
|
||||
done();
|
||||
})
|
||||
});
|
||||
|
||||
it('should return unsupported protocol error message', function (done) {
|
||||
axios.get('ftp:google.com')
|
||||
.catch(function (error) {
|
||||
expect(error.message).toEqual('Unsupported protocol ftp:')
|
||||
done();
|
||||
})
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1038,6 +1038,86 @@ describe('supports http with nodejs', function () {
|
||||
});
|
||||
});
|
||||
|
||||
it('should support HTTP protocol', function (done) {
|
||||
server = http.createServer(function (req, res) {
|
||||
setTimeout(function () {
|
||||
res.end();
|
||||
}, 1000);
|
||||
}).listen(4444, function () {
|
||||
axios.get('http://localhost:4444')
|
||||
.then(function (res) {
|
||||
assert.equal(res.request.agent.protocol, 'http:');
|
||||
done();
|
||||
})
|
||||
})
|
||||
});
|
||||
|
||||
it('should support HTTPS protocol', function (done) {
|
||||
server = http.createServer(function (req, res) {
|
||||
setTimeout(function () {
|
||||
res.end();
|
||||
}, 1000);
|
||||
}).listen(4444, function () {
|
||||
axios.get('https://www.google.com')
|
||||
.then(function (res) {
|
||||
assert.equal(res.request.agent.protocol, 'https:');
|
||||
done();
|
||||
})
|
||||
})
|
||||
});
|
||||
|
||||
it('should return malformed URL', function (done) {
|
||||
var success = false, failure = false;
|
||||
var error;
|
||||
|
||||
server = http.createServer(function (req, res) {
|
||||
setTimeout(function () {
|
||||
res.end();
|
||||
}, 1000);
|
||||
}).listen(4444, function () {
|
||||
axios.get('tel:484-695-3408')
|
||||
.then(function (res) {
|
||||
success = true;
|
||||
}).catch(function (err) {
|
||||
error = err;
|
||||
failure = true;
|
||||
})
|
||||
|
||||
setTimeout(function () {
|
||||
assert.equal(success, false, 'request should not succeed');
|
||||
assert.equal(failure, true, 'request should fail');
|
||||
assert.equal(error.message, 'Malformed URL tel:484-695-3408');
|
||||
done();
|
||||
}, 300);
|
||||
})
|
||||
});
|
||||
|
||||
it('should return unsupported protocol', function (done) {
|
||||
var success = false, failure = false;
|
||||
var error;
|
||||
|
||||
server = http.createServer(function (req, res) {
|
||||
setTimeout(function () {
|
||||
res.end();
|
||||
}, 1000);
|
||||
}).listen(4444, function () {
|
||||
axios.get('ftp:google.com')
|
||||
.then(function (res) {
|
||||
success = true;
|
||||
}).catch(function (err) {
|
||||
error = err;
|
||||
failure = true;
|
||||
})
|
||||
|
||||
setTimeout(function () {
|
||||
assert.equal(success, false, 'request should not succeed');
|
||||
assert.equal(failure, true, 'request should fail');
|
||||
assert.equal(error.message, 'Unsupported protocol ftp:');
|
||||
done();
|
||||
}, 300);
|
||||
})
|
||||
});
|
||||
|
||||
it('should supply a user-agent if one is not specified', function (done) {
|
||||
server = http.createServer(function (req, res) {
|
||||
assert.equal(req.headers["user-agent"], 'axios/' + pkg.version);
|
||||
@@ -1097,6 +1177,5 @@ describe('supports http with nodejs', function () {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user