From 103e711eac807ee5572d88a07749d945f24cf153 Mon Sep 17 00:00:00 2001
From: Wes <wes@wesleytodd.com>
Date: Mon, 20 Feb 2017 17:36:39 -0600
Subject: [PATCH] call callback once on listen error

---
 lib/application.js | 14 ++++++++++----
 package.json       |  1 +
 test/app.listen.js | 14 ++++++++++++++
 3 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/lib/application.js b/lib/application.js
index f07cc12a41..43c9f34b06 100644
--- a/lib/application.js
+++ b/lib/application.js
@@ -24,6 +24,7 @@ var compileTrust = require('./utils').compileTrust;
 var flatten = require('array-flatten').flatten
 var merge = require('utils-merge');
 var resolve = require('path').resolve;
+var once = require('once')
 var Router = require('router');
 var setPrototypeOf = require('setprototypeof')
 
@@ -605,10 +606,15 @@ app.render = function render(name, options, callback) {
  * @public
  */
 
-app.listen = function listen() {
-  var server = http.createServer(this);
-  return server.listen.apply(server, arguments);
-};
+app.listen = function listen () {
+  var server = http.createServer(this)
+  var args = Array.prototype.slice.call(arguments)
+  if (typeof args[args.length - 1] === 'function') {
+    var done = args[args.length - 1] = once(args[args.length - 1])
+    server.once('error', done)
+  }
+  return server.listen.apply(server, args)
+}
 
 /**
  * Log error using console.error.
diff --git a/package.json b/package.json
index 5a8f978e1c..d3e2f0a190 100644
--- a/package.json
+++ b/package.json
@@ -47,6 +47,7 @@
     "methods": "~1.1.2",
     "mime-types": "~2.1.34",
     "on-finished": "2.4.1",
+    "once": "1.4.0",
     "parseurl": "~1.3.3",
     "path-is-absolute": "1.0.1",
     "proxy-addr": "~2.0.7",
diff --git a/test/app.listen.js b/test/app.listen.js
index 5b150063b9..7e7e731a3b 100644
--- a/test/app.listen.js
+++ b/test/app.listen.js
@@ -1,6 +1,7 @@
 'use strict'
 
 var express = require('../')
+var assert = require('assert')
 
 describe('app.listen()', function(){
   it('should wrap with an HTTP server', function(done){
@@ -10,4 +11,17 @@ describe('app.listen()', function(){
       server.close(done)
     });
   })
+  it('should callback on HTTP server errors', function (done) {
+    var app1 = express()
+    var app2 = express()
+
+    var server1 = app1.listen(0, function (err) {
+      assert(!err)
+      app2.listen(server1.address().port, function (err) {
+        assert(err.code === 'EADDRINUSE')
+        server1.close()
+        done()
+      })
+    })
+  })
 })