Browse Source

get chunked responses working

v0.7.4-release
Ryan 16 years ago
parent
commit
62a1465332
  1. 54
      src/http.js

54
src/http.js

@ -20,41 +20,73 @@ node.http.Server = function (RequestHandler, options) {
* are writing to responses out of order! HTTP requires that responses
* are returned in the same order the requests come.
*/
var output = "";
this.output = output;
this.output = "";
function send (data) {
if (responses[0] === this) {
connection.send(data);
} else {
output += data;
this.output += data;
}
};
this.sendStatus = function (status, reason) {
output += "HTTP/1.1 " + status.toString() + " " + reason + "\r\n";
// XXX http/1.0 until i get the keep-alive logic below working.
this.output += "HTTP/1.0 " + status.toString() + " " + reason + "\r\n";
};
var chunked_encoding = false;
var connection_close = false;
this.sendHeader = function (field, value) {
output += field + ": " + value.toString() + "\r\n";
this.output += field + ": " + value.toString() + "\r\n";
if (/Connection/i.exec(field) && /close/i.exec(value))
connection_close = true;
else if (/Transfer-Encoding/i.exec(field) && /chunk/i.exec(value))
chunked_encoding = true;
};
var headersSent = false;
var bodyBegan = false;
function toRaw(string) {
var a = [];
for (var i = 0; i < string.length; i++)
a.push(string.charCodeAt(i));
return i;
}
function chunkEncode (chunk) {
var hexlen = chunk.length.toString(16);
if (chunk.constructor === String)
return hexlen + "\r\n" + chunk + "\r\n";
// er..
}
this.sendBody = function (chunk) {
if (headersSent === false) {
output += "\r\n";
if (bodyBegan === false) {
this.output += "\r\n";
bodyBegan = true;
}
output += chunk;
if (chunked_encoding)
this.output += chunkEncode(chunk)
else
this.output += chunk;
if (responses[0] === this) {
connection.send(output);
output = "";
connection.send(this.output);
this.output = "";
}
};
var finished = false;
this.finish = function () {
if (chunked_encoding)
this.output += "0\r\n\r\n"; // last chunk
this.finished = true;
while (responses.length > 0 && responses[0].finished) {
var res = responses.shift();
connection.send(res.output);

Loading…
Cancel
Save