mirror of
https://github.com/kerberos-io/onvif.git
synced 2026-08-23 15:08:33 +00:00
api: use juju/errors and zerolog
This commit is contained in:
72
api/api.go
72
api/api.go
@@ -1,14 +1,17 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"os"
|
||||
"path"
|
||||
"reflect"
|
||||
"regexp"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/juju/errors"
|
||||
"github.com/rs/zerolog"
|
||||
|
||||
"github.com/beevik/etree"
|
||||
"github.com/gin-gonic/gin"
|
||||
@@ -18,6 +21,18 @@ import (
|
||||
wsdiscovery "github.com/use-go/onvif/ws-discovery"
|
||||
)
|
||||
|
||||
var (
|
||||
// LoggerContext is the builder of a zerolog.Logger that is exposed to the application so that
|
||||
// options at the CLI might alter the formatting and the output of the logs.
|
||||
LoggerContext = zerolog.
|
||||
New(zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: time.RFC3339}).
|
||||
With().Timestamp()
|
||||
|
||||
// Logger is a zerolog logger, that can be safely used from any part of the application.
|
||||
// It gathers the format and the output.
|
||||
Logger = LoggerContext.Logger()
|
||||
)
|
||||
|
||||
func RunApi() {
|
||||
router := gin.Default()
|
||||
|
||||
@@ -32,7 +47,7 @@ func RunApi() {
|
||||
xaddr := c.GetHeader("xaddr")
|
||||
acceptedData, err := c.GetRawData()
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
Logger.Debug().Err(err).Msg("Failed to get rawx data")
|
||||
}
|
||||
|
||||
message, err := callNecessaryMethod(serviceName, methodName, string(acceptedData), username, pass, xaddr)
|
||||
@@ -95,25 +110,6 @@ func RunApi() {
|
||||
router.Run()
|
||||
}
|
||||
|
||||
//func soapHandling(tp interface{}, tags* map[string]string) {
|
||||
// ifaceValue := reflect.ValueOf(tp).Elem()
|
||||
// typeOfStruct := ifaceValue.Type()
|
||||
// if ifaceValue.Kind() != reflect.Struct {
|
||||
// return
|
||||
// }
|
||||
// for i := 0; i < ifaceValue.NumField(); i++ {
|
||||
// field := ifaceValue.Field(i)
|
||||
// tg, err := typeOfStruct.FieldByName(typeOfStruct.Field(i).Name)
|
||||
// if err == false {
|
||||
// fmt.Println(err)
|
||||
// }
|
||||
// (*tags)[typeOfStruct.Field(i).Name] = string(tg.Tag)
|
||||
//
|
||||
// subStruct := reflect.New(reflect.TypeOf( field.Interface() ))
|
||||
// soapHandling(subStruct.Interface(), tags)
|
||||
// }
|
||||
//}
|
||||
|
||||
func callNecessaryMethod(serviceName, methodName, acceptedData, username, password, xaddr string) (string, error) {
|
||||
var methodStruct interface{}
|
||||
var err error
|
||||
@@ -129,17 +125,17 @@ func callNecessaryMethod(serviceName, methodName, acceptedData, username, passwo
|
||||
return "", errors.New("there is no such service")
|
||||
}
|
||||
if err != nil { //done
|
||||
return "", err
|
||||
return "", errors.Annotate(err, "getStructByName")
|
||||
}
|
||||
|
||||
resp, err := xmlAnalize(methodStruct, &acceptedData)
|
||||
if err != nil {
|
||||
return "", err
|
||||
return "", errors.Annotate(err, "xmlAnalize")
|
||||
}
|
||||
|
||||
endpoint, err := getEndpoint(serviceName, xaddr)
|
||||
if err != nil {
|
||||
return "", err
|
||||
return "", errors.Annotate(err, "getEndpoint")
|
||||
}
|
||||
|
||||
soap := gosoap.NewEmptySOAP()
|
||||
@@ -149,12 +145,12 @@ func callNecessaryMethod(serviceName, methodName, acceptedData, username, passwo
|
||||
|
||||
servResp, err := networking.SendSoap(new(http.Client), endpoint, soap.String())
|
||||
if err != nil {
|
||||
return "", err
|
||||
return "", errors.Annotate(err, "SendSoap")
|
||||
}
|
||||
|
||||
rsp, err := ioutil.ReadAll(servResp.Body)
|
||||
if err != nil {
|
||||
return "", err
|
||||
return "", errors.Annotate(err, "ReadAll")
|
||||
}
|
||||
|
||||
return string(rsp), nil
|
||||
@@ -163,7 +159,7 @@ func callNecessaryMethod(serviceName, methodName, acceptedData, username, passwo
|
||||
func getEndpoint(service, xaddr string) (string, error) {
|
||||
dev, err := onvif.NewDevice(onvif.DeviceParams{Xaddr: xaddr})
|
||||
if err != nil {
|
||||
return "", err
|
||||
return "", errors.Annotate(err, "NewDevice")
|
||||
}
|
||||
pkg := strings.ToLower(service)
|
||||
|
||||
@@ -193,7 +189,7 @@ func xmlAnalize(methodStruct interface{}, acceptedData *string) (*string, error)
|
||||
|
||||
doc := etree.NewDocument()
|
||||
if err := doc.ReadFromString(*acceptedData); err != nil {
|
||||
return nil, err
|
||||
return nil, errors.Annotate(err, "readFromString")
|
||||
}
|
||||
etr := doc.FindElements("./*")
|
||||
xmlUnmarshal(etr, &testunMarshal, &mas)
|
||||
@@ -207,7 +203,7 @@ func xmlAnalize(methodStruct interface{}, acceptedData *string) (*string, error)
|
||||
lst := (testunMarshal)[lstIndex]
|
||||
elemName, attr, value, err := xmlMaker(&lst, &test, lstIndex)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, errors.Annotate(err, "xmlMarker")
|
||||
}
|
||||
|
||||
if mas[lstIndex] == "Push" && lstIndex == 0 { //done
|
||||
@@ -251,10 +247,10 @@ func xmlAnalize(methodStruct interface{}, acceptedData *string) (*string, error)
|
||||
|
||||
resp, err := document.WriteToString()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, errors.Annotate(err, "writeToString")
|
||||
}
|
||||
|
||||
return &resp, err
|
||||
return &resp, nil
|
||||
}
|
||||
|
||||
func xmlMaker(lst *[]interface{}, tags *[]map[string]string, lstIndex int) (string, map[string]string, string, error) {
|
||||
@@ -273,13 +269,13 @@ func xmlMaker(lst *[]interface{}, tags *[]map[string]string, lstIndex int) (stri
|
||||
if index == 0 && lstIndex == 0 {
|
||||
res, err := xmlProcessing(tg["XMLName"])
|
||||
if err != nil {
|
||||
return "", nil, "", err
|
||||
return "", nil, "", errors.Annotate(err, "xmlProcessing")
|
||||
}
|
||||
elemName = res
|
||||
} else if index == 0 {
|
||||
res, err := xmlProcessing(tg[conversion])
|
||||
if err != nil {
|
||||
return "", nil, "", err
|
||||
return "", nil, "", errors.Annotate(err, "xmlProcessing")
|
||||
}
|
||||
elemName = res
|
||||
} else {
|
||||
@@ -314,8 +310,6 @@ func xmlProcessing(tg string) (string, error) {
|
||||
} else {
|
||||
return str[1][0:omitAttr], nil
|
||||
}
|
||||
|
||||
return "", errors.New("something went wrong")
|
||||
}
|
||||
|
||||
func mapProcessing(mapVar []map[string]string) []map[string]string {
|
||||
@@ -343,9 +337,9 @@ func soapHandling(tp interface{}, tags *[]map[string]string) {
|
||||
}
|
||||
for i := 0; i < s.NumField(); i++ {
|
||||
f := s.Field(i)
|
||||
tmp, err := typeOfT.FieldByName(typeOfT.Field(i).Name)
|
||||
if err == false {
|
||||
fmt.Println(err)
|
||||
tmp, ok := typeOfT.FieldByName(typeOfT.Field(i).Name)
|
||||
if !ok {
|
||||
Logger.Debug().Str("field", typeOfT.Field(i).Name).Msg("reflection failed")
|
||||
}
|
||||
*tags = append(*tags, map[string]string{typeOfT.Field(i).Name: string(tmp.Tag)})
|
||||
subStruct := reflect.New(reflect.TypeOf(f.Interface()))
|
||||
|
||||
Reference in New Issue
Block a user