api: use juju/errors and zerolog

This commit is contained in:
Jean-Francois Smigielski
2022-05-10 23:41:42 +02:00
parent 47d91cba88
commit 9e25a0109e

View File

@@ -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()))