From 95ee9ffd0e2bce7fece8dd256bde293a77abe8c7 Mon Sep 17 00:00:00 2001 From: Zaid Abdulla Date: Thu, 20 Dec 2012 15:34:24 +0300 Subject: [PATCH] Handle invalid xml chars gracefully --- acs.coffee | 6 ++++-- tr-069.coffee | 23 +++++++++++------------ 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/acs.coffee b/acs.coffee index ce3b41d..4cfca85 100644 --- a/acs.coffee +++ b/acs.coffee @@ -135,9 +135,11 @@ else process.on('uncaughtException', (err) -> # dump request/response logs and stack trace util.log("Unexpected error occured. Writing log to debug/#{currentClientIP}.log.") - memcached.get("debug-#{currentClientIP}", (er, l) -> + memcached.get("debug-#{currentClientIP}", (err, l) -> + util.error(err) if err fs = require 'fs' fs.writeFile("debug/#{currentClientIP}.log", l + "\n\n" + err.stack, (err) -> + util.error(err) if err process.exit(1) ) ) @@ -181,7 +183,7 @@ else ) resParams = {} - reqParams = tr069.request(request.headers, request.getBody()) + reqParams = tr069.request(request) if reqParams.inform resParams.inform = true diff --git a/tr-069.coffee b/tr-069.coffee index cf129d4..d19c994 100644 --- a/tr-069.coffee +++ b/tr-069.coffee @@ -117,16 +117,19 @@ setParameterValuesResponse = (xml) -> return undefined -exports.request = (headers, data) -> - #console.log '<<< REQUEST' - #console.dir [headers, data] - #console.log data - +exports.request = (request) -> req = {cookies: {}} - req.cookies = cookiesToObj(headers.cookie) if headers.cookie + req.cookies = cookiesToObj(request.headers.cookie) if request.headers.cookie + + data = request.getBody() + + if +request.headers['Content-Length'] > 0 || data.length > 0 + try + xml = libxmljs.parseXml data + catch err + # some devices send invalid utf8 characters + xml = libxmljs.parseXml request.getBody('binary') - if +headers['Content-Length'] > 0 || data.length > 0 - xml = libxmljs.parseXml data req.sessionId = sessionId xml req.inform = true if xml.get('//soap-env:Envelope/soap-env:Body/cwmp:Inform', NAMESPACES) req.informParameterValues = informParameterValues xml @@ -195,8 +198,4 @@ exports.response = (sessionId, params, cookies = null) -> data = xml.toString() headers['Content-Length'] = data.length - #console.log '>>> RESPONSE' - #console.dir headers - #console.log data - return {code: 200, headers: headers, data: data}