Merge branch 'master' into openssl
authorRhys Jones <rhys@wave.to>
Wed, 14 Apr 2010 06:31:33 +0000 (07:31 +0100)
committerRhys Jones <rhys@wave.to>
Wed, 14 Apr 2010 06:31:33 +0000 (07:31 +0100)
Conflicts:
lib/net.js
wscript

1  2 
lib/http.js
lib/net.js
src/node.cc
wscript

diff --cc lib/http.js
index 691c135a53673875e1d5280bb11b7dee6be36941,28e3e3e2498846c3b2f2f473cd39f36b32ce9c40..d3e7b62a39520bf60374dd0503d46c47bc25c5ed
@@@ -501,12 -507,10 +512,14 @@@ function connectionListener (socket) 
    // we need to keep track of the order they were sent.
    var responses = [];
  
-   var parser = newParser('request');
+   var parser = parsers.alloc();
+   parser.reinitialize('request');
+   parser.socket = socket;
  
 +  if (self.secure) {
 +      socket.setSecure(self.credentials);
 +  }
 +
    socket.ondata = function (d, start, end) {
      parser.execute(d, start, end - start);
    };
@@@ -699,12 -693,23 +714,23 @@@ exports.cat = function (url, encoding_
    }
  
    var url = require("url").parse(url);
 -  
 +    
    var hasHost = false;
-   for (var i in headers) {
-     if (i.toLowerCase() === "host") {
-       hasHost = true;
-       break;
+   if (headers instanceof Array) {
+     for (var i = 0, l = headers.length; i < l; i++) {
+       if (headers[i][0].toLowerCase() === 'host') {
+         hasHost = true;
+         break;
+       }
+     }
+   } else if (typeof headers === "Object") {
+     var keys = Object.keys(headers);
+     for (var i = 0, l = keys.length; i < l; i++) {
+       var key = keys[i];
+       if (key.toLowerCase() == 'host') {
+         hasHost = true;
+         break;
+       }
      }
    }
    if (!hasHost) headers["Host"] = url.hostname;
diff --cc lib/net.js
index 72a93e7249d314211e152f2baf6b6ce1c9730410,72eb878c8e9471f8d0fca7b5ab2b5dac543dd21d..2ec7f2b2fb45cdbfbf277b29096545c2a255aeec
@@@ -1,7 -1,7 +1,8 @@@
  var sys = require("sys");
  var fs = require("fs");
  var events = require("events");
 +var crypto= require("crypto");
+ var dns = require('dns');
  
  var kMinPoolSpace = 128;
  var kPoolSize = 40*1024;
@@@ -41,18 -43,9 +43,17 @@@ var getsockname = binding.getsockname
  var errnoException = binding.errnoException;
  var EINPROGRESS = binding.EINPROGRESS;
  var ENOENT      = binding.ENOENT;
+ var EMFILE      = binding.EMFILE;
  var END_OF_FILE = 42;
  
 +// Do we have openssl crypto?
 +try {
 +  var SecureContext = process.binding('crypto').SecureContext;
 +  var SecureStream = process.binding('crypto').SecureStream;
 +  var have_crypto = true;
 +} catch (e) {
 +  var have_crypto = false;
 +}
  
  // IDLE TIMEOUTS
  //
@@@ -315,9 -272,8 +310,10 @@@ function initStream (self) 
                         pool,
                         pool.used,
                         pool.length - pool.used);
 +      }
      } catch (e) {
 +      if (this.forceClose) this.forceClose(e);
+       self.destroy(e);
        return;
      }
  
@@@ -533,10 -406,9 +519,11 @@@ Stream.prototype._shutdownSecure = func
  //   3. Slice out remaining
  //   4. Unshift remaining onto _writeQueue. Return false.
  Stream.prototype._writeOut = function (data, encoding) {
 -  if (!this.writable) throw new Error('Stream is not writable');
 -
 +  if (!this.writable) {
 +    if (this.secure) return false;
 +    else throw new Error('Stream is not writable');
 +  }
+   if (data.length == 0) return true;
  
    var buffer, off, len;
    var bytesWritten, charsWritten;
      }
  
      if (encoding == 'utf8' || encoding == 'utf-8') {
-       bytesWritten = pool.utf8Write(data, pool.used);
+       // default to utf8
+       bytesWritten = pool.write(data, 'utf8', pool.used);
        // XXX Hacky way to find out the number of characters written.
        // Waiting for a more optimal way: http://codereview.chromium.org/1539013
-       var _s = pool.utf8Slice(pool.used, pool.used + bytesWritten);
+       var _s = pool.toString('utf8', pool.used, pool.used + bytesWritten);
        charsWritten = _s.length;
-     } else if (encoding == 'ascii') {
-       bytesWritten = pool.asciiWrite(data, pool.used);
-       charsWritten = bytesWritten;
-       assert(charsWritten <= data.length);
      } else {
-       bytesWritten = pool.binaryWrite(data, pool.used);
+       bytesWritten = pool.write(data, encoding, pool.used);
        charsWritten = bytesWritten;
-       assert(charsWritten <= data.length);
      }
  
 -    assert(bytesWritten > 0);
 +    if (encoding) assert(bytesWritten > 0);
  
      buffer = pool;
      len = bytesWritten;
      }
    }
  
 -
 -  // Send the buffer.
 -
    try {
 -    bytesWritten = write(this.fd, buffer, off, len);
 +    if (this.secure) {
 +      if (!buffer) return false;
 +      bytesWritten = this.secureStream.writeInject(buffer, off, len);
 +      if (!securePool) allocNewSecurePool();
 +      var secureLen = this.secureStream.writeExtract(securePool, 0, securePool.length);
 +      if (secureLen==-1) {
 +        // Check our read again for secure handshake
 +        this._readWatcher.callback();
 +        secureBytesWritten = 0;
 +      } else {
 +        var secureBytesWritten = write(this.fd, securePool, 0, secureLen);
 +      }
 +      if(!this.secureEstablished && this.secureStream.isInitFinished()) {
 +        this.secureEstablished = true;
 +        if (this._events && this._events['secure']) this.emit('secure');
 +      }
 +    } else {
 +      bytesWritten = write(this.fd, buffer, off, len);
 +    }
    } catch (e) {
-     this.forceClose(e);
+     this.destroy(e);
      return false;
    }
  
@@@ -804,13 -674,9 +803,13 @@@ Stream.prototype.destroy = function (ex
  
    timeout.unenroll(this);
  
 +  if (this.secure) {
 +    this.secureStream.close();
 +  }
 +
    // FIXME Bug when this.fd == 0
    if (typeof this.fd == 'number') {
-     close(this.fd);
+     closeFD(this.fd);
      this.fd = null;
      process.nextTick(function () {
        if (exception) self.emit('error', exception);
diff --cc src/node.cc
index a300fbfbf23ce24550c8f6d970313ce32c3bf12b,28b97ce95f12bf7d10a099d73863c6e285ae5fe5..8156e5b012734f2a9be7dd7c0eadd4106a40257c
@@@ -1208,10 -1272,8 +1284,9 @@@ static Handle<Value> Binding(const Argu
        exports->Set(String::New("fs"),           String::New(native_fs));
        exports->Set(String::New("http"),         String::New(native_http));
        exports->Set(String::New("http_old"),     String::New(native_http_old));
 +      exports->Set(String::New("crypto"),       String::New(native_crypto));
        exports->Set(String::New("ini"),          String::New(native_ini));
        exports->Set(String::New("mjsunit"),      String::New(native_mjsunit));
-       exports->Set(String::New("multipart"),    String::New(native_multipart));
        exports->Set(String::New("net"),          String::New(native_net));
        exports->Set(String::New("posix"),        String::New(native_posix));
        exports->Set(String::New("querystring"),  String::New(native_querystring));
diff --cc wscript
index 92da580afb919e55e4af4837dd0371db5e61ad01,cfe78a804163b7d88d4849ca2725ae52e341adfc..416b34b1122f905dc0dbddf5c3dcd4f9beebbebd
+++ b/wscript
@@@ -436,9 -398,13 +408,13 @@@ def build(bld)
        deps/http_parser
        deps/coupling
      """
-     node.add_objects = 'ev eio evcom http_parser coupling'
+     node.includes += ' deps/c-ares/' + bld.env['DEST_OS'] + '-' + bld.env['DEST_CPU']
+     node.add_objects = 'cares ev eio evcom http_parser coupling'
      node.uselib_local = ''
-     node.uselib = 'OPENSSL GNUTLS GPGERROR UDNS V8 EXECINFO DL KVM SOCKET NSL'
 -    node.uselib = 'RT GNUTLS GPGERROR CARES V8 EXECINFO DL KVM SOCKET NSL'
++    node.uselib = 'RT OPENSSL GNUTLS GPGERROR UDNS V8 EXECINFO DL KVM SOCKET NSL'
    else:
      node.includes = """
        src/
      """
      node.add_objects = 'eio evcom http_parser coupling'
      node.uselib_local = 'eio'
-     node.uselib = 'EV OPENSSL GNUTLS GPGERROR UDNS V8 EXECINFO DL KVM SOCKET NSL'
 -    node.uselib = 'RT EV GNUTLS GPGERROR CARES V8 EXECINFO DL KVM SOCKET NSL'
++    node.uselib = 'RT EV OPENSSL GNUTLS GPGERROR UDNS V8 EXECINFO DL KVM SOCKET NSL'
  
    node.install_path = '${PREFIX}/lib'
    node.install_path = '${PREFIX}/bin'