From 4f2cb046c734db5ed2ea338c0866a62d160d064d Mon Sep 17 00:00:00 2001 From: Astro Date: Thu, 2 Jun 2011 02:20:59 +0200 Subject: [PATCH] ostatus.webfinger: use sax instead of o3-xml --- lib/ostatus/webfinger.js | 93 +++++++++++++++++++++++++--------------- 1 file changed, 58 insertions(+), 35 deletions(-) diff --git a/lib/ostatus/webfinger.js b/lib/ostatus/webfinger.js index 3fdfed5..c79c2b4 100644 --- a/lib/ostatus/webfinger.js +++ b/lib/ostatus/webfinger.js @@ -24,7 +24,7 @@ var Sys = require('sys') ,Url = require('url') - ,Xml = require('o3-xml') + ,Sax = require('sax') ,Path = require('path') ,Mu = require('mu') ,Http = require('./http.js'); @@ -123,7 +123,7 @@ function lookup(identifier, callback) { if (err) return callback(err); _fetchUserMeta(template, identifier, function (err, meta) { if (err) return callback(err); - return callback(null, _parseUserMeta(meta)); + return callback(null, meta); }); }); } @@ -172,17 +172,33 @@ function _fetchHostMeta(host, callback) { Http.get(url, function(err, response, content) { if (err) return callback(err); if (response.statusCode == 200) { - var doc = Xml.parseFromString(content); - var nodes = doc.documentElement.selectNodes("descendant-or-self::node()[@rel='lrdd']"); - callback(null, nodes[0].getAttribute("template")); + try { + callback(null, _parseHostMeta(content)); + } catch (e) { + callback(e); + } } else { callback(new Error("Fetching host meta returned HTTP Status " + response.statusCode)); } }); } +function _parseHostMeta(content) { + var template; + var parser = Sax.parser(); + parser.onopentag = function(node) { + /* descendant-or-self::node()[@name='link' and @rel='lrdd']/@template */ + if (node.name === 'LINK' && + node.attributes.rel === 'lrdd' && + node.attributes.template) + template = node.attributes.template; + }; + parser.write(content).close(); + return template; +} + /* - * Get a user XRD from a trmplate URI and an identifier. + * Get a user LRDD from a trmplate URI and an identifier. */ function _fetchUserMeta(template, identifier, callback) { var url = template.replace("{uri}", identifier); @@ -190,9 +206,11 @@ function _fetchUserMeta(template, identifier, callback) { Http.get(url, function(err, response, content) { if (err) return callback(err); if (response.statusCode == 200) { - var links = []; - var doc = Xml.parseFromString(content); - callback(null, doc); + try { + callback(null, _parseUserMeta(content)); + } catch(e) { + callback(e); + } } else { callback(new Error("Fetching user meta returned HTTP Status " + response.statusCode)); } @@ -200,38 +218,43 @@ function _fetchUserMeta(template, identifier, callback) { } /* - * Parse a user XRD into a JSON object. + * Parse a user LRDD into a JSON object. */ -function _parseUserMeta(xml) { +function _parseUserMeta(content) { var result = { "alias": [], "links": [] }; - - // Parse the subject - var subjects = xml.documentElement.getElementsByTagName("Subject"); - if (subjects.length > 0) { - result.subject = subjects[0].nodeValue; + var parser = Sax.parser(), state; + parser.onopentag = function(node) { + switch(node.name) { + case 'SUBJECT': + state = 'subject'; + break; + case 'LINK': + result.links.push(node.attributes); + break; + case 'ALIAS': + state = 'alias'; + break; + } } - - // Parse the links - var links = xml.documentElement.getElementsByTagName("Link"); - for (i=0;i