This commit is contained in:
George Palanjyan
2018-04-10 02:08:46 +03:00
parent cb3bd7e4d8
commit 86ca55954a
2 changed files with 55 additions and 22 deletions

View File

@@ -309,7 +309,7 @@ func (dev device) callAuthorizedMethod(endpoint string, method interface{}) (*ht
/* /*
Getting an WS-Security struct representation 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 Adding WS-Security namespaces to root element of SOAP message

View File

@@ -13,6 +13,8 @@ import (
"github.com/yakovlevdmv/goonvif/networking" "github.com/yakovlevdmv/goonvif/networking"
"log" "log"
"net/http" "net/http"
"io/ioutil"
"encoding/xml"
) )
func RunApi () { func RunApi () {
@@ -22,10 +24,10 @@ func RunApi () {
serviceName := c.Param("service") serviceName := c.Param("service")
methodName := c.Param("method") methodName := c.Param("method")
acceptedData, err := c.GetRawData() acceptedData, err := c.GetRawData()
acpData := string(acceptedData) if err != nil {
_=err fmt.Println(err)
//fmt.Println(string(acceptedData), err,serviceName, methodName) }
message := callNecessaryMethod(serviceName, methodName, &acpData, "192.168.13.12") message := callNecessaryMethod(serviceName, methodName, string(acceptedData), "192.168.13.12")
c.XML(http.StatusOK, message) c.XML(http.StatusOK, message)
}) })
router.Run() 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 methodStruct interface{}
var err error var err error
switch serviceName { switch serviceName {
@@ -63,7 +65,7 @@ func callNecessaryMethod(serviceName string, methodName string, acceptedData* st
if err != nil { if err != nil {
//todo: нормально написать //todo: нормально написать
} }
resp, err := xmlAnalize(methodStruct, acceptedData) resp, err := xmlAnalize(methodStruct, &acceptedData)
if err != nil { if err != nil {
//todo: нормально написать //todo: нормально написать
} }
@@ -71,27 +73,55 @@ func callNecessaryMethod(serviceName string, methodName string, acceptedData* st
soap := gosoap.NewEmptySOAP() soap := gosoap.NewEmptySOAP()
soap.AddStringBodyContent(*resp) soap.AddStringBodyContent(*resp)
soap.AddRootNamespaces(goonvif.Xlmns) 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 { if srvErr != nil {
panic(srvErr)
//todo: нормально написать //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 { func getEndpoint(service, xaddr string) string {
dev := goonvif.NewDevice(deviceXaddr) dev, err := goonvif.NewDevice(xaddr)
if err != nil {
pkgPath := strings.Split(reflect.TypeOf(method).PkgPath(),"/") log.Println(err)
pkg := pkgPath[len(pkgPath)-1] return ""
}
pkg := strings.ToLower(service)
var endpoint string var endpoint string
switch pkg { switch pkg {
case "Device": endpoint = dev.GetEndpoint("Device") case "device": endpoint = dev.GetEndpoint("Device")
case "Event": endpoint = dev.GetEndpoint("Event") case "event": endpoint = dev.GetEndpoint("Event")
case "Imaging": endpoint = dev.GetEndpoint("Imaging") case "imaging": endpoint = dev.GetEndpoint("Imaging")
case "Media": endpoint = dev.GetEndpoint("Media") case "media": endpoint = dev.GetEndpoint("Media")
case "PTZ": endpoint = dev.GetEndpoint("PTZ") case "ptz": endpoint = dev.GetEndpoint("PTZ")
} }
return endpoint return endpoint
} }
@@ -221,9 +251,12 @@ func xmlProcessing (tg string) (string, error) {
return "", errors.New("out of range") return "", errors.New("out of range")
} }
attr := strings.Index(str[1], ",attr") 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 return str[1], nil
} else { } else if omit > -1 {
return str[1][0:omit], nil
}else {
return str[0:attr][0], nil return str[0:attr][0], nil
} }
return "", errors.New("something went wrong") return "", errors.New("something went wrong")