diff options
| author | hackademix <giorgio@maone.net> | 2018-09-28 02:15:10 +0200 | 
|---|---|---|
| committer | hackademix <giorgio@maone.net> | 2018-09-28 02:15:10 +0200 | 
| commit | f881f1dbcd8c76685256f3701f25f916abda3e30 (patch) | |
| tree | ccc0bf0bdd142701580e65d1af2228de45169b2d /bg | |
| parent | ce5697b8c4d77ea595ce6a55292fafea73b8c2ec (diff) | |
Work-around for StreamFilter bug storing cached script in a way that messes up with encodings later (exacerbated by the license tag fixes).
Diffstat (limited to 'bg')
| -rw-r--r-- | bg/ResponseProcessor.js | 35 | 
1 files changed, 26 insertions, 9 deletions
diff --git a/bg/ResponseProcessor.js b/bg/ResponseProcessor.js index 1af8cd7..4443d90 100644 --- a/bg/ResponseProcessor.js +++ b/bg/ResponseProcessor.js @@ -33,7 +33,7 @@ class ResponseProcessor {    static install(handler, types = ["main_frame", "sub_frame", "script"]) {      if (listeners.has(handler)) return false; -    let listener =  +    let listener =        async request =>  await new ResponseTextFilter(request).process(handler);      listeners.set(handler, listener);      webRequestEvent.addListener( @@ -80,7 +80,7 @@ class ResponseTextFilter {        if (handler.post) handler = handler.post;        if (typeof handler !== "function") ResponseProcessor.ACCEPT;      } -     +      let {requestId, responseHeaders} = request;      let filter = browser.webRequest.filterResponseData(requestId);      let buffer = []; @@ -90,11 +90,29 @@ class ResponseTextFilter {      };      filter.onstop = async event => { -      let decoder = metaData.createDecoder(); +        let params = {stream: true}; -      response.text = buffer.map( -        chunk => decoder.decode(chunk, params)) -        .join(''); +      // concatenate chunks +      let size = buffer.reduce((sum, chunk, n) => sum + chunk.byteLength, 0) +      let allBytes = new Uint8Array(size); +      let pos = 0; +      for (let chunk of buffer) { +        allBytes.set(new Uint8Array(chunk), pos); +        pos += chunk.byteLength; +      } +      buffer = null; // allow garbage collection +      if (allBytes.indexOf(0) !== -1) { +        console.debug("Warning: zeroes in bytestream, probable cached encoding mismatch.", request); +        if (request.type === "script") { +          console.debug("It's a script, trying to refetch it."); +          response.text = await (await fetch(request.url, {cache: "reload", credentials: "include"})).text(); +        } else { +          console.debug("It's a %s, trying to decode it as UTF-16.", request.type); +          response.text = new TextDecoder("utf-16be").decode(allBytes); +        } +      } else { +        response.text = metaData.createDecoder().decode(allBytes, {stream: true}); +      }        let editedText = null;        try {          editedText = await handler(response); @@ -108,10 +126,9 @@ class ResponseTextFilter {          filter.write(new TextEncoder().encode(editedText));        } else {          // ... otherwise pass all the raw bytes through -        for (let chunk of buffer) filter.write(chunk); +        filter.write(allBytes);        } - -      filter.disconnect(); +      filter.close();      }      return metaData.forceUTF8() ? {responseHeaders} : ResponseProcessor.ACCEPT;;  | 
