|
|
@@ -189,17 +189,19 @@ this.singlefile.lib.util = this.singlefile.lib.util || (() => {
|
|
|
|
|
|
async function getContent(resourceURL, options) {
|
|
|
let response, startTime;
|
|
|
+ const fetchResource = utilOptions.fetch;
|
|
|
if (DEBUG) {
|
|
|
startTime = Date.now();
|
|
|
log(" // STARTED download url =", resourceURL, "asBinary =", options.asBinary);
|
|
|
}
|
|
|
try {
|
|
|
- response = await getResponse(resourceURL, utilOptions.fetch);
|
|
|
+ response = await fetchResource(resourceURL);
|
|
|
} catch (error) {
|
|
|
return { data: options.asBinary ? "data:base64," : "", resourceURL };
|
|
|
}
|
|
|
- resourceURL = response.getUrl();
|
|
|
- let contentType = response.getContentType();
|
|
|
+ const buffer = await response.arrayBuffer();
|
|
|
+ resourceURL = response.url || resourceURL;
|
|
|
+ let contentType = response.headers.get("content-type");
|
|
|
let charset;
|
|
|
if (contentType) {
|
|
|
const matchContentType = contentType.toLowerCase().split(";");
|
|
|
@@ -223,17 +225,22 @@ this.singlefile.lib.util = this.singlefile.lib.util || (() => {
|
|
|
if (DEBUG) {
|
|
|
log(" // ENDED download url =", resourceURL, "delay =", Date.now() - startTime);
|
|
|
}
|
|
|
- if (options.maxResourceSizeEnabled && response.getSize() > options.maxResourceSize * ONE_MB) {
|
|
|
+ if (options.maxResourceSizeEnabled && buffer.byteLength > options.maxResourceSize * ONE_MB) {
|
|
|
return { data: "data:base64,", resourceURL };
|
|
|
} else {
|
|
|
- const dataUri = await response.getDataUri(contentType);
|
|
|
+ const reader = new FileReader();
|
|
|
+ reader.readAsDataURL(new Blob([buffer], { type: contentType || this.getContentType() }));
|
|
|
+ const dataUri = await new Promise((resolve, reject) => {
|
|
|
+ reader.addEventListener("load", () => resolve(reader.result), false);
|
|
|
+ reader.addEventListener("error", reject, false);
|
|
|
+ });
|
|
|
return { data: dataUri, resourceURL };
|
|
|
}
|
|
|
} catch (error) {
|
|
|
return { data: "data:base64,", resourceURL };
|
|
|
}
|
|
|
} else {
|
|
|
- if (response.getStatusCode() >= 400 || (options.validateTextContentType && contentType && !contentType.startsWith(PREFIX_CONTENT_TYPE_TEXT))) {
|
|
|
+ if (response.status >= 400 || (options.validateTextContentType && contentType && !contentType.startsWith(PREFIX_CONTENT_TYPE_TEXT))) {
|
|
|
return { data: "", resourceURL };
|
|
|
}
|
|
|
if (!charset) {
|
|
|
@@ -242,15 +249,15 @@ this.singlefile.lib.util = this.singlefile.lib.util || (() => {
|
|
|
if (DEBUG) {
|
|
|
log(" // ENDED download url =", resourceURL, "delay =", Date.now() - startTime);
|
|
|
}
|
|
|
- if (options.maxResourceSizeEnabled && response.getSize() > options.maxResourceSize * ONE_MB) {
|
|
|
+ if (options.maxResourceSizeEnabled && buffer.byteLength > options.maxResourceSize * ONE_MB) {
|
|
|
return { data: "", resourceURL, charset };
|
|
|
} else {
|
|
|
try {
|
|
|
- return { data: response.getText(charset), resourceURL, charset };
|
|
|
+ return { data: new TextDecoder(charset).decode(buffer), resourceURL, charset };
|
|
|
} catch (error) {
|
|
|
try {
|
|
|
charset = "utf-8";
|
|
|
- return { data: response.getText(charset), resourceURL, charset };
|
|
|
+ return { data: new TextDecoder(charset).decode(buffer), resourceURL, charset };
|
|
|
} catch (error) {
|
|
|
return { data: "", resourceURL, charset };
|
|
|
}
|
|
|
@@ -261,36 +268,6 @@ this.singlefile.lib.util = this.singlefile.lib.util || (() => {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
- async function getResponse(resourceURL, fetchResource) {
|
|
|
- const response = await fetchResource(resourceURL);
|
|
|
- const buffer = await response.arrayBuffer();
|
|
|
- return {
|
|
|
- getUrl() {
|
|
|
- return response.url || resourceURL;
|
|
|
- },
|
|
|
- getContentType() {
|
|
|
- return response.headers && response.headers.get("content-type");
|
|
|
- },
|
|
|
- getStatusCode() {
|
|
|
- return response.status;
|
|
|
- },
|
|
|
- getSize() {
|
|
|
- return buffer.byteLength;
|
|
|
- },
|
|
|
- getText(charset) {
|
|
|
- return new TextDecoder(charset).decode(buffer);
|
|
|
- },
|
|
|
- async getDataUri(contentType) {
|
|
|
- const reader = new FileReader();
|
|
|
- reader.readAsDataURL(new Blob([buffer], { type: contentType || this.getContentType() }));
|
|
|
- return new Promise((resolve, reject) => {
|
|
|
- reader.addEventListener("load", () => resolve(reader.result), false);
|
|
|
- reader.addEventListener("error", reject, false);
|
|
|
- });
|
|
|
- }
|
|
|
- };
|
|
|
- }
|
|
|
-
|
|
|
// https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest
|
|
|
function hex(buffer) {
|
|
|
const hexCodes = [];
|