Move the http client's initParser() into prototype

This commit is contained in:
Ryan Dahl 2010-09-30 11:41:50 -07:00
parent f323f34353
commit c3bc48d451

View File

@ -842,13 +842,94 @@ function Client ( ) {
httpSocketSetup(self);
var parser;
function onData(d, start, end) {
if (!self.parser) {
throw new Error("parser not initialized prior to Client.ondata call");
}
var ret = self.parser.execute(d, start, end - start);
if (ret instanceof Error) {
self.destroy(ret);
} else if (self.parser.incoming && self.parser.incoming.upgrade) {
var bytesParsed = ret;
self.ondata = null;
self.onend = null
function initParser () {
if (!parser) parser = parsers.alloc();
parser.reinitialize('response');
parser.socket = self;
parser.onIncoming = function (res) {
var req = self.parser.incoming;
var upgradeHead = d.slice(start + bytesParsed + 1, end);
if (self.listeners('upgrade').length) {
self.emit('upgrade', req, self, upgradeHead);
} else {
self.destroy();
}
}
};
self.addListener("connect", function () {
debug('client connected');
self.ondata = onData;
self.onend = onEnd;
if (this.https) {
this.setSecure(this.credentials);
} else {
self._initParser();
debug('requests: ' + sys.inspect(self._outgoing));
outgoingFlush(self);
}
});
self.addListener("secure", function () {
self._initParser();
debug('requests: ' + sys.inspect(self._outgoing));
outgoingFlush(self);
});
function onEnd() {
if (self.parser) self.parser.finish();
debug("self got end closing. readyState = " + self.readyState);
self.end();
};
self.addListener("close", function (e) {
if (e) return;
debug("HTTP CLIENT onClose. readyState = " + self.readyState);
// finally done with the request
self._outgoing.shift();
// If there are more requests to handle, reconnect.
if (self._outgoing.length) {
self._reconnect();
} else if (self.parser) {
parsers.free(self.parser);
self.parser = null;
}
});
};
sys.inherits(Client, net.Stream);
exports.Client = Client;
exports.createClient = function (port, host, https, credentials) {
var c = new Client();
c.port = port;
c.host = host;
c.https = https;
c.credentials = credentials;
return c;
};
Client.prototype._initParser = function () {
var self = this;
if (!self.parser) self.parser = parsers.alloc();
self.parser.reinitialize('response');
self.parser.socket = self;
self.parser.onIncoming = function (res) {
debug("incoming response!");
var req = self._outgoing[0];
@ -880,87 +961,6 @@ function Client ( ) {
return isHeadResponse;
};
};
function onData(d, start, end) {
if (!parser) {
throw new Error("parser not initialized prior to Client.ondata call");
}
var ret = parser.execute(d, start, end - start);
if (ret instanceof Error) {
self.destroy(ret);
} else if (parser.incoming && parser.incoming.upgrade) {
var bytesParsed = ret;
self.ondata = null;
self.onend = null
var req = parser.incoming;
var upgradeHead = d.slice(start + bytesParsed + 1, end);
if (self.listeners('upgrade').length) {
self.emit('upgrade', req, self, upgradeHead);
} else {
self.destroy();
}
}
};
self.addListener("connect", function () {
debug('client connected');
self.ondata = onData;
self.onend = onEnd;
if (this.https) {
this.setSecure(this.credentials);
} else {
initParser();
debug('requests: ' + sys.inspect(self._outgoing));
outgoingFlush(self);
}
});
self.addListener("secure", function () {
initParser();
debug('requests: ' + sys.inspect(self._outgoing));
outgoingFlush(self);
});
function onEnd() {
if (parser) parser.finish();
debug("self got end closing. readyState = " + self.readyState);
self.end();
};
self.addListener("close", function (e) {
if (e) return;
debug("HTTP CLIENT onClose. readyState = " + self.readyState);
// finally done with the request
self._outgoing.shift();
// If there are more requests to handle, reconnect.
if (self._outgoing.length) {
self._reconnect();
} else if (parser) {
parsers.free(parser);
parser = null;
}
});
};
sys.inherits(Client, net.Stream);
exports.Client = Client;
exports.createClient = function (port, host, https, credentials) {
var c = new Client();
c.port = port;
c.host = host;
c.https = https;
c.credentials = credentials;
return c;
};