aboutsummaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'main.go')
-rw-r--r--main.go89
1 files changed, 89 insertions, 0 deletions
diff --git a/main.go b/main.go
new file mode 100644
index 0000000..b2f80f8
--- /dev/null
+++ b/main.go
@@ -0,0 +1,89 @@
1package main
2
3import (
4 "flag"
5 "fmt"
6 "log"
7 "net/http"
8 "net/url"
9 "os"
10 "os/signal"
11 "syscall"
12 "time"
13
14 "github.com/gorilla/websocket"
15 "golang.org/x/crypto/ssh/terminal"
16)
17
18var addr = flag.String("addr", "localhost:8080", "http service address")
19
20func main() {
21 flag.Parse()
22 log.SetFlags(0)
23
24 interrupt := make(chan os.Signal, 1)
25 signal.Notify(interrupt, os.Interrupt)
26 signal.Notify(interrupt, syscall.SIGTERM)
27
28 u := url.URL{Scheme: "ws", Host: *addr, Path: "/"}
29 log.Printf("connecting to %s. `kill -15 %d` to stop", u.String(), os.Getpid())
30
31 proto := make(http.Header)
32 proto.Add("Sec-WebSocket-Protocol", "binary")
33 c, _, err := websocket.DefaultDialer.Dial(u.String(), proto)
34 if err != nil {
35 log.Fatal("dial:", err)
36 }
37 defer c.Close()
38
39 oldState, err := terminal.MakeRaw(0)
40 if err != nil {
41 fmt.Println("Cannot set input terminal in raw mode")
42 }
43 defer terminal.Restore(0, oldState)
44
45 done := make(chan struct{})
46
47 go func() {
48 defer close(done)
49 for {
50 _, message, err := c.ReadMessage()
51 if err != nil {
52 log.Println("read:", err)
53 return
54 }
55 fmt.Fprintf(os.Stdout, "%s", message)
56 }
57 }()
58
59 for {
60 select {
61 case <-done:
62 return
63 case <-interrupt:
64 log.Println("interrupt")
65
66 // Cleanly close the connection by sending a close message and then
67 // waiting (with timeout) for the server to close the connection.
68 err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
69 if err != nil {
70 log.Println("write close:", err)
71 return
72 }
73 select {
74 case <-done:
75 case <-time.After(time.Second):
76 }
77 return
78 default:
79 buf := make([]byte, 128)
80 n, err := os.Stdin.Read(buf)
81 err = c.WriteMessage(websocket.BinaryMessage, buf[:n])
82 if err != nil {
83 log.Println("write:", err)
84 return
85 }
86 }
87
88 }
89}