Show warning when failing to parse attributes
This commit is contained in:
1 parent
475e3fffbe
commit
1a5fd65f4e
2 files changed
+61
-13
No files matched your search
+7
-1
@@ -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
@@ -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
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in new issue
Block a user