get chunked responses working
authorRyan <ry@tinyclouds.org>
Wed, 6 May 2009 17:07:43 +0000 (19:07 +0200)
committerRyan <ry@tinyclouds.org>
Wed, 6 May 2009 17:08:38 +0000 (19:08 +0200)
src/http.js

index 0cf7e88..ebf74ca 100644 (file)
@@ -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);