import {URL} from 'url'; import {HttpVerb, Response} from 'then-request'; import handleQs from 'then-request/lib/handle-qs.js'; import {Options} from './Options'; import GenericResponse = require('http-response-object'); const fd = FormData as any; export {fd as FormData}; export default function doRequest( method: HttpVerb, url: string | URL, options?: Options ): Response { var xhr = new XMLHttpRequest(); // check types of arguments if (typeof method !== 'string') { throw new TypeError('The method must be a string.'); } if (url && typeof url === 'object') { url = url.href; } if (typeof url !== 'string') { throw new TypeError('The URL/path must be a string.'); } if (options === null || options === undefined) { options = {}; } if (typeof options !== 'object') { throw new TypeError('Options must be an object (or null).'); } method = method.toUpperCase() as any; options.headers = options.headers || {}; // handle cross domain var match; var crossDomain = !!( (match = /^([\w-]+:)?\/\/([^\/]+)/.exec(url)) && match[2] != location.host ); if (!crossDomain) options.headers['X-Requested-With'] = 'XMLHttpRequest'; // handle query string if (options.qs) { url = handleQs(url, options.qs); } // handle json body if (options.json) { options.body = JSON.stringify(options.json); options.headers['content-type'] = 'application/json'; } if (options.form) { options.body = options.form as any; } // method, url, async xhr.open(method, url, false); for (var name in options.headers) { xhr.setRequestHeader(name.toLowerCase(), '' + options.headers[name]); } // avoid sending empty string (#319) xhr.send(options.body ? options.body : null); var headers = {}; xhr .getAllResponseHeaders() .split('\r\n') .forEach(function(header) { var h = header.split(':'); if (h.length > 1) { (headers as any)[h[0].toLowerCase()] = h .slice(1) .join(':') .trim(); } }); return new GenericResponse( xhr.status, headers, xhr.responseText, url ); } module.exports = doRequest; module.exports.default = doRequest; module.exports.FormData = fd;