summaryrefslogtreecommitdiff
path: root/sockets.go
diff options
context:
space:
mode:
Diffstat (limited to 'sockets.go')
-rw-r--r--sockets.go66
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 @@
1package main
2
3import (
4 "io"
5 "log"
6 "net"
7
8 "github.com/gorilla/websocket"
9)
10
11func 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
26func 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
44func 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}