const Cc = Components.classes; const Ci = Components.interfaces; function gzipCompressString(string, obs) { let scs = Cc["@mozilla.org/streamConverters;1"] .getService(Ci.nsIStreamConverterService); let listener = Cc["@mozilla.org/network/stream-loader;1"] .createInstance(Ci.nsIStreamLoader); listener.init(obs); let converter = scs.asyncConvertData("uncompressed", "gzip", listener, null); let stringStream = Cc["@mozilla.org/io/string-input-stream;1"] .createInstance(Ci.nsIStringInputStream); stringStream.data = string; converter.onStartRequest(null, null); converter.onDataAvailable(null, null, stringStream, 0, string.length); converter.onStopRequest(null, null, null); } function produceData() { var chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+"; var result = ''; for (var i = 0; i < 100000; ++i) { result += chars; } return result; } function handleRequest(request, response) { response.processAsync(); // Generate data var strings_to_send = produceData(); response.setHeader("Content-Type", "text/plain", false); response.setHeader("Content-Encoding", "gzip", false); let observer = { onStreamComplete: function(loader, context, status, length, result) { buffer = String.fromCharCode.apply(this, result); response.setHeader("Content-Length", ""+buffer.length, false); response.write(buffer); response.finish(); } }; gzipCompressString(strings_to_send, observer); }