all errors go to req object
authorRyan Dahl <ry@tinyclouds.org>
Thu, 20 Jan 2011 23:55:02 +0000 (15:55 -0800)
committerRyan Dahl <ry@tinyclouds.org>
Fri, 21 Jan 2011 02:10:15 +0000 (18:10 -0800)
lib/http.js

index 1768e76..c60703b 100644 (file)
@@ -810,6 +810,7 @@ function connectionListener(socket) {
   var parser = parsers.alloc();
   parser.reinitialize('request');
   parser.socket = socket;
+  parser.incoming = null;
 
   socket.addListener('error', function(e) {
     self.emit('clientError', e);
@@ -953,6 +954,20 @@ Agent.prototype._establishNewConnection = function() {
   var parser = parsers.alloc();
   parser.reinitialize('response');
   parser.socket = socket;
+  parser.incoming = null;
+
+  socket.on('error', function(err) {
+    debug("AGENT SOCKET ERROR: " + err.message);
+    if (socket._httpMessage) {
+      socket._httpMessage.emit('error', err);
+    } else if (self.queue.length) {
+      var req = self.queue.shift();
+      if (req) req.emit('error', err);
+    } else {
+      // No requests on queue? Where is the request
+      assert(0);
+    }
+  });
 
   socket.ondata = function(d, start, end) {
     var ret = parser.execute(d, start, end - start);
@@ -998,6 +1013,8 @@ Agent.prototype._establishNewConnection = function() {
     var req = socket._httpMessage;
     assert(req);
 
+    req.res = res;
+
     // Responses to HEAD requests are AWFUL. Ask Ryan.
     // A major oversight in HTTP. Hence this nastiness.
     var isHeadResponse = req.method == 'HEAD';
@@ -1100,11 +1117,7 @@ exports.request = function(options, cb) {
   var agent = getAgent(options.host, options.port);
   var req = agent.appendMessage(options);
 
-  if (cb) {
-    req.once('response', function (res) {
-      cb(null, res);
-    });
-  }
+  if (cb) req.once('response', cb);
 
   return req;
 };
@@ -1123,6 +1136,7 @@ function Client(port, host) {
   this.port = port;
   this.host = host;
 }
+util.inherits(Client, EventEmitter);
 
 
 Client.prototype.request = function(method, path, headers) {
@@ -1141,7 +1155,15 @@ Client.prototype.request = function(method, path, headers) {
     host: this.host
   };
 
-  return exports.request(options);
+  var self = this;
+  var req = exports.request(options);
+
+  // proxy error events from req to Client
+  req.on('error', function(err) {
+    self.emit('error', err);
+  });
+
+  return req;
 };