browser(firefox): do not fail when decoding large responses (#2671)
This commit is contained in:
parent
3d49af2537
commit
687067831a
|
|
@ -1 +1 @@
|
||||||
1115
|
1116
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ const {EventEmitter} = ChromeUtils.import('resource://gre/modules/EventEmitter.j
|
||||||
const {Helper} = ChromeUtils.import('chrome://juggler/content/Helper.js');
|
const {Helper} = ChromeUtils.import('chrome://juggler/content/Helper.js');
|
||||||
const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
||||||
const {NetUtil} = ChromeUtils.import('resource://gre/modules/NetUtil.jsm');
|
const {NetUtil} = ChromeUtils.import('resource://gre/modules/NetUtil.jsm');
|
||||||
const {CommonUtils} = ChromeUtils.import("resource://services-common/utils.js");
|
|
||||||
|
|
||||||
|
|
||||||
const Cc = Components.classes;
|
const Cc = Components.classes;
|
||||||
|
|
@ -794,12 +793,52 @@ class ResponseStorage {
|
||||||
let result = response.body;
|
let result = response.body;
|
||||||
if (response.encodings && response.encodings.length) {
|
if (response.encodings && response.encodings.length) {
|
||||||
for (const encoding of response.encodings)
|
for (const encoding of response.encodings)
|
||||||
result = CommonUtils.convertString(result, encoding, 'uncompressed');
|
result = convertString(result, encoding, 'uncompressed');
|
||||||
}
|
}
|
||||||
return {base64body: btoa(result)};
|
return {base64body: btoa(result)};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function convertString(s, source, dest) {
|
||||||
|
const is = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(
|
||||||
|
Ci.nsIStringInputStream
|
||||||
|
);
|
||||||
|
is.setData(s, s.length);
|
||||||
|
const listener = Cc["@mozilla.org/network/stream-loader;1"].createInstance(
|
||||||
|
Ci.nsIStreamLoader
|
||||||
|
);
|
||||||
|
let result = [];
|
||||||
|
listener.init({
|
||||||
|
onStreamComplete: function onStreamComplete(
|
||||||
|
loader,
|
||||||
|
context,
|
||||||
|
status,
|
||||||
|
length,
|
||||||
|
data
|
||||||
|
) {
|
||||||
|
const array = Array.from(data);
|
||||||
|
const kChunk = 100000;
|
||||||
|
for (let i = 0; i < length; i += kChunk) {
|
||||||
|
const len = Math.min(kChunk, length - i);
|
||||||
|
const chunk = String.fromCharCode.apply(this, array.slice(i, i + len));
|
||||||
|
result.push(chunk);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const converter = Cc["@mozilla.org/streamConverters;1"].getService(
|
||||||
|
Ci.nsIStreamConverterService
|
||||||
|
).asyncConvertData(
|
||||||
|
source,
|
||||||
|
dest,
|
||||||
|
listener,
|
||||||
|
null
|
||||||
|
);
|
||||||
|
converter.onStartRequest(null, null);
|
||||||
|
converter.onDataAvailable(null, is, 0, s.length);
|
||||||
|
converter.onStopRequest(null, null, null);
|
||||||
|
return result.join('');
|
||||||
|
}
|
||||||
|
|
||||||
const errorMap = {
|
const errorMap = {
|
||||||
'aborted': Cr.NS_ERROR_ABORT,
|
'aborted': Cr.NS_ERROR_ABORT,
|
||||||
'accessdenied': Cr.NS_ERROR_PORT_ACCESS_NOT_ALLOWED,
|
'accessdenied': Cr.NS_ERROR_PORT_ACCESS_NOT_ALLOWED,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue