diff --git a/lib/session.coffee b/lib/session.coffee index 22ab9a4..b24dfec 100644 --- a/lib/session.coffee +++ b/lib/session.coffee @@ -168,14 +168,14 @@ transferComplete = (sessionData, rpcReq, callback) -> sessionData.operationsTouched ?= {} sessionData.operationsTouched[commandKey] = 1 - if rpcReq.faultStruct? and rpcReq.faultStruct.FaultCode != '0' + if rpcReq.faultStruct? and rpcReq.faultStruct.faultCode != '0' return revertDownloadParameters(sessionData, operation.args.instance, (err) -> for channel, provisions of operation.provisions faults[channel] = { provisions: provisions timestamp: sessionData.timestamp - code: "cwmp.#{rpcReq.faultStruct['FaultCode']}" - message: rpcReq.faultStruct['FaultString'] + code: "cwmp.#{rpcReq.faultStruct.faultCode}" + message: rpcReq.faultStruct.faultString detail: rpcReq.faultStruct } @@ -1546,9 +1546,9 @@ rpcFault = (sessionData, id, faultResponse, callback) -> fault = { provisions: [] timestamp: sessionData.timestamp - code: "cwmp.#{faultResponse.detail.Fault['FaultCode']}" - message: faultResponse.detail.Fault['FaultString'] - detail: faultResponse.detail.Fault + code: "cwmp.#{faultResponse.detail.faultCode}" + message: faultResponse.detail.faultString + detail: faultResponse.detail } if sessionData.faults[channel]? diff --git a/lib/soap.coffee b/lib/soap.coffee index 6a7cff7..2848009 100644 --- a/lib/soap.coffee +++ b/lib/soap.coffee @@ -238,7 +238,12 @@ cpeDownloadResponse = (xml) -> acsInform = (xml) -> { parameterList : parameterValueList(xml.get('ParameterList')), - deviceId : traverseXml(xml.get('DeviceId')), + deviceId : { + 'Manufacturer' : xml.get('DeviceId/Manufacturer').text(), + 'OUI' : xml.get('DeviceId/OUI').text(), + 'ProductClass' : xml.get('DeviceId/ProductClass').text(), + 'SerialNumber' : xml.get('DeviceId/SerialNumber').text() + } event : event(xml.get('Event')), retryCount : parseInt(xml.get('RetryCount').text()) } @@ -262,7 +267,7 @@ acsGetRPCMethodsResponse = (xml, methodResponse) -> acsTransferComplete = (xml) -> { commandKey : xml.get('CommandKey').text(), - faultStruct : traverseXml(xml.get('FaultStruct')), + faultStruct : faultStruct(xml.get('FaultStruct')), startTime : Date.parse(xml.get('StartTime').text()), completeTime : Date.parse(xml.get('CompleteTime').text()) } @@ -283,20 +288,29 @@ acsRequestDownloadResponse = (xml, methodResponse) -> xml.node('cwmp:RequestDownloadResponse').text('') -traverseXml = (xml) -> - obj = {} - for n in xml.childNodes() - if n.type() == 'element' - obj[n.name()] = traverseXml(n) +faultStruct = (xml) -> + f = { + faultCode: xml.get('FaultCode').text(), + faultString: xml.get('FaultString').text() + } - if Object.keys(obj).length == 0 - xml.text() - else - obj + for e in xml.find('SetParameterValuesFault') + f.setParameterValuesFault ?= [] + f.setParameterValuesFault.push({ + parameterName: e.get('ParameterName').text(), + faultCode: e.get('FaultCode').text(), + faultString: e.get('FaultString').text() + }) + + return f -fault = (xml) -> - return traverseXml(xml) +fault = (xml, cwmpVersion) -> + { + faultCode: xml.get('faultcode').text(), + faultString: xml.get('faultstring').text(), + detail: faultStruct(xml.get('detail/cwmp:Fault', NAMESPACES[cwmpVersion])) + } exports.request = (httpRequest, cwmpVersion) -> @@ -374,7 +388,7 @@ exports.request = (httpRequest, cwmpVersion) -> throw Error('8000 Method not supported ' + methodElement.name()) else faultElement = xml.get('/soap-env:Envelope/soap-env:Body/soap-env:Fault', NAMESPACES[cwmpRequest.cwmpVersion]) - cwmpRequest.fault = fault(faultElement) + cwmpRequest.fault = fault(faultElement, cwmpRequest.cwmpVersion) return cwmpRequest