diff options
| author | Michael Williamson <mike@zwobble.org> | 2013-04-11 19:41:40 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2013-04-11 19:41:40 +0100 |
| commit | 9fdb851306e79d5ebe72c0e3e81a9b19ce0d79dc (patch) | |
| tree | 182e6cac89fa3366635b675685ed3801d7d6578c | |
| parent | d95bd3a2f9aed82645235e330266052296a281c5 (diff) | |
Handle errors in XML parsing
| -rw-r--r-- | lib/xmlreader.js | 23 | ||||
| -rw-r--r-- | tests/xmlreader.tests.js | 9 |
2 files changed, 23 insertions, 9 deletions
diff --git a/lib/xmlreader.js b/lib/xmlreader.js index ef16f7b..3fde762 100644 --- a/lib/xmlreader.js +++ b/lib/xmlreader.js @@ -8,14 +8,9 @@ exports.Element = Element; function read(xmlString, namespaceMap) { namespaceMap = namespaceMap || {}; + var finished = false; var parser = sax.parser(true, {xmlns: true, position: false}); - //~ parser.onerror = function(error) { - //~ Q.fcall(function () { - //~ throw new Error("Can't do it"); - //~ }); - //~ }; - var rootElement = {children: []}; var currentElement = rootElement; var stack = []; @@ -62,9 +57,19 @@ function read(xmlString, namespaceMap) { }; parser.onend = function() { - deferred.resolve({ - root: rootElement.children[0] - }); + if (!finished) { + finished = true; + deferred.resolve({ + root: rootElement.children[0] + }); + } + }; + + parser.onerror = function(error) { + if (!finished) { + finished = true; + deferred.reject(error); + } }; parser.write(xmlString).close(); diff --git a/tests/xmlreader.tests.js b/tests/xmlreader.tests.js index 2eb95c8..aec0229 100644 --- a/tests/xmlreader.tests.js +++ b/tests/xmlreader.tests.js @@ -76,4 +76,13 @@ describe('xmlreader.read', function() { assert.deepEqual("body", result.root.name); }); }) + + test('error if XML is badly formed', function() { + return xmlreader.read("<bo").then(function(result) { + throw new Error("Expected failure"); + }, function(error) { + assert.ok(error); + return 1; + }); + }) }); |
