diff --git a/backend/services/acs/internal/server/handler/cwmp.go b/backend/services/acs/internal/server/handler/cwmp.go index 1b0c984..0d23c6a 100644 --- a/backend/services/acs/internal/server/handler/cwmp.go +++ b/backend/services/acs/internal/server/handler/cwmp.go @@ -1,7 +1,6 @@ package handler import ( - "encoding/json" "encoding/xml" "fmt" "io/ioutil" @@ -84,7 +83,7 @@ func (h *Handler) CwmpHandler(w http.ResponseWriter, r *http.Request) { cpe := &obj cpe.LastConnection = time.Now() - log.Printf("Received an Inform from device %s withEventCodes %s", addr, Inform.GetEvents()) + log.Printf("Received an Inform from device %s withEventCodes %s", addr, Inform.GetEvents()) expiration := time.Now().AddDate(0, 0, 1) @@ -92,6 +91,7 @@ func (h *Handler) CwmpHandler(w http.ResponseWriter, r *http.Request) { http.SetCookie(w, &cookie) //data, _ := xml.Marshal(cwmp.InformResponse(envelope.Header.Id)) fmt.Fprintf(w, cwmp.InformResponse(envelope.Header.Id)) + } else if messageType == "TransferComplete" { } else if messageType == "GetRPC" { @@ -103,34 +103,27 @@ func (h *Handler) CwmpHandler(w http.ResponseWriter, r *http.Request) { } if cpe.Waiting != nil { + log.Println("CPE was waiting for a response, now received something") + var e cwmp.SoapEnvelope xml.Unmarshal([]byte(body), &e) log.Println("Kind of envelope: ", e.KindOf()) if e.KindOf() == "GetParameterNamesResponse" { - // var envelope cwmp.GetParameterNamesResponse - // xml.Unmarshal([]byte(body), &envelope) - - // msg := new(NatsSendMessage) - // msg.MsgType = "GetParameterNamesResponse" - // msg.Data, _ = json.Marshal(envelope) log.Println("Receive GetParameterNamesResponse from CPE:", cpe.SerialNumber) - cpe.Waiting.Callback <- tmp - + msgAnswer(cpe.Waiting.Callback, cpe.Waiting.Time, h.acsConfig.DeviceAnswerTimeout, tmp) } else if e.KindOf() == "GetParameterValuesResponse" { - var envelope cwmp.GetParameterValuesResponse - xml.Unmarshal([]byte(body), &envelope) - - msg := new(NatsSendMessage) - msg.MsgType = "GetParameterValuesResponse" - msg.Data, _ = json.Marshal(envelope) - - cpe.Waiting.Callback <- tmp - + log.Println("Receive GetParameterValuesResponse from CPE:", cpe.SerialNumber) + msgAnswer(cpe.Waiting.Callback, cpe.Waiting.Time, h.acsConfig.DeviceAnswerTimeout, tmp) + } else if e.KindOf() == "Fault" { + log.Println("Receive FaultResponse from CPE:", cpe.SerialNumber) + msgAnswer(cpe.Waiting.Callback, cpe.Waiting.Time, h.acsConfig.DeviceAnswerTimeout, tmp) + log.Println(body) } else { log.Println("Unknown message type") - cpe.Waiting.Callback <- tmp + log.Println("Envelope:", e) + msgAnswer(cpe.Waiting.Callback, cpe.Waiting.Time, h.acsConfig.DeviceAnswerTimeout, tmp) } cpe.Waiting = nil } else { @@ -151,6 +144,7 @@ func (h *Handler) CwmpHandler(w http.ResponseWriter, r *http.Request) { } } h.Cpes[cpe.SerialNumber] = cpe + log.Println("---End of CWMP Handler---") } func (h *Handler) ConnectionRequest(cpe CPE) error { @@ -167,3 +161,16 @@ func (h *Handler) ConnectionRequest(cpe CPE) error { log.Println("<-- Successfully authenticated to CPE", cpe.SerialNumber) return err } + +func msgAnswer( + callback chan []byte, + timeMsgWasSent time.Time, + timeOut time.Duration, + msgAnswer []byte, +) { + if time.Since(timeMsgWasSent) > timeOut { + log.Println("CPE took too long to answer the request, the message will be discarded") + } else { + callback <- msgAnswer + } +} diff --git a/backend/services/acs/internal/server/handler/handler.go b/backend/services/acs/internal/server/handler/handler.go index e99d60c..3553750 100644 --- a/backend/services/acs/internal/server/handler/handler.go +++ b/backend/services/acs/internal/server/handler/handler.go @@ -16,6 +16,7 @@ type Request struct { User string Password string CwmpMsg []byte + Time time.Time Callback chan []byte }