1
1
package api
2
2
3
3
import (
4
- "errors"
5
- "fmt"
6
4
"io/ioutil"
7
5
"net/http"
6
+ "os"
8
7
"path"
9
8
"reflect"
10
9
"regexp"
11
10
"strings"
11
+ "time"
12
+
13
+ "github.com/juju/errors"
14
+ "github.com/rs/zerolog"
12
15
13
16
"github.com/beevik/etree"
14
17
"github.com/gin-gonic/gin"
@@ -18,6 +21,18 @@ import (
18
21
wsdiscovery "github.com/use-go/onvif/ws-discovery"
19
22
)
20
23
24
+ var (
25
+ // LoggerContext is the builder of a zerolog.Logger that is exposed to the application so that
26
+ // options at the CLI might alter the formatting and the output of the logs.
27
+ LoggerContext = zerolog .
28
+ New (zerolog.ConsoleWriter {Out : os .Stderr , TimeFormat : time .RFC3339 }).
29
+ With ().Timestamp ()
30
+
31
+ // Logger is a zerolog logger, that can be safely used from any part of the application.
32
+ // It gathers the format and the output.
33
+ Logger = LoggerContext .Logger ()
34
+ )
35
+
21
36
func RunApi () {
22
37
router := gin .Default ()
23
38
@@ -32,7 +47,7 @@ func RunApi() {
32
47
xaddr := c .GetHeader ("xaddr" )
33
48
acceptedData , err := c .GetRawData ()
34
49
if err != nil {
35
- fmt . Println ( err )
50
+ Logger . Debug (). Err ( err ). Msg ( "Failed to get rawx data" )
36
51
}
37
52
38
53
message , err := callNecessaryMethod (serviceName , methodName , string (acceptedData ), username , pass , xaddr )
@@ -49,71 +64,52 @@ func RunApi() {
49
64
50
65
interfaceName := context .GetHeader ("interface" )
51
66
52
- var response = "["
53
- devices := wsdiscovery .SendProbe (interfaceName , nil , []string {"dn:NetworkVideoTransmitter" }, map [string ]string {"dn" : "http://www.onvif.org/ver10/network/wsdl" })
67
+ devices , err := wsdiscovery .SendProbe (interfaceName , nil , []string {"dn:NetworkVideoTransmitter" }, map [string ]string {"dn" : "http://www.onvif.org/ver10/network/wsdl" })
68
+ if err != nil {
69
+ context .String (http .StatusInternalServerError , "error" )
70
+ } else {
71
+ response := "["
54
72
55
- for _ , j := range devices {
56
- doc := etree .NewDocument ()
57
- if err := doc .ReadFromString (j ); err != nil {
58
- context .XML (http .StatusBadRequest , err .Error ())
59
- } else {
73
+ for _ , j := range devices {
74
+ doc := etree .NewDocument ()
75
+ if err := doc .ReadFromString (j ); err != nil {
76
+ context .XML (http .StatusBadRequest , err .Error ())
77
+ } else {
60
78
61
- endpoints := doc .Root ().FindElements ("./Body/ProbeMatches/ProbeMatch/XAddrs" )
62
- scopes := doc .Root ().FindElements ("./Body/ProbeMatches/ProbeMatch/Scopes" )
79
+ endpoints := doc .Root ().FindElements ("./Body/ProbeMatches/ProbeMatch/XAddrs" )
80
+ scopes := doc .Root ().FindElements ("./Body/ProbeMatches/ProbeMatch/Scopes" )
63
81
64
- flag := false
82
+ flag := false
65
83
66
- for _ , xaddr := range endpoints {
67
- xaddr := strings .Split (strings .Split (xaddr .Text (), " " )[0 ], "/" )[2 ]
68
- if strings .Contains (response , xaddr ) {
69
- flag = true
84
+ for _ , xaddr := range endpoints {
85
+ xaddr := strings .Split (strings .Split (xaddr .Text (), " " )[0 ], "/" )[2 ]
86
+ if strings .Contains (response , xaddr ) {
87
+ flag = true
88
+ break
89
+ }
90
+ response += "{"
91
+ response += `"url":"` + xaddr + `",`
92
+ }
93
+ if flag {
70
94
break
71
95
}
72
- response += "{"
73
- response += `"url":"` + xaddr + `",`
74
- }
75
- if flag {
76
- break
77
- }
78
- for _ , scope := range scopes {
79
- re := regexp .MustCompile (`onvif:\/\/www\.onvif\.org\/name\/[A-Za-z0-9-]+` )
80
- match := re .FindStringSubmatch (scope .Text ())
81
- response += `"name":"` + path .Base (match [0 ]) + `"`
96
+ for _ , scope := range scopes {
97
+ re := regexp .MustCompile (`onvif:\/\/www\.onvif\.org\/name\/[A-Za-z0-9-]+` )
98
+ match := re .FindStringSubmatch (scope .Text ())
99
+ response += `"name":"` + path .Base (match [0 ]) + `"`
100
+ }
101
+ response += "},"
82
102
}
83
- response += "},"
84
-
85
103
}
86
-
87
- }
88
- response = strings .TrimRight (response , "," )
89
- response += "]"
90
- if response != "" {
104
+ response = strings .TrimRight (response , "," )
105
+ response += "]"
91
106
context .String (http .StatusOK , response )
92
107
}
93
108
})
94
109
95
110
router .Run ()
96
111
}
97
112
98
- //func soapHandling(tp interface{}, tags* map[string]string) {
99
- // ifaceValue := reflect.ValueOf(tp).Elem()
100
- // typeOfStruct := ifaceValue.Type()
101
- // if ifaceValue.Kind() != reflect.Struct {
102
- // return
103
- // }
104
- // for i := 0; i < ifaceValue.NumField(); i++ {
105
- // field := ifaceValue.Field(i)
106
- // tg, err := typeOfStruct.FieldByName(typeOfStruct.Field(i).Name)
107
- // if err == false {
108
- // fmt.Println(err)
109
- // }
110
- // (*tags)[typeOfStruct.Field(i).Name] = string(tg.Tag)
111
- //
112
- // subStruct := reflect.New(reflect.TypeOf( field.Interface() ))
113
- // soapHandling(subStruct.Interface(), tags)
114
- // }
115
- //}
116
-
117
113
func callNecessaryMethod (serviceName , methodName , acceptedData , username , password , xaddr string ) (string , error ) {
118
114
var methodStruct interface {}
119
115
var err error
@@ -129,17 +125,17 @@ func callNecessaryMethod(serviceName, methodName, acceptedData, username, passwo
129
125
return "" , errors .New ("there is no such service" )
130
126
}
131
127
if err != nil { //done
132
- return "" , err
128
+ return "" , errors . Annotate ( err , "getStructByName" )
133
129
}
134
130
135
131
resp , err := xmlAnalize (methodStruct , & acceptedData )
136
132
if err != nil {
137
- return "" , err
133
+ return "" , errors . Annotate ( err , "xmlAnalize" )
138
134
}
139
135
140
136
endpoint , err := getEndpoint (serviceName , xaddr )
141
137
if err != nil {
142
- return "" , err
138
+ return "" , errors . Annotate ( err , "getEndpoint" )
143
139
}
144
140
145
141
soap := gosoap .NewEmptySOAP ()
@@ -149,12 +145,12 @@ func callNecessaryMethod(serviceName, methodName, acceptedData, username, passwo
149
145
150
146
servResp , err := networking .SendSoap (new (http.Client ), endpoint , soap .String ())
151
147
if err != nil {
152
- return "" , err
148
+ return "" , errors . Annotate ( err , "SendSoap" )
153
149
}
154
150
155
151
rsp , err := ioutil .ReadAll (servResp .Body )
156
152
if err != nil {
157
- return "" , err
153
+ return "" , errors . Annotate ( err , "ReadAll" )
158
154
}
159
155
160
156
return string (rsp ), nil
@@ -163,7 +159,7 @@ func callNecessaryMethod(serviceName, methodName, acceptedData, username, passwo
163
159
func getEndpoint (service , xaddr string ) (string , error ) {
164
160
dev , err := onvif .NewDevice (onvif.DeviceParams {Xaddr : xaddr })
165
161
if err != nil {
166
- return "" , err
162
+ return "" , errors . Annotate ( err , "NewDevice" )
167
163
}
168
164
pkg := strings .ToLower (service )
169
165
@@ -193,7 +189,7 @@ func xmlAnalize(methodStruct interface{}, acceptedData *string) (*string, error)
193
189
194
190
doc := etree .NewDocument ()
195
191
if err := doc .ReadFromString (* acceptedData ); err != nil {
196
- return nil , err
192
+ return nil , errors . Annotate ( err , "readFromString" )
197
193
}
198
194
etr := doc .FindElements ("./*" )
199
195
xmlUnmarshal (etr , & testunMarshal , & mas )
@@ -207,7 +203,7 @@ func xmlAnalize(methodStruct interface{}, acceptedData *string) (*string, error)
207
203
lst := (testunMarshal )[lstIndex ]
208
204
elemName , attr , value , err := xmlMaker (& lst , & test , lstIndex )
209
205
if err != nil {
210
- return nil , err
206
+ return nil , errors . Annotate ( err , "xmlMarker" )
211
207
}
212
208
213
209
if mas [lstIndex ] == "Push" && lstIndex == 0 { //done
@@ -251,10 +247,10 @@ func xmlAnalize(methodStruct interface{}, acceptedData *string) (*string, error)
251
247
252
248
resp , err := document .WriteToString ()
253
249
if err != nil {
254
- return nil , err
250
+ return nil , errors . Annotate ( err , "writeToString" )
255
251
}
256
252
257
- return & resp , err
253
+ return & resp , nil
258
254
}
259
255
260
256
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
273
269
if index == 0 && lstIndex == 0 {
274
270
res , err := xmlProcessing (tg ["XMLName" ])
275
271
if err != nil {
276
- return "" , nil , "" , err
272
+ return "" , nil , "" , errors . Annotate ( err , "xmlProcessing" )
277
273
}
278
274
elemName = res
279
275
} else if index == 0 {
280
276
res , err := xmlProcessing (tg [conversion ])
281
277
if err != nil {
282
- return "" , nil , "" , err
278
+ return "" , nil , "" , errors . Annotate ( err , "xmlProcessing" )
283
279
}
284
280
elemName = res
285
281
} else {
@@ -314,8 +310,6 @@ func xmlProcessing(tg string) (string, error) {
314
310
} else {
315
311
return str [1 ][0 :omitAttr ], nil
316
312
}
317
-
318
- return "" , errors .New ("something went wrong" )
319
313
}
320
314
321
315
func mapProcessing (mapVar []map [string ]string ) []map [string ]string {
@@ -343,9 +337,9 @@ func soapHandling(tp interface{}, tags *[]map[string]string) {
343
337
}
344
338
for i := 0 ; i < s .NumField (); i ++ {
345
339
f := s .Field (i )
346
- tmp , err := typeOfT .FieldByName (typeOfT .Field (i ).Name )
347
- if err == false {
348
- fmt . Println ( err )
340
+ tmp , ok := typeOfT .FieldByName (typeOfT .Field (i ).Name )
341
+ if ! ok {
342
+ Logger . Debug (). Str ( "field" , typeOfT . Field ( i ). Name ). Msg ( "reflection failed" )
349
343
}
350
344
* tags = append (* tags , map [string ]string {typeOfT .Field (i ).Name : string (tmp .Tag )})
351
345
subStruct := reflect .New (reflect .TypeOf (f .Interface ()))
0 commit comments