From 769a4d994b9d9082246917921c72c7ce88475ca0 Mon Sep 17 00:00:00 2001 From: yakovlevdmv Date: Thu, 10 May 2018 20:54:07 +0300 Subject: [PATCH] discovery api endpoint added --- api/api.go | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/api/api.go b/api/api.go index 5a9302b..347df8c 100644 --- a/api/api.go +++ b/api/api.go @@ -13,12 +13,17 @@ import ( "github.com/yakovlevdmv/goonvif/networking" "net/http" "io/ioutil" + "github.com/yakovlevdmv/WS-Discovery" + "path" ) func RunApi () { router := gin.Default() router.POST("/:service/:method", func(c *gin.Context) { + c.Header("Access-Control-Allow-Origin", "*") + //c.Header("Access-Control-Allow-Headers", "access-control-allow-origin, access-control-allow-headers") + serviceName := c.Param("service") methodName := c.Param("method") username := c.GetHeader("username") @@ -33,12 +38,60 @@ func RunApi () { if err != nil { c.XML(http.StatusBadRequest, err.Error()) } else { - c.XML(http.StatusOK, message) + c.String(http.StatusOK, message) } }) + + router.GET("/discovery", func(context *gin.Context) { + context.Header("Access-Control-Allow-Origin", "*") + context.Header("Access-Control-Allow-Headers", "access-control-allow-origin, access-control-allow-headers") + + var response = "[" + devices := WS_Discovery.SendProbe("Ethernet 2", nil, []string{"dn:NetworkVideoTransmitter"}, map[string]string{"dn":"http://www.onvif.org/ver10/network/wsdl"}) + for _, j := range devices { + doc := etree.NewDocument() + if err := doc.ReadFromString(j); err != nil { + context.XML(http.StatusBadRequest, err.Error()) + } else { + + endpoints := doc.Root().FindElements("./Body/ProbeMatches/ProbeMatch/XAddrs") + scopes := doc.Root().FindElements("./Body/ProbeMatches/ProbeMatch/Scopes") + + flag := false + + for _, xaddr := range endpoints { + xaddr := strings.Split(strings.Split(xaddr.Text(), " ")[0], "/")[2] + if strings.Contains(response, xaddr) { + flag = true + break + } + response += "{" + response += `"url":"` + xaddr + `",` + } + if flag { + break + } + for _, scope := range scopes { + re := regexp.MustCompile(`onvif:\/\/www\.onvif\.org\/name\/[A-Za-z0-9-]+`) + match := re.FindStringSubmatch(scope.Text()) + response += `"name":"` + path.Base(match[0]) + `"` + } + response += "}," + + } + + } + response = strings.TrimRight(response, ",") + response += "]" + if response != "" { + context.String(http.StatusOK, response) + } + }) + router.Run() } + //func soapHandling(tp interface{}, tags* map[string]string) { // ifaceValue := reflect.ValueOf(tp).Elem() // typeOfStruct := ifaceValue.Type()