From 9e25a0109ee48d65da199ad695008af92a030f49 Mon Sep 17 00:00:00 2001 From: Jean-Francois Smigielski Date: Tue, 10 May 2022 23:41:42 +0200 Subject: [PATCH] api: use juju/errors and zerolog --- api/api.go | 72 +++++++++++++++++++++++++----------------------------- 1 file changed, 33 insertions(+), 39 deletions(-) diff --git a/api/api.go b/api/api.go index 71f362c..df7f363 100644 --- a/api/api.go +++ b/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()))