summaryrefslogtreecommitdiff
path: root/sockets.go
blob: 2ded258516bb17dcacbb0850ac9c647a671e3122 (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
67
68
69
70
71
72
73
74
75
76
77
78
79
package main

import (
	"context"
	"io"
	"log"
	"net"

	"github.com/gorilla/websocket"
)

func wsReader(wsconn *websocket.Conn, out chan []byte, ctx context.Context) {
	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
		}
		select {
		case out <- p:
			continue
		case <-ctx.Done():
			return
		}
	}
}

func socketReader(proxyconn net.Conn, out chan []byte, ctx context.Context) {
	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
		}

		select {
		case out <- readBuffer[:i]:
			continue
		case <-ctx.Done():
			return
		}
	}
}

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

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

	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
			}
		case <-ctx.Done():
			return
		}
	}
}