http: Remove legacy ECONNRESET workaround code
authorisaacs <i@izs.me>
Mon, 1 Apr 2013 22:46:51 +0000 (15:46 -0700)
committerisaacs <i@izs.me>
Wed, 3 Apr 2013 17:18:42 +0000 (10:18 -0700)
Fix #5179

lib/http.js
test/simple/test-http-many-ended-pipelines.js [new file with mode: 0644]

index 1f4db7a64758625c3e53c02b3f51293c18af2772..b4fc2add11318d11f94524f6085fcf099d28df51 100644 (file)
@@ -514,23 +514,7 @@ OutgoingMessage.prototype._writeRaw = function(data, encoding) {
     return this.connection.write(data, encoding);
   } else if (this.connection && this.connection.destroyed) {
     // The socket was destroyed.  If we're still trying to write to it,
-    // then something bad happened, but it could be just that we haven't
-    // gotten the 'close' event yet.
-    //
-    // In v0.10 and later, this isn't a problem, since ECONNRESET isn't
-    // ignored in the first place.  We'll probably emit 'close' on the
-    // next tick, but just in case it's not coming, set a timeout that
-    // will emit it for us.
-    if (!this._hangupClose) {
-      this._hangupClose = true;
-      var socket = this.socket;
-      var timer = setTimeout(function() {
-        socket.emit('close');
-      });
-      socket.once('close', function() {
-        clearTimeout(timer);
-      });
-    }
+    // then we haven't gotten the 'close' event yet.
     return false;
   } else {
     // buffer, as long as we're not destroyed.
diff --git a/test/simple/test-http-many-ended-pipelines.js b/test/simple/test-http-many-ended-pipelines.js
new file mode 100644 (file)
index 0000000..0d625be
--- /dev/null
@@ -0,0 +1,54 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var common = require('../common');
+var assert = require('assert');
+
+// no warnings should happen!
+var trace = console.trace;
+console.trace = function() {
+  trace.apply(console, arguments);
+  throw new Error('no tracing should happen here');
+};
+
+var http = require('http');
+var net = require('net');
+
+var server = http.createServer(function(req, res) {
+  res.end('ok');
+
+  // Oh no!  The connection died!
+  req.socket.destroy();
+});
+
+server.listen(common.PORT);
+
+var client = net.connect({ port: common.PORT, allowHalfOpen: true });
+for (var i = 0; i < 20; i++) {
+  client.write('GET / HTTP/1.1\r\n' +
+               'Host: some.host.name\r\n'+
+               '\r\n\r\n');
+}
+client.end();
+client.on('connect', function() {
+  server.close();
+});
+client.pipe(process.stdout);