From c5efaacb795f5c51196d8e6e02f9c01f6cc4bdf5 Mon Sep 17 00:00:00 2001 From: Zaid Abdulla Date: Mon, 3 Dec 2018 22:58:42 -0800 Subject: [PATCH] Recover from invalid parameter name faults A fault can happen if a parameter no longer exists. This code attempts to recover from the fault by refreshing the relavent parameters. --- lib/session.js | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/lib/session.js b/lib/session.js index b96a5ed..216bf7e 100644 --- a/lib/session.js +++ b/lib/session.js @@ -2552,8 +2552,39 @@ function rpcResponse(sessionContext, id, rpcRes, callback) { } function rpcFault(sessionContext, id, faultResponse, callback) { - // TODO Consider handling invalid parameter faults by automatically refreshing - // relevant data model portions + const rpcReq = sessionContext.rpcRequest; + delete sessionContext.syncState; + delete sessionContext.rpcRequest; + + // Recover from invalid parameter name faults + if (faultResponse.detail.faultCode === "9005") { + const timestamp = sessionContext.timestamp + sessionContext.iteration; + let toClear; + if (rpcReq.name === "GetParameterNames") { + if (rpcReq.parameterPath) { + toClear = [ + [rpcReq.parameterPath.replace(/\.$/, "").split("."), timestamp] + ]; + } + } else if (rpcReq.name === "GetParameterValues") { + toClear = rpcReq.parameterNames.map(p => [ + p.replace(/\.$/, "").split("."), + timestamp + ]); + } else if (rpcReq.name === "SetParameterValues") { + toClear = rpcReq.parameterList.map(p => [ + p[0].replace(/\.$/, "").split("."), + timestamp + ]); + } else if (rpcReq.name === "AddObject") { + toClear = [[rpcReq.objectName.replace(/\.$/, "").split("."), timestamp]]; + } else if (rpcReq.name === "DeleteObject") { + toClear = [[rpcReq.objectName.replace(/\.$/, "").split("."), timestamp]]; + } + + if (toClear) return void clear(sessionContext, toClear, callback); + } + const fault = { code: `cwmp.${faultResponse.detail.faultCode}`, message: faultResponse.detail.faultString, @@ -2561,7 +2592,6 @@ function rpcFault(sessionContext, id, faultResponse, callback) { timestamp: sessionContext.timestamp }; - delete sessionContext.syncState; callback(null, fault); }