From bba4cc3b64aca3a5da5cda55b96960c5ce9d3d62 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Tue, 26 May 2015 16:02:53 +0200 Subject: [PATCH 1/3] Deserializer using node-expat. --- lib/deserializer.js | 18 +++++++----- package.json | 72 ++++++++++++++++++++++++--------------------- 2 files changed, 49 insertions(+), 41 deletions(-) diff --git a/lib/deserializer.js b/lib/deserializer.js index 819356a..8abdb3c 100644 --- a/lib/deserializer.js +++ b/lib/deserializer.js @@ -1,4 +1,4 @@ -var sax = require('sax') +var expat = require('node-expat') , dateFormatter = require('./date_formatter') var Deserializer = function(encoding) { @@ -13,9 +13,9 @@ var Deserializer = function(encoding) { this.callback = null this.error = null - this.parser = sax.createStream() - this.parser.on('opentag', this.onOpentag.bind(this)) - this.parser.on('closetag', this.onClosetag.bind(this)) + this.parser = new expat.Parser(this.encoding) + this.parser.on('startElement', this.onOpentag.bind(this)) + this.parser.on('endElement', this.onClosetag.bind(this)) this.parser.on('text', this.onText.bind(this)) this.parser.on('cdata', this.onCDATA.bind(this)) this.parser.on('end', this.onDone.bind(this)) @@ -123,12 +123,14 @@ Deserializer.prototype.push = function(value) { // SAX Handlers //============================================================================== -Deserializer.prototype.onOpentag = function(node) { - if (node.name === 'ARRAY' || node.name === 'STRUCT') { +Deserializer.prototype.onOpentag = function(name) { + name = name.toUpperCase() + + if (name === 'ARRAY' || name === 'STRUCT') { this.marks.push(this.stack.length) } this.data = [] - this.value = (node.name === 'VALUE') + this.value = (name === 'VALUE') } Deserializer.prototype.onText = function(text) { @@ -142,7 +144,7 @@ Deserializer.prototype.onCDATA = function(cdata) { Deserializer.prototype.onClosetag = function(el) { var data = this.data.join('') try { - switch(el) { + switch(el.toUpperCase()) { case 'BOOLEAN': this.endBoolean(data) break diff --git a/package.json b/package.json index bea1d64..cebfc87 100644 --- a/package.json +++ b/package.json @@ -1,35 +1,41 @@ -{ "name" : "xmlrpc" -, "description" : "A pure JavaScript XML-RPC client and server." -, "keywords" : [ "xml-rpc", "xmlrpc", "xml", "rpc" ] -, "version" : "1.3.1" -, "preferGlobal" : false -, "homepage" : "https://github.com/baalexander/node-xmlrpc" -, "author" : "Brandon Alexander (https://github.com/baalexander)" -, "repository" : { - "type" : "git" - , "url" : "git://github.com/baalexander/node-xmlrpc.git" - } -, "bugs" : { - "url" : "https://github.com/baalexander/node-xmlrpc/issues" - } -, "directories" : { - "lib" : "./lib" - } -, "main" : "./lib/xmlrpc.js" -, "dependencies" : { - "sax" : "0.6.x" - , "xmlbuilder" : "2.6.x" - } -, "devDependencies" : { - "vows" : "0.7.x" - } -, "scripts" : { - "test" : "vows 'test/*.js'" - } -, "engines" : { - "node" : ">=0.8", - "npm" : ">=1.0.0" - } -, "license" : "MIT" +{ + "name": "xmlrpc", + "description": "A pure JavaScript XML-RPC client and server.", + "keywords": [ + "xml-rpc", + "xmlrpc", + "xml", + "rpc" + ], + "version": "1.3.1", + "preferGlobal": false, + "homepage": "https://github.com/baalexander/node-xmlrpc", + "author": "Brandon Alexander (https://github.com/baalexander)", + "repository": { + "type": "git", + "url": "git://github.com/baalexander/node-xmlrpc.git" + }, + "bugs": { + "url": "https://github.com/baalexander/node-xmlrpc/issues" + }, + "directories": { + "lib": "./lib" + }, + "main": "./lib/xmlrpc.js", + "dependencies": { + "node-expat": "^2.3.8", + "xmlbuilder": "2.6.x" + }, + "devDependencies": { + "vows": "0.7.x" + }, + "scripts": { + "test": "make test" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.0.0" + }, + "license": "MIT" } From e3f9f4b35270e54f0eafad56c1410ad8df322cd8 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Fri, 19 Jun 2015 09:42:11 +0200 Subject: [PATCH 2/3] Ugly hack because expat requires `utf-8` instead of `utf8`. --- lib/deserializer.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/deserializer.js b/lib/deserializer.js index 8abdb3c..b463123 100644 --- a/lib/deserializer.js +++ b/lib/deserializer.js @@ -13,7 +13,11 @@ var Deserializer = function(encoding) { this.callback = null this.error = null - this.parser = new expat.Parser(this.encoding) + this.parser = new expat.Parser( + this.encoding === 'utf8' ? + 'utf-8' : + this.encoding + ) this.parser.on('startElement', this.onOpentag.bind(this)) this.parser.on('endElement', this.onClosetag.bind(this)) this.parser.on('text', this.onText.bind(this)) From 4a3a4a4f07d4d37c34d27d4c7ad5d8f396a5bfbc Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Fri, 19 Jun 2015 10:41:17 +0200 Subject: [PATCH 3/3] Do not use caret range for expat. Caret ranges are not supported by the npm provided with Node 0.8. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cebfc87..d3588a3 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ }, "main": "./lib/xmlrpc.js", "dependencies": { - "node-expat": "^2.3.8", + "node-expat": ">=2.3.8 <3.0.0", "xmlbuilder": "2.6.x" }, "devDependencies": {