react-ssr-test/xhr.js

118 lines
2.2 KiB
JavaScript

export { GET, POST };
function GET(url, data, cb)
{
var options = {};
if (typeof url == 'object')
{
options = url;
url = options.url;
}
var r = create_request_object();
url = url + (url.indexOf('?') >= 0 ? '&' : '?') + http_build_query(data);
r.open('GET', url);
set_request_callback(r, cb, options);
r.send();
return r;
}
function POST(url, data, cb)
{
var options = {};
if (typeof url == 'object')
{
options = url;
url = options.url;
}
var r = create_request_object();
r.open('POST', url);
set_request_callback(r, cb, options);
if (typeof data != 'string' && (!window.FormData || !(data instanceof FormData)))
{
r.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
data = http_build_query(data);
}
r.send(data);
return r;
}
function create_request_object()
{
if (typeof XMLHttpRequest === 'undefined')
{
XMLHttpRequest = function()
{
try { return new ActiveXObject("Msxml2.XMLHTTP"); }
catch(e) {}
try { return new ActiveXObject("Microsoft.XMLHTTP"); }
catch(e) {}
throw new Error("This browser does not support XMLHttpRequest.");
};
}
return new XMLHttpRequest();
}
function set_request_callback(r, cb, options)
{
if (options.timeout)
r.timeout = options.timeout;
if (options.headers)
for (var k in options.headers)
r.setRequestHeader(k, options.headers[k]);
r.onreadystatechange = function()
{
if (r.readyState == 4)
{
var d;
if (r.getResponseHeader('Content-Type').indexOf('/json') > 0)
{
d = json_decode(r.responseText);
}
cb(r, d);
}
};
}
function build_array_query(data, prefix)
{
var s = '', k;
for (var i in data)
{
k = prefix ? prefix+'['+encodeURIComponent(i)+']' : encodeURIComponent(i);
if (typeof data[i] == 'object' && data[i] !== null)
s += build_array_query(data[i], k);
else
s = s+'&'+k+'='+(data[i] === false || data[i] === null || data[i] === undefined ? '' : encodeURIComponent(data[i]));
}
return s;
}
function http_build_query(data)
{
return build_array_query(data).substr(1);
}
function json_decode(text)
{
if (!text)
{
return null;
}
try
{
if (window.JSON)
{
return JSON.parse(text);
}
return eval(text);
}
catch(e)
{
if (window.console)
{
console.log(e);
}
}
return null;
}