From 985e01a8f9f69829746eec02b48341d7ae52a708 Mon Sep 17 00:00:00 2001 From: Michael Demmer Date: Mon, 13 Apr 2015 12:02:29 -0400 Subject: [PATCH] catch processing errors and emit them as events --- _test_data/garbage | 1 + _test_data/short-query | Bin 0 -> 19 bytes server.js | 25 +++++++++------ test/server.js | 69 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 86 insertions(+), 9 deletions(-) create mode 100644 _test_data/garbage create mode 100644 _test_data/short-query diff --git a/_test_data/garbage b/_test_data/garbage new file mode 100644 index 0000000..7621a3e --- /dev/null +++ b/_test_data/garbage @@ -0,0 +1 @@ +this is some trash diff --git a/_test_data/short-query b/_test_data/short-query new file mode 100644 index 0000000000000000000000000000000000000000..21b38e5a83c8cefa9fd4cf54415e2ffc5fa022fb GIT binary patch literal 19 WcmdnAlaYY|h(LfnzbG{`hYJ8BAOo5J literal 0 HcmV?d00001 diff --git a/server.js b/server.js index 25e095d..0580ddf 100644 --- a/server.js +++ b/server.js @@ -142,11 +142,15 @@ Server.prototype.on_tcp_connection = function(connection) { if(length !== null && bytes_received == 2 + length) { // All of the data (plus the 2-byte length prefix) is received. - var data = Buffer.concat(bufs) - , req = new Request(data, connection) - , res = new Response(data, connection) - - self.emit('request', req, res) + try { + var data = Buffer.concat(bufs) + , req = new Request(data, connection) + , res = new Response(data, connection) + + self.emit('request', req, res) + } catch(err) { + self.emit('error', 'Error processing request', err, connection) + } } }) } @@ -164,13 +168,16 @@ Server.prototype.on_udp = function(data, rinfo) { , 'end' : function() {} } - var req = new Request(data, connection) - , res = new Response(data, connection) + try { + var req = new Request(data, connection) + , res = new Response(data, connection) - self.emit('request', req, res) + self.emit('request', req, res) + } catch (err) { + self.emit('error', 'Error processing request', err, connection) + } } - util.inherits(Request, Message) function Request (data, connection) { var self = this diff --git a/test/server.js b/test/server.js index 40e5414..0389923 100644 --- a/test/server.js +++ b/test/server.js @@ -122,3 +122,72 @@ test('Network queries', function(t) { }) } }) + +test('Invalid queries', function(t) { + var reqs = { 'short-query' : { message:'Error processing request', error: 'RangeError: Trying to access beyond buffer length' } + , 'garbage' : { message:'Error processing request', error: 'RangeError: Trying to access beyond buffer length' } + } + + var i = 0 + var server = API.createServer(on_req) + server.on('error', on_error) + server.listen(PORT, '127.0.0.1') + server.on('listening', send_requests) + + function on_error(message, err, info) { + var req; + t.type(message, 'string', 'Got error message') + t.type(err, 'Error', 'Got Error object') + t.type(info, 'Object', 'Got connection info object') + t.type(info.type, 'string', 'Found connection type') + t.type(info.remoteAddress, 'string', 'Found connection remote address') + t.type(info.remotePort, 'number', 'Found connection remote port') + + Object.keys(reqs).forEach(function(name) { + if (/tcp/.test(info.type) && info.remotePort == reqs[name].tcpAddr.port) { + req = reqs[name]; + } + + if (/udp/.test(info.type) && info.remotePort === reqs[name].udpAddr.port) { + req = reqs[name]; + } + }) + + t.ok(req != undefined, 'Found matching request') + t.equal(message, req.message) + t.equal(err.toString(), req.error) + + i += 1 + if(i == Object.keys(reqs).length * 2) { + server.close() + t.end() + } + } + + function on_req(req, res) { + t.notOk(true, 'Request handler should not be called'); + } + + function send_requests() { + Object.keys(reqs).forEach(function(name) { + var data = fs.readFileSync(__dirname + '/../_test_data/' + name) + + var udp = dgram.createSocket('udp4') + udp.bind(function() { + reqs[name].udpAddr = udp.address(); + + udp.send(data, 0, data.length, PORT, '127.0.0.1', function() { + udp.close() + }) + + }); + + var tcp = net.connect({'port':PORT}, function(er) { + reqs[name].tcpAddr = tcp.address(); + tcp.write(new Buffer([data.length >> 8, data.length & 0xff])) + tcp.write(data) + tcp.end() + }) + }) + } +})