From 86ca55954a68ca600b47bf33fa79cca6c405b47c Mon Sep 17 00:00:00 2001 From: George Palanjyan Date: Tue, 10 Apr 2018 02:08:46 +0300 Subject: [PATCH] fix bugs --- Device.go | 2 +- api/api.go | 75 +++++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 55 insertions(+), 22 deletions(-) diff --git a/Device.go b/Device.go index 154fcbc..3c2e17b 100644 --- a/Device.go +++ b/Device.go @@ -309,7 +309,7 @@ func (dev device) callAuthorizedMethod(endpoint string, method interface{}) (*ht /* Getting an WS-Security struct representation */ - auth := newSecurity(dev.login, dev.password) + auth := NewSecurity(dev.login, dev.password) /* Adding WS-Security namespaces to root element of SOAP message diff --git a/api/api.go b/api/api.go index 99deb9f..2616a2f 100644 --- a/api/api.go +++ b/api/api.go @@ -13,6 +13,8 @@ import ( "github.com/yakovlevdmv/goonvif/networking" "log" "net/http" + "io/ioutil" + "encoding/xml" ) func RunApi () { @@ -22,10 +24,10 @@ func RunApi () { serviceName := c.Param("service") methodName := c.Param("method") acceptedData, err := c.GetRawData() - acpData := string(acceptedData) - _=err - //fmt.Println(string(acceptedData), err,serviceName, methodName) - message := callNecessaryMethod(serviceName, methodName, &acpData, "192.168.13.12") + if err != nil { + fmt.Println(err) + } + message := callNecessaryMethod(serviceName, methodName, string(acceptedData), "192.168.13.12") c.XML(http.StatusOK, message) }) router.Run() @@ -51,7 +53,7 @@ func RunApi () { //} -func callNecessaryMethod(serviceName string, methodName string, acceptedData* string, deviceXaddr string) *string { +func callNecessaryMethod(serviceName string, methodName string, acceptedData string, deviceXaddr string) string { var methodStruct interface{} var err error switch serviceName { @@ -63,7 +65,7 @@ func callNecessaryMethod(serviceName string, methodName string, acceptedData* st if err != nil { //todo: нормально написать } - resp, err := xmlAnalize(methodStruct, acceptedData) + resp, err := xmlAnalize(methodStruct, &acceptedData) if err != nil { //todo: нормально написать } @@ -71,27 +73,55 @@ func callNecessaryMethod(serviceName string, methodName string, acceptedData* st soap := gosoap.NewEmptySOAP() soap.AddStringBodyContent(*resp) soap.AddRootNamespaces(goonvif.Xlmns) - log.Println(soap.String()) - servResp, srvErr := networking.SendSoap(getEndpoint(methodStruct, deviceXaddr), soap.String()) + + /* + Getting an WS-Security struct representation + */ + auth := goonvif.NewSecurity("admin", "Supervisor") + + /* + Adding WS-Security namespaces to root element of SOAP message + */ + soap.AddRootNamespace("wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext1.0.xsd") + soap.AddRootNamespace("wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility1.0.xsd") + + soapReq, err := xml.MarshalIndent(auth, "", " ") + + /* + Adding WS-Security struct to SOAP header + */ + soap.AddStringHeaderContent(string(soapReq)) + + endpoint:= getEndpoint(serviceName, deviceXaddr) + servResp, srvErr := networking.SendSoap(endpoint, soap.String()) if srvErr != nil { + panic(srvErr) //todo: нормально написать } - return &servResp + + rsp, err := ioutil.ReadAll(servResp.Body) + if err != nil { + log.Println(err) + return "" + } + return string(rsp) } -func getEndpoint(method interface{}, deviceXaddr string) string { - dev := goonvif.NewDevice(deviceXaddr) - - pkgPath := strings.Split(reflect.TypeOf(method).PkgPath(),"/") - pkg := pkgPath[len(pkgPath)-1] +func getEndpoint(service, xaddr string) string { + dev, err := goonvif.NewDevice(xaddr) + if err != nil { + log.Println(err) + return "" + } + pkg := strings.ToLower(service) var endpoint string switch pkg { - case "Device": endpoint = dev.GetEndpoint("Device") - case "Event": endpoint = dev.GetEndpoint("Event") - case "Imaging": endpoint = dev.GetEndpoint("Imaging") - case "Media": endpoint = dev.GetEndpoint("Media") - case "PTZ": endpoint = dev.GetEndpoint("PTZ") + case "device": endpoint = dev.GetEndpoint("Device") + case "event": endpoint = dev.GetEndpoint("Event") + case "imaging": endpoint = dev.GetEndpoint("Imaging") + case "media": endpoint = dev.GetEndpoint("Media") + case "ptz": endpoint = dev.GetEndpoint("PTZ") } return endpoint } @@ -221,9 +251,12 @@ func xmlProcessing (tg string) (string, error) { return "", errors.New("out of range") } attr := strings.Index(str[1], ",attr") - if attr == -1 { + omit := strings.Index(str[1], ",omitempty") + if attr == -1 && omit == -1 { //todo: проработать вариант, когдв omitempty и attr вместе return str[1], nil - } else { + } else if omit > -1 { + return str[1][0:omit], nil + }else { return str[0:attr][0], nil } return "", errors.New("something went wrong")