diff --git a/index.js b/index.js index 93768a8..32028b7 100644 --- a/index.js +++ b/index.js @@ -61,14 +61,25 @@ function json(url, obj, headers, fn){ if (3 == arguments.length) fn = headers, headers = {}; var req = new XMLHttpRequest; - req.onerror = fn; - req.onreadystatechange = done; + req.onerror = error; + req.onload = done; req.open('POST', url, true); for (var k in headers) req.setRequestHeader(k, headers[k]); req.send(JSON.stringify(obj)); function done(){ - if (4 == req.readyState) return fn(null, req); + // sometimes IE returns 1223 when it should be 204 + // see http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request + if (/^(20\d|1223)$/.test(req.status)) { + return fn(null, req) + } + fn(new Error("Request wasn't successful"), req); + } + + function error(event){ + var err = new Error("A network error ocurred"); + err.event = event; + fn(err); } } diff --git a/test/test.js b/test/test.js index 6c7fecc..7d10f3e 100644 --- a/test/test.js +++ b/test/test.js @@ -20,6 +20,29 @@ describe('send-json', function(){ done(); }); }) + + it('should invoke the callback with an error when connection is refused', function(done){ + if ('xhr' != send.type) return done(); + var url = protocol() + '//localhost:4567/data'; + var headers = { 'Content-Type': 'application/json' }; + send.json(url, [1, 2, 3], headers, function(err, req){ + assert(err); + assert(typeof err.event === "object"); + done(); + }); + }) + + it('should invoke the callback with an error when the request does not succeed', function(done){ + if ('xhr' != send.type) return done(); + var url = protocol() + '//localhost:3001/not-found'; + var headers = { 'Content-Type': 'application/json' }; + send.json(url, [1, 2, 3], headers, function(err, req){ + assert(err); + assert(typeof req === "object"); + assert(req.status === 404); + done(); + }); + }) }) describe('#base64', function(){