mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2026-07-10 11:21:36 +00:00
150 lines
3.3 KiB
JavaScript
150 lines
3.3 KiB
JavaScript
import {defer, isXml, parse} from "./core";
|
|
import Path from "./path";
|
|
|
|
function request(url, type, withCredentials, headers) {
|
|
var supportsURL = (typeof window != "undefined") ? window.URL : false; // TODO: fallback for url if window isn't defined
|
|
var BLOB_RESPONSE = supportsURL ? "blob" : "arraybuffer";
|
|
|
|
var deferred = new defer();
|
|
|
|
var xhr = new XMLHttpRequest();
|
|
|
|
//-- Check from PDF.js:
|
|
// https://github.com/mozilla/pdf.js/blob/master/web/compatibility.js
|
|
var xhrPrototype = XMLHttpRequest.prototype;
|
|
|
|
var header;
|
|
|
|
if (!("overrideMimeType" in xhrPrototype)) {
|
|
// IE10 might have response, but not overrideMimeType
|
|
Object.defineProperty(xhrPrototype, "overrideMimeType", {
|
|
value: function xmlHttpRequestOverrideMimeType() {}
|
|
});
|
|
}
|
|
|
|
if(withCredentials) {
|
|
xhr.withCredentials = true;
|
|
}
|
|
|
|
xhr.onreadystatechange = handler;
|
|
xhr.onerror = err;
|
|
|
|
xhr.open("GET", url, true);
|
|
|
|
for(header in headers) {
|
|
xhr.setRequestHeader(header, headers[header]);
|
|
}
|
|
|
|
if(type == "json") {
|
|
xhr.setRequestHeader("Accept", "application/json");
|
|
}
|
|
|
|
// If type isn"t set, determine it from the file extension
|
|
if(!type) {
|
|
type = new Path(url).extension;
|
|
}
|
|
|
|
if(type == "blob"){
|
|
xhr.responseType = BLOB_RESPONSE;
|
|
}
|
|
|
|
|
|
if(isXml(type)) {
|
|
// xhr.responseType = "document";
|
|
xhr.overrideMimeType("text/xml"); // for OPF parsing
|
|
}
|
|
|
|
if(type == "xhtml") {
|
|
// xhr.responseType = "document";
|
|
}
|
|
|
|
if(type == "html" || type == "htm") {
|
|
// xhr.responseType = "document";
|
|
}
|
|
|
|
if(type == "binary") {
|
|
xhr.responseType = "arraybuffer";
|
|
}
|
|
|
|
xhr.send();
|
|
|
|
function err(e) {
|
|
deferred.reject(e);
|
|
}
|
|
|
|
function handler() {
|
|
if (this.readyState === XMLHttpRequest.DONE) {
|
|
var responseXML = false;
|
|
|
|
if(this.responseType === "" || this.responseType === "document") {
|
|
responseXML = this.responseXML;
|
|
}
|
|
|
|
if (this.status === 200 || this.status === 0 || responseXML) { //-- Firefox is reporting 0 for blob urls
|
|
var r;
|
|
|
|
if (!this.response && !responseXML) {
|
|
deferred.reject({
|
|
status: this.status,
|
|
message : "Empty Response",
|
|
stack : new Error().stack
|
|
});
|
|
return deferred.promise;
|
|
}
|
|
|
|
if (this.status === 403) {
|
|
deferred.reject({
|
|
status: this.status,
|
|
response: this.response,
|
|
message : "Forbidden",
|
|
stack : new Error().stack
|
|
});
|
|
return deferred.promise;
|
|
}
|
|
if(responseXML){
|
|
r = this.responseXML;
|
|
} else
|
|
if(isXml(type)){
|
|
// xhr.overrideMimeType("text/xml"); // for OPF parsing
|
|
// If this.responseXML wasn't set, try to parse using a DOMParser from text
|
|
r = parse(this.response, "text/xml");
|
|
}else
|
|
if(type == "xhtml"){
|
|
r = parse(this.response, "application/xhtml+xml");
|
|
}else
|
|
if(type == "html" || type == "htm"){
|
|
r = parse(this.response, "text/html");
|
|
}else
|
|
if(type == "json"){
|
|
r = JSON.parse(this.response);
|
|
}else
|
|
if(type == "blob"){
|
|
|
|
if(supportsURL) {
|
|
r = this.response;
|
|
} else {
|
|
//-- Safari doesn't support responseType blob, so create a blob from arraybuffer
|
|
r = new Blob([this.response]);
|
|
}
|
|
|
|
}else{
|
|
r = this.response;
|
|
}
|
|
|
|
deferred.resolve(r);
|
|
} else {
|
|
|
|
deferred.reject({
|
|
status: this.status,
|
|
message : this.response,
|
|
stack : new Error().stack
|
|
});
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
return deferred.promise;
|
|
}
|
|
|
|
export default request;
|