with great performance hit, a patch to handle binary
authorRyan <ry@tinyclouds.org>
Mon, 9 Mar 2009 16:26:42 +0000 (17:26 +0100)
committerRyan <ry@tinyclouds.org>
Mon, 9 Mar 2009 16:26:46 +0000 (17:26 +0100)
(need to get the v8 people to produce something that doesn't require copying
buffers 20 times.)

node.cc
node_http.cc

diff --git a/node.cc b/node.cc
index b76a462..583f8b2 100644 (file)
--- a/node.cc
+++ b/node.cc
@@ -20,23 +20,35 @@ static int exit_code = 0;
 static Handle<String>
 ReadFile (const string& name) 
 {
+
   FILE* file = fopen(name.c_str(), "rb");
   if (file == NULL) return Handle<String>();
-
   fseek(file, 0, SEEK_END);
   int size = ftell(file);
   rewind(file);
 
-  char* chars = new char[size + 1];
+  char chars[size+1];
   chars[size] = '\0';
   for (int i = 0; i < size;) {
     int read = fread(&chars[i], 1, size - i, file);
+    if(read <= 0) {
+      perror("read()");
+    }
     i += read;
   }
+
+  uint16_t expanded_base[size+1];
+  expanded_base[size] = '\0';
+  for(int i = 0; i < size; i++) 
+    expanded_base[i] = chars[i];
+
   fclose(file);
-  Handle<String> result = String::New(chars, size);
-  delete[] chars;
-  return result;
+
+  HandleScope scope;
+  Local<String> result = String::New(expanded_base, size);
+
+  return scope.Close(result);
 }
 
 static Handle<Value>
@@ -61,7 +73,6 @@ BlockingFileRead (const Arguments& args)
   HandleScope scope;
 
   String::Utf8Value filename(args[0]);
-
   Handle<String> output = ReadFile (*filename);
   return scope.Close(output);
 }
index df5a858..fcc032b 100644 (file)
@@ -160,7 +160,14 @@ HttpRequest::Respond (Handle<Value> data)
   } else {
     Handle<String> s = data->ToString();
     oi_buf *buf = oi_buf_new2(s->Length());
-    s->WriteAscii(buf->base, 0, s->Length());
+
+    uint16_t expanded[s->Length()];
+    s->Write(expanded, 0, s->Length());
+
+    for(int i = 0; i < s->Length(); i++) {
+      buf->base[i] = expanded[i];
+    }
+
     output.push_back(buf);
   }
   connection.Write();
@@ -349,7 +356,14 @@ HttpRequest::MakeBodyCallback (const char *base, size_t length)
   
   if(length) {
     // TODO ByteArray?
-    Handle<String> chunk = String::New(base, length);
+    //
+    
+    uint16_t expanded_base[length];
+    for(int i = 0; i < length; i++) {
+      expanded_base[i] = base[i];
+    }
+
+    Handle<String> chunk = String::New(expanded_base, length);
     argv[0] = chunk;
   } else {
     argv[0] = Null();