commit 9494cf0f36127e0afa941c7ab2d2636b51e2ca2d Author: David Fifield <da...@bamsoftware.com> Date: Thu Mar 20 23:03:23 2014 -0700
Hold on to references to handlers. So they don't get garbage collected. --- firefox/components/main.js | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/firefox/components/main.js b/firefox/components/main.js index 0034db6..08e9ce2 100644 --- a/firefox/components/main.js +++ b/firefox/components/main.js @@ -40,6 +40,8 @@ function MeekHTTPHelper() { const LOCAL_PORT = 7000; + this.handlers = []; + // https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsIServerSocket var serverSocket = Components.classes["@mozilla.org/network/server-socket;1"] .createInstance(Components.interfaces.nsIServerSocket); @@ -60,7 +62,9 @@ MeekHTTPHelper.prototype = { // nsIServerSocketListener implementation. onSocketAccepted: function(server, transport) { dump("onSocketAccepted " + transport.host + ":" + transport.port + "\n"); - new MeekHTTPHelper.LocalConnectionHandler(transport); + // Stop referencing handlers that are no longer alive. + this.handlers = this.handlers.filter(function(h) { return h.transport.isAlive(); }); + this.handlers.push(new MeekHTTPHelper.LocalConnectionHandler(transport)); }, onStopListening: function(server, status) { dump("onStopListening status " + status + "\n"); @@ -111,12 +115,15 @@ MeekHTTPHelper.lookupStatus = function(status) { MeekHTTPHelper.LocalConnectionHandler = function(transport) { dump("LocalConnectionHandler\n"); this.transport = transport; + this.requestreader = null; + this.channel = null; + this.listener = null; this.readRequest(this.makeRequest.bind(this)); }; MeekHTTPHelper.LocalConnectionHandler.prototype = { readRequest: function(callback) { dump("readRequest\n"); - new MeekHTTPHelper.RequestReader(this.transport, this.makeRequest.bind(this)); + this.requestreader = new MeekHTTPHelper.RequestReader(this.transport, this.makeRequest.bind(this)); }, makeRequest: function(req) { @@ -128,12 +135,12 @@ MeekHTTPHelper.LocalConnectionHandler.prototype = { var uri = MeekHTTPHelper.ioService.newURI(req.url, null, null); // Construct an HTTP channel with the proxy bypass. // https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsIHttpChannel - var channel = MeekHTTPHelper.httpProtocolHandler.newProxiedChannel(uri, MeekHTTPHelper.directProxyInfo, 0, null) + this.channel = MeekHTTPHelper.httpProtocolHandler.newProxiedChannel(uri, MeekHTTPHelper.directProxyInfo, 0, null) .QueryInterface(Components.interfaces.nsIHttpChannel); if (req.header !== undefined) { for (var key in req.header) { dump("setting header " + key + ": " + req.header[key] + "\n"); - channel.setRequestHeader(key, req.header[key], false); + this.channel.setRequestHeader(key, req.header[key], false); } } if (req.body !== undefined) { @@ -141,15 +148,16 @@ MeekHTTPHelper.LocalConnectionHandler.prototype = { let inputStream = Components.classes["@mozilla.org/io/string-input-stream;1"] .createInstance(Components.interfaces.nsIStringInputStream); inputStream.setData(body, body.length); - let uploadChannel = channel.QueryInterface(Components.interfaces.nsIUploadChannel); + let uploadChannel = this.channel.QueryInterface(Components.interfaces.nsIUploadChannel); uploadChannel.setUploadStream(inputStream, "application/octet-stream", body.length); } // https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsIUploadChannel // says we must set requestMethod after calling setUploadStream. - channel.requestMethod = req.method; - channel.redirectionLimit = 0; + this.channel.requestMethod = req.method; + this.channel.redirectionLimit = 0; - channel.asyncOpen(new MeekHTTPHelper.HttpStreamListener(this.returnResponse.bind(this)), channel); + this.listener = new MeekHTTPHelper.HttpStreamListener(this.returnResponse.bind(this)); + this.channel.asyncOpen(this.listener, this.channel); }, returnResponse: function(resp) { _______________________________________________ tor-commits mailing list tor-commits@lists.torproject.org https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits