91 lines
2.2 KiB
HTML
91 lines
2.2 KiB
HTML
<!doctype html>
|
|
<meta charset="utf-8">
|
|
<title>Fetch and create Blob</title>
|
|
<script>
|
|
async function responseToBlob(response) {
|
|
let blob;
|
|
try {
|
|
blob = await response.blob();
|
|
} catch (e) {
|
|
return { error: `blob error: ${e.name}` };
|
|
}
|
|
|
|
return { url: URL.createObjectURL(blob) };
|
|
}
|
|
|
|
async function responseToData(response) {
|
|
const mimeType = response.headers.get("content-type");
|
|
|
|
let text;
|
|
try {
|
|
text = await response.text();
|
|
} catch(e) {
|
|
return { error: `text error: ${e.name}` };
|
|
}
|
|
|
|
return { url: `data:${mimeType},${encodeURIComponent(text)}` };
|
|
}
|
|
|
|
async function responseToFilesystem(response) {
|
|
if (!window.webkitRequestFileSystem) {
|
|
return { error: "unimplemented" };
|
|
}
|
|
|
|
let blob;
|
|
try {
|
|
blob = await response.blob();
|
|
} catch (e) {
|
|
return { error: `blob error: ${e.name}` };
|
|
}
|
|
|
|
const fs = await new Promise(resolve => {
|
|
window.webkitRequestFileSystem(window.TEMPORARY, 1024*1024, resolve);
|
|
});
|
|
|
|
const file = await new Promise(resolve => {
|
|
fs.root.getFile('fetch-and-create-url', { create: true }, resolve);
|
|
});
|
|
|
|
const writer = await new Promise(resolve => file.createWriter(resolve));
|
|
|
|
try {
|
|
await new Promise((resolve, reject) => {
|
|
writer.onwriteend = resolve;
|
|
writer.onerror = reject;
|
|
writer.write(blob);
|
|
});
|
|
} catch (e) {
|
|
return { error: `file write error: ${e.name}` };
|
|
}
|
|
|
|
return { url: file.toURL() };
|
|
}
|
|
|
|
async function responseToScheme(response, scheme) {
|
|
switch (scheme) {
|
|
case "blob":
|
|
return responseToBlob(response);
|
|
case "data":
|
|
return responseToData(response);
|
|
case "filesystem":
|
|
return responseToFilesystem(response);
|
|
default:
|
|
return { error: `unknown scheme: ${scheme}` };
|
|
}
|
|
}
|
|
|
|
async function fetchToScheme(url, scheme) {
|
|
let response;
|
|
try {
|
|
response = await fetch(url);
|
|
} catch (e) {
|
|
return { error: `fetch error: ${e.name}` };
|
|
}
|
|
|
|
return responseToScheme(response, scheme);
|
|
}
|
|
|
|
const params = new URL(window.location).searchParams;
|
|
fetchToScheme(params.get("url"), params.get("scheme"))
|
|
.then((message) => { parent.postMessage(message, "*"); });
|
|
</script>
|