tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

fetch-and-create-url.html (2295B)


      1 <!doctype html>
      2 <meta charset="utf-8">
      3 <title>Fetch and create Blob</title>
      4 <script>
      5  async function responseToBlob(response) {
      6    let blob;
      7    try {
      8      blob = await response.blob();
      9    } catch (e) {
     10      return { error: `blob error: ${e.name}` };
     11    }
     12 
     13    return { url: URL.createObjectURL(blob) };
     14  }
     15 
     16  async function responseToData(response) {
     17    const mimeType = response.headers.get("content-type");
     18 
     19    let text;
     20    try {
     21      text = await response.text();
     22    } catch(e) {
     23      return { error: `text error: ${e.name}` };
     24    }
     25 
     26    return { url: `data:${mimeType},${encodeURIComponent(text)}` };
     27  }
     28 
     29  async function responseToFilesystem(response) {
     30    if (!window.webkitRequestFileSystem) {
     31      return { error: "unimplemented" };
     32    }
     33 
     34    let blob;
     35    try {
     36      blob = await response.blob();
     37    } catch (e) {
     38      return { error: `blob error: ${e.name}` };
     39    }
     40 
     41    const fs = await new Promise(resolve => {
     42      window.webkitRequestFileSystem(window.TEMPORARY, 1024*1024, resolve);
     43    });
     44 
     45    const file = await new Promise(resolve => {
     46      fs.root.getFile('fetch-and-create-url', { create: true }, resolve);
     47    });
     48 
     49    const writer = await new Promise(resolve => file.createWriter(resolve));
     50 
     51    try {
     52      await new Promise((resolve, reject) => {
     53        writer.onwriteend = resolve;
     54        writer.onerror = reject;
     55        writer.write(blob);
     56      });
     57    } catch (e) {
     58      return { error: `file write error: ${e.name}` };
     59    }
     60 
     61    return { url: file.toURL() };
     62  }
     63 
     64  async function responseToScheme(response, scheme) {
     65    switch (scheme) {
     66      case "blob":
     67        return responseToBlob(response);
     68      case "data":
     69        return responseToData(response);
     70      case "filesystem":
     71        return responseToFilesystem(response);
     72      default:
     73        return { error: `unknown scheme: ${scheme}` };
     74    }
     75  }
     76 
     77  async function fetchToScheme(url, scheme) {
     78    let response;
     79    try {
     80      response = await fetch(url);
     81    } catch (e) {
     82      return { error: `fetch error: ${e.name}` };
     83    }
     84 
     85    return responseToScheme(response, scheme);
     86  }
     87 
     88  const params = new URL(window.location).searchParams;
     89  fetchToScheme(params.get("url"), params.get("scheme"))
     90    .then((message) => { parent.postMessage(message, "*"); });
     91 </script>