-
Notifications
You must be signed in to change notification settings - Fork 0
/
listenner.go
124 lines (109 loc) · 2.51 KB
/
listenner.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package peoplecounting
import (
"bytes"
"context"
"fmt"
"io/ioutil"
"log"
"net/http"
"strings"
"time"
)
type Event struct {
ID string
Data interface{}
}
// Listen function to listen events
func Listen(ctx context.Context, socket string, wError, wCamera *log.Logger) <-chan *Event {
// wError.Println("listennnnn")
ch := make(chan *Event)
h1 := func(w http.ResponseWriter, req *http.Request) {
defer req.Body.Close()
switch req.Method {
case http.MethodPost:
// disp := req.Header.Get("Content-Disposition")
// _, params, err := mime.ParseMediaType(disp)
// if err != nil {
// return
// }
// name, ok := params["name"]
// if !ok {
// return
// }
// if ok := strings.Contains(name, "Event_Type"); !ok {
// return
// }
// log.Printf("headers: %v", req.Header)
ctype := req.Header.Get("Content-Type")
if ok := strings.Contains(ctype, "application/xml"); ok {
// if err := req.ParseForm(); err != nil {
// log.Println(err)
// }
// log.Printf("Post from website! r.PostFrom = %v\n", req.PostForm)
reader := req.Body
body, err := ioutil.ReadAll(reader)
if err != nil {
log.Printf("Error reading body: %v", err)
return
}
reader.Close()
wCamera.Printf("%d: listen event: %s\n", time.Now().UnixNano()/1000_000, body)
newreader := bytes.NewReader(body)
// if err != nil {
// return
// }
event, err := parseXMLEvent(newreader)
// req.Body.Close()
// reader.Close()
if err != nil {
log.Println(err)
return
}
id := func() string {
if req != nil {
parts := strings.Split(req.RemoteAddr, ":")
if len(parts) > 0 {
return parts[0]
}
}
return ""
}()
fmt.Printf("remote: %v, id: %s\n", req, id)
evt := &Event{
ID: id,
Data: event,
}
select {
case ch <- evt:
//Timeout
case <-time.After(3 * time.Second):
case <-ctx.Done():
}
}
}
w.WriteHeader(http.StatusOK)
w.Write([]byte("{\"status\": \"OK\"}"))
}
m := http.NewServeMux()
m.HandleFunc("/", h1)
// m.HandleFunc("/http://192.168.188.23:8088/", h1)
srv := &http.Server{
Addr: socket,
Handler: m,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
go func() {
// defer close(ch)
err := srv.ListenAndServe()
close(ch)
wError.Println(err)
}()
go func(ctx context.Context) {
<-ctx.Done()
srv.Shutdown(ctx)
wError.Println("shutdown server http")
}(ctx)
return ch
}