From fefe6fec82be2a1a9d4d0f878b6d5d58a7956027 Mon Sep 17 00:00:00 2001 From: William Narmontas Date: Wed, 10 May 2017 15:12:34 +0800 Subject: [PATCH 1/2] Processing model requires a reconnection due to a 500, 502, 503 or 504 error code. https://www.w3.org/TR/2015/REC-eventsource-20150203/#processing-model --- test/eventsource_test.js | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/test/eventsource_test.js b/test/eventsource_test.js index 2c25a4d..a19b5f7 100644 --- a/test/eventsource_test.js +++ b/test/eventsource_test.js @@ -601,6 +601,37 @@ describe('Reconnection', function () { }) }) + it('is attempted when the server responds with a 500', function (done) { + createServer(function (err, server) { + if (err) return done(err) + + server.on('request', function (req, res) { + res.writeHead(500) + res.end(); + }) + + var es = new EventSource(server.url); + es.reconnectInterval = 0; + + es.onerror = function () { + server.close(function (err) { + if (err) return done(err) + + var port = u.parse(es.url).port + configureServer(http.createServer(), 'http', port, function (err, server2) { + if (err) return done(err) + + server2.on('request', writeEvents(['data: hello\n\n'])) + es.onmessage = function (m) { + assert.equal('hello', m.data) + server2.close(done) + } + }) + }) + } + }) + }) + it('is stopped when server goes down and eventsource is being closed', function (done) { createServer(function (err, server) { if (err) return done(err) @@ -642,7 +673,7 @@ describe('Reconnection', function () { }) }) - it('is not attempted when server responds with non-200', function (done) { + it('is not attempted when server responds with non-200 and non-500', function (done) { createServer(function (err, server) { if (err) return done(err) From 1328a0601bcd2240fa853d8c12e26ffc41733490 Mon Sep 17 00:00:00 2001 From: William Narmontas Date: Wed, 10 May 2017 15:25:27 +0800 Subject: [PATCH 2/2] Make the test pass. Processing model requires a reconnection due to a 500, 502, 503 or 504 error code. https://www.w3.org/TR/2015/REC-eventsource-20150203/#processing-model --- lib/eventsource.js | 7 +++++++ test/eventsource_test.js | 10 +++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/eventsource.js b/lib/eventsource.js index 082656f..fd1d48c 100644 --- a/lib/eventsource.js +++ b/lib/eventsource.js @@ -110,6 +110,13 @@ function EventSource (url, eventSourceInitDict) { } req = (isSecure ? https : http).request(options, function (res) { + // Handle HTTP errors + if (res.statusCode === 500 || res.statusCode === 502 || res.statusCode === 503 || res.statusCode === 504) { + _emit('error', new Event('error', {status: res.statusCode})) + onConnectionClosed() + return + } + // Handle HTTP redirects if (res.statusCode === 301 || res.statusCode === 307) { if (!res.headers.location) { diff --git a/test/eventsource_test.js b/test/eventsource_test.js index a19b5f7..ecc1233 100644 --- a/test/eventsource_test.js +++ b/test/eventsource_test.js @@ -607,13 +607,17 @@ describe('Reconnection', function () { server.on('request', function (req, res) { res.writeHead(500) - res.end(); + res.end() }) - var es = new EventSource(server.url); - es.reconnectInterval = 0; + var es = new EventSource(server.url) + es.reconnectInterval = 0 + + var errored = false es.onerror = function () { + if (errored) return + errored = true server.close(function (err) { if (err) return done(err)