in share/src/components/util.ts [56:115]
function httpRequestCoreAsync(options: HttpRequestOptions) {
return new Promise<HttpResponse>((resolve, reject) => {
let client: XMLHttpRequest;
let resolved = false
let headers = { ...options.headers }
client = new XMLHttpRequest();
if (options.responseArrayBuffer)
client.responseType = "arraybuffer";
client.onreadystatechange = () => {
if (resolved) return // Safari/iOS likes to call this thing more than once
if (client.readyState == 4) {
resolved = true
let res: HttpResponse = {
statusCode: client.status,
headers: {},
buffer: (client as any).responseBody || client.response,
text: options.responseArrayBuffer ? undefined : client.responseText,
}
const allHeaders = client.getAllResponseHeaders();
allHeaders.split(/\r?\n/).forEach(l => {
let m = /^\s*([^:]+): (.*)/.exec(l)
if (m) res.headers[m[1].toLowerCase()] = m[2]
})
resolve(res)
}
}
let data = options.data
let method = options.method || (data == null ? "GET" : "POST");
let buf: any;
if (data == null) {
buf = null
} else if (data instanceof Uint8Array) {
buf = data
} else if (typeof data == "object") {
buf = JSON.stringify(data)
headers["content-type"] = "application/json; charset=utf8"
} else if (typeof data == "string") {
buf = data
} else {
throw new Error("bad data");
}
client.open(method, options.url);
Object.keys(headers).forEach(k => {
client.setRequestHeader(k, headers[k])
})
if (buf == null)
client.send();
else
client.send(buf);
})
}