diff --git a/README.md b/README.md index 50039f9..a69d141 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ MIT license. See LICENSE for full details. * All spec methods (open, send, abort, getRequestHeader, getAllRequestHeaders, event methods) * Requests to all domains +* XML parsing ## Known Issues / Missing Features ## @@ -52,4 +53,3 @@ page](https://github.com/driverdan/node-XMLHttpRequest/issues). * Synchronous requests freeze node while waiting for response (But that's what you want, right? Stick with async!). * Some events are missing, such as abort * Cookies aren't persisted between requests -* Missing XML support diff --git a/lib/XMLHttpRequest.js b/lib/XMLHttpRequest.js index 4893913..1800b03 100644 --- a/lib/XMLHttpRequest.js +++ b/lib/XMLHttpRequest.js @@ -8,6 +8,8 @@ * * @author Dan DeFelippi * @contributor David Ellis + * @contributor Guy Baconniere + * @contributor Arnaud Spicht * @license MIT */ @@ -442,6 +444,7 @@ exports.XMLHttpRequest = function() { }); response.on("end", function() { + self.responseXML = html2dom(self.responseText); if (sendFlag) { // Discard the end event if the connection has been aborted setState(self.DONE); @@ -478,15 +481,27 @@ exports.XMLHttpRequest = function() { // The async request the other Node process executes var execString = "var http = require('http'), https = require('https'), fs = require('fs');" + "var doRequest = http" + (ssl ? "s" : "") + ".request;" + + "var html2dom = function(html) {" + + "var result='';" + + "try {" + + "var DOMParser = require('xmldom').DOMParser;" + + "var document = new DOMParser().parseFromString(html);" + + "result = document;" + + "} catch(err) {" + + "}" + + "return result;" + + "};" + "var options = " + JSON.stringify(options) + ";" + "var responseText = '';" + + "var responseXML = '';" + "var req = doRequest(options, function(response) {" + "response.setEncoding('utf8');" + "response.on('data', function(chunk) {" + " responseText += chunk;" + "});" + "response.on('end', function() {" - + "fs.writeFileSync('" + contentFile + "', JSON.stringify({err: null, data: {statusCode: response.statusCode, headers: response.headers, text: responseText}}), 'utf8');" + + "responseXML = html2dom(responseText);" + + "fs.writeFileSync('" + contentFile + "', JSON.stringify({err: null, data: {statusCode: response.statusCode, headers: response.headers, text: responseText, xml: responseXML}}), 'utf8');" + "fs.unlinkSync('" + syncFile + "');" + "});" + "response.on('error', function(error) {" @@ -516,6 +531,7 @@ exports.XMLHttpRequest = function() { response = resp.data; self.status = resp.data.statusCode; self.responseText = resp.data.text; + self.responseXML = resp.data.xml; setState(self.DONE); } } @@ -528,6 +544,7 @@ exports.XMLHttpRequest = function() { this.status = 0; this.statusText = error; this.responseText = error.stack; + this.responseXML = error.stack; errorFlag = true; setState(this.DONE); this.dispatchEvent('error'); @@ -617,4 +634,22 @@ exports.XMLHttpRequest = function() { } } }; + + /** + * Parse HTML string and return a DOM + * + * @param string HTML to be parsed. + * @return string DOM representation. + */ + var html2dom = function(html) { + var result = ""; + try { + var DOMParser = require('xmldom').DOMParser; + var document = new DOMParser().parseFromString(html); + result = document; + } catch(err) { + //throw "HTML_PARSE_ERR: unable to parse HTML : " + err; + } + return result; + }; }; diff --git a/package.json b/package.json index c14434d..0cefcc9 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,9 @@ "engines": { "node": ">=0.4.0" }, + "dependencies": { + "xmldom": ">= 0.1.19" + }, "directories": { "lib": "./lib", "example": "./example"