Show warning when failing to parse attributes

This commit is contained in:
Zaid Abdulla committed 2017-03-18 22:20:17 -07:00
1 parent 475e3fffbe
commit 1a5fd65f4e
2 files changed
+61 -13

No files matched your search

+7 -1
View File
@@ -603,9 +603,10 @@ listener = (httpRequest, httpResponse) ->
stream.on('end', () -> stream.on('end', () ->
rpc = null rpc = null
parseWarnings = []
getSession(httpRequest, f = (err, sessionContext) -> getSession(httpRequest, f = (err, sessionContext) ->
return throwError(err, httpResponse) if err return throwError(err, httpResponse) if err
rpc ?= soap.request(httpRequest, sessionContext?.cwmpVersion) rpc ?= soap.request(httpRequest, sessionContext?.cwmpVersion, parseWarnings)
if not sessionContext? if not sessionContext?
if rpc.cpeRequest?.name isnt 'Inform' if rpc.cpeRequest?.name isnt 'Inform'
httpResponse.writeHead(400) httpResponse.writeHead(400)
@@ -645,6 +646,11 @@ listener = (httpRequest, httpResponse) ->
sessionContext.httpRequest = httpRequest sessionContext.httpRequest = httpRequest
sessionContext.httpResponse = httpResponse sessionContext.httpResponse = httpResponse
for w in parseWarnings
w.sessionContext = sessionContext
w.rpc = rpc;
logger.accessWarn(w)
if config.get('DEBUG', sessionContext.deviceId) if config.get('DEBUG', sessionContext.deviceId)
dump = "# REQUEST #{new Date(Date.now())}\n" + JSON.stringify(httpRequest.headers) + "\n#{httpRequest.getBody()}\n\n" dump = "# REQUEST #{new Date(Date.now())}\n" + JSON.stringify(httpRequest.headers) + "\n#{httpRequest.getBody()}\n\n"
require('fs').appendFile("./debug/#{sessionContext.deviceId}.dump", dump, (err) -> require('fs').appendFile("./debug/#{sessionContext.deviceId}.dump", dump, (err) ->
+54 -12
View File
@@ -85,6 +85,8 @@ if (XML_IGNORE_NAMESPACE) {
}; };
} }
let warnings;
function parseBool(v) { function parseBool(v) {
v = "" + v; v = "" + v;
@@ -93,7 +95,7 @@ function parseBool(v) {
else if (v === "false" || v === "FALSE" || v === "False" || v === "0") else if (v === "false" || v === "FALSE" || v === "False" || v === "0")
return false; return false;
else else
throw new Error("Invalid boolean value"); return null;
} }
@@ -103,9 +105,21 @@ function event(xml) {
function parameterInfoList(xml) { function parameterInfoList(xml) {
return xml.find("ParameterInfoStruct").map( return xml.find("ParameterInfoStruct").map(function(e) {
e => [e.get("Name").text(), parseBool(e.get("Writable").text())] let param = e.get("Name").text();
); let value = e.get("Writable").text();
let parsed = parseBool(value);
if (parsed === null) {
warnings.push({
message: "Invalid writable attribute",
parameter: param
});
parsed = false;
}
return [param, parsed];
});
} }
@@ -113,15 +127,41 @@ function parameterValueList(xml) {
return xml.find("ParameterValueStruct").map(function(e) { return xml.find("ParameterValueStruct").map(function(e) {
const valueElement = e.get("Value"); const valueElement = e.get("Value");
const valueType = valueElement.attr("type").value(); const valueType = valueElement.attr("type").value();
let param = e.get("Name").text();
let value = valueElement.text(); let value = valueElement.text();
if (valueType === "xsd:boolean") let parsed = value;
value = parseBool(value); if (valueType === "xsd:boolean") {
else if (valueType === "xsd:int" || valueType === "xsd:unsignedInt") parsed = parseBool(value);
value = parseInt(value); if (parsed === null) {
else if (valueType === "xsd:dateTime") warnings.push({
value = Date.parse(value); message: "Invalid value attribute",
parameter: param
});
parsed = value;
}
}
else if (valueType === "xsd:int" || valueType === "xsd:unsignedInt") {
parsed = parseInt(value);
if (isNaN(parsed)) {
warnings.push({
message: "Invalid value attribute",
parameter: param
});
parsed = value;
}
}
else if (valueType === "xsd:dateTime") {
parsed = Date.parse(value);
if (isNaN(parsed)) {
warnings.push({
message: "Invalid value attribute",
parameter: param
});
parsed = value;
}
}
return [e.get("Name").text(), value, valueType]; return [param, value, valueType];
}); });
} }
@@ -367,7 +407,9 @@ function fault(xml, cwmpVersion) {
} }
function request(httpRequest, cwmpVersion) { function request(httpRequest, cwmpVersion, warn) {
warnings = warn;
const rpc = { const rpc = {
cwmpVersion: cwmpVersion cwmpVersion: cwmpVersion
}; };