summaryrefslogtreecommitdiff
path: root/sockets.go
blob: 0ebbe4318e3f61301ecf237a0440d92a7df79664 (plain)
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
package main

import (
	"io"
	"log"
	"net"

	"github.com/gorilla/websocket"
)

func wsReader(wsconn *websocket.Conn, out chan []byte) {
	for {
		messageType, p, err := wsconn.ReadMessage()
		if err != nil {
			log.Printf("error: wsReader: %s", err)
			return
		}
		if messageType != websocket.BinaryMessage {
			log.Println("error: wsReader: only binary messages are supported")
			continue
		}
		out <- p
	}
}

func socketReader(proxyconn net.Conn, out chan []byte) {
	for {
		readBuffer := make([]byte, 2048)

		i, err := proxyconn.Read(readBuffer)
		if err != nil {
			if err == io.EOF {
				log.Println("info: socketReader: Disconnected")
			} else {
				log.Printf("error: socketReader: %s", err)
			}
			return
		}

		out <- readBuffer[:i]
	}
}

func serviceBoth(wsconn *websocket.Conn, proxyconn net.Conn) {
	sc := make(chan []byte)
	wsc := make(chan []byte)

	go socketReader(proxyconn, sc)
	go wsReader(wsconn, wsc)

	for {
		select {
		case sd := <-sc:
			if err := wsconn.WriteMessage(websocket.BinaryMessage, sd); err != nil {
				log.Printf("error: serviceBoth: %s", err)
				return
			}

		case wsd := <-wsc:
			if _, err := proxyconn.Write(wsd); err != nil {
				log.Printf("error: serviceBoth: %s", err)
				return
			}
		}
	}
}