diff options
Diffstat (limited to 'sockets.go')
-rw-r--r-- | sockets.go | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/sockets.go b/sockets.go new file mode 100644 index 0000000..0ebbe43 --- /dev/null +++ b/sockets.go | |||
@@ -0,0 +1,66 @@ | |||
1 | package main | ||
2 | |||
3 | import ( | ||
4 | "io" | ||
5 | "log" | ||
6 | "net" | ||
7 | |||
8 | "github.com/gorilla/websocket" | ||
9 | ) | ||
10 | |||
11 | func wsReader(wsconn *websocket.Conn, out chan []byte) { | ||
12 | for { | ||
13 | messageType, p, err := wsconn.ReadMessage() | ||
14 | if err != nil { | ||
15 | log.Printf("error: wsReader: %s", err) | ||
16 | return | ||
17 | } | ||
18 | if messageType != websocket.BinaryMessage { | ||
19 | log.Println("error: wsReader: only binary messages are supported") | ||
20 | continue | ||
21 | } | ||
22 | out <- p | ||
23 | } | ||
24 | } | ||
25 | |||
26 | func socketReader(proxyconn net.Conn, out chan []byte) { | ||
27 | for { | ||
28 | readBuffer := make([]byte, 2048) | ||
29 | |||
30 | i, err := proxyconn.Read(readBuffer) | ||
31 | if err != nil { | ||
32 | if err == io.EOF { | ||
33 | log.Println("info: socketReader: Disconnected") | ||
34 | } else { | ||
35 | log.Printf("error: socketReader: %s", err) | ||
36 | } | ||
37 | return | ||
38 | } | ||
39 | |||
40 | out <- readBuffer[:i] | ||
41 | } | ||
42 | } | ||
43 | |||
44 | func serviceBoth(wsconn *websocket.Conn, proxyconn net.Conn) { | ||
45 | sc := make(chan []byte) | ||
46 | wsc := make(chan []byte) | ||
47 | |||
48 | go socketReader(proxyconn, sc) | ||
49 | go wsReader(wsconn, wsc) | ||
50 | |||
51 | for { | ||
52 | select { | ||
53 | case sd := <-sc: | ||
54 | if err := wsconn.WriteMessage(websocket.BinaryMessage, sd); err != nil { | ||
55 | log.Printf("error: serviceBoth: %s", err) | ||
56 | return | ||
57 | } | ||
58 | |||
59 | case wsd := <-wsc: | ||
60 | if _, err := proxyconn.Write(wsd); err != nil { | ||
61 | log.Printf("error: serviceBoth: %s", err) | ||
62 | return | ||
63 | } | ||
64 | } | ||
65 | } | ||
66 | } | ||