tjfontaine / node-dns

Replacement dns module in pure javascript for node.js
MIT License
585 stars 153 forks source link

EADDRNOTAVAIL when creating an https server based on domain resolved by node-dns #54

Open apond opened 10 years ago

apond commented 10 years ago

I am on Mac OS 10.7.5. I have added 127.0.0.1 to my DNS Server List. When I create a dns server using node-dns and then create an https server on a domain resolved by the dns server, I get the following error: Error: listen EADDRNOTAVAIL at errnoException (net.js:900:11) at Server._listen2 (net.js:1019:19) at listen (net.js:1060:10) at net.js:1134:9 at asyncCallback (dns.js:68:16) at Object.onanswer as oncomplete

My code is as follows: var fs = require('fs'); var path = require('path'); var dns = require('native-dns'); var https = require('https'); var express = require('express');

String.prototype.endsWith = function(s) {
  return this.length >= s.length && this.substr(this.length - s.length) == s;
};

var startDns = function(sample_port, callback) {
  var server = dns.createServer();

  server.on('request', function(request, response) {
    var found = false;

    for (var q = 0; q < request.question.length; q++)
    {
      var name = request.question[q].name;
      console.log('dns request: ' + name);
      if (name.endsWith("sample.com"))
      {
        response.answer.push(dns.A({
          name:name,
          address:'127.0.0.2',
          port:sample_port,
          ttl:60
        }));
        found = true;
      }
    }
    if (found)
    {
      console.log('DNS response: ' + JSON.stringify(response.answer));
      response.send();
    }
  });

  server.on('error', function(err, buff, req, res) {
    console.log(JSON.stringify(err));
  });

  server.on('listening', function() {
    console.log("DNS server started on port 53");
    if (callback)
    {
      callback();
    }
  });

   server.serve(53);
   return server;
};

var startHttps = function(serverPort) {
  // Set up secure server
  var options = {
    key:fs.readFileSync(path.join(__dirname, 'certificates/sample.com-key.pem')),
    cert:fs.readFileSync(path.join(__dirname, 'certificates/sample.com-cert.pem'))
  };

  var app = express();
  var server = https.createServer(options, app);
  app.get('*', function(req, res, next) {
    res.send('Hello from ' + req.headers.host);
  });
  server.listen(serverPort, 'test.sample.com');
  console.log('https server started on port ' + serverPort);
  return server;
};

var server_port = parseInt(process.argv[2] || 8082);
var httpsServer;

var dnsServer = startDns(server_port, function() {
  httpsServer = startHttps(server_port)
});

process.on('SIGINT', function() {
  console.log("shutting down");
  if (httpsServer)
  {
    httpsServer.close();
  }
  if (dnsServer)
  {
    dnsServer.close();
  }
});

The full output looks like this: DNS server started on port 53 https server started on port 8082 dns request: test.sample.com DNS response: [{"type":1,"class":1,"name":"test.sample.com","address":"127.0.0.2","port":8082,"ttl":60}] dns request: test.sample.com DNS response: [{"type":1,"class":1,"name":"test.sample.com","address":"127.0.0.2","port":8082,"ttl":60}]

events.js:72
         throw er; // Unhandled 'error' event
                ^
Error: listen EADDRNOTAVAIL
    at errnoException (net.js:900:11)
    at Server._listen2 (net.js:1019:19)
    at listen (net.js:1060:10)
    at net.js:1134:9
    at asyncCallback (dns.js:68:16)
    at Object.onanswer [as oncomplete] (dns.js:121:9)