Skip to content

Commit fe9a1dd

Browse files
authored
fix(server): Add error handler for webserver socket. (#3300)
Some times connection arrive, are given 404 responses, then disconnect, resulting in ECONNRESET errors on the socket. After we began monitoring UncaughtExceptions, these errors show up. Suppress them with a handler that ignores errors.
1 parent 13ed695 commit fe9a1dd

File tree

2 files changed

+23
-6
lines changed

2 files changed

+23
-6
lines changed

lib/server.js

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,13 @@ class Server extends KarmaEventEmitter {
123123
BundleUtils.bundleResourceIfNotExist('context/main.js', 'static/context.js')
124124
])
125125
this._boundServer = await NetUtils.bindAvailablePort(config.port, config.listenAddress)
126+
this._boundServer.on('connection', (socket) => {
127+
// Attach an error handler to avoid UncaughtException errors.
128+
socket.on('error', (err) => {
129+
// Errors on this socket are retried, ignore them
130+
this.log.debug('Ignoring error on webserver connection: ' + err)
131+
})
132+
})
126133
config.port = this._boundServer.address().port
127134
this._injector.invoke(this._start, this)
128135
} catch (err) {
@@ -228,6 +235,10 @@ class Server extends KarmaEventEmitter {
228235

229236
socket.on('complete', (data, ack) => ack())
230237

238+
socket.on('error', (err) => {
239+
this.log.debug('karma server socket error: ' + err)
240+
})
241+
231242
socket.on('register', (info) => {
232243
let newBrowser = info.id ? (capturedBrowsers.getById(info.id) || singleRunBrowsers.getById(info.id)) : null
233244

@@ -372,14 +383,19 @@ class Server extends KarmaEventEmitter {
372383
processWrapper.on('SIGINT', () => disconnectBrowsers(process.exitCode))
373384
processWrapper.on('SIGTERM', disconnectBrowsers)
374385

375-
processWrapper.on('uncaughtException', (error) => {
376-
this.log.error(error)
386+
const reportError = (error) => {
387+
process.emit('infrastructure_error', error)
377388
disconnectBrowsers(1)
378-
})
389+
}
379390

380391
processWrapper.on('unhandledRejection', (error) => {
381-
this.log.error(error)
382-
disconnectBrowsers(1)
392+
this.log.error('UnhandledRejection')
393+
reportError(error)
394+
})
395+
396+
processWrapper.on('uncaughtException', (error) => {
397+
this.log.error('UncaughtException')
398+
reportError(error)
383399
})
384400
}
385401

test/unit/server.spec.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ describe('server', () => {
9191
}
9292

9393
mockBoundServer = {
94-
on: sinon.spy((event, callback) => callback && callback()),
94+
on: sinon.spy((event, callback) => callback && callback(mockServerSocket)),
9595
listen: sinon.spy((port, listenAddress, callback) => callback && callback()),
9696
close: sinon.spy((callback) => callback && callback()),
9797
address: () => { return { port: 9876 } }
@@ -148,6 +148,7 @@ describe('server', () => {
148148
server.start().then(() => {
149149
expect(NetUtils.bindAvailablePort).to.have.been.calledWith(9876, '127.0.0.1')
150150
expect(mockBoundServer.address).to.have.been.called
151+
expect(typeof mockSocketEventListeners.get('error')).to.be.equal('function')
151152
done()
152153
})
153154
})

0 commit comments

Comments
 (0)