summaryrefslogtreecommitdiff
path: root/proxy/ws_read_writer.go
diff options
context:
space:
mode:
Diffstat (limited to 'proxy/ws_read_writer.go')
-rw-r--r--proxy/ws_read_writer.go39
1 files changed, 39 insertions, 0 deletions
diff --git a/proxy/ws_read_writer.go b/proxy/ws_read_writer.go
new file mode 100644
index 0000000..b064019
--- /dev/null
+++ b/proxy/ws_read_writer.go
@@ -0,0 +1,39 @@
1package proxy
2
3import (
4 "fmt"
5
6 "github.com/gorilla/websocket"
7)
8
9type WebsocketReadWriter struct {
10 W *websocket.Conn
11}
12
13func (w *WebsocketReadWriter) Read(p []byte) (int, error) {
14 t, m, err := w.W.ReadMessage()
15 if err != nil {
16 return 0, fmt.Errorf("error reading websocket: %w", err)
17 }
18 if t != websocket.BinaryMessage {
19 return 0, fmt.Errorf("error reading websocket: only binary messages are supported")
20 }
21 if cap(p) < len(m) {
22 return 0, fmt.Errorf("error reading websocket: outputbuffer too short for input")
23 }
24 if i := copy(p, m); i != len(m) {
25 return 0, fmt.Errorf("error reading websocket: copy failed %d of %d", i, len(m))
26 }
27 return len(m), nil
28}
29
30func (w *WebsocketReadWriter) Write(p []byte) (int, error) {
31 if err := w.W.WriteMessage(websocket.BinaryMessage, p); err != nil {
32 return 0, fmt.Errorf("error writing websocket: %w", err)
33 }
34 return len(p), nil
35}
36
37func (w *WebsocketReadWriter) Close() error {
38 return w.W.Close()
39}