summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cmd/main.go7
-rw-r--r--src/lib.go118
2 files changed, 125 insertions, 0 deletions
diff --git a/src/cmd/main.go b/src/cmd/main.go
new file mode 100644
index 0000000..e6ae309
--- /dev/null
+++ b/src/cmd/main.go
@@ -0,0 +1,7 @@
+package main
+
+import "euandre.org/wscat/src"
+
+func main() {
+ wscat.Main()
+}
diff --git a/src/lib.go b/src/lib.go
new file mode 100644
index 0000000..3733475
--- /dev/null
+++ b/src/lib.go
@@ -0,0 +1,118 @@
+package wscat
+
+import (
+ "fmt"
+ "net"
+ "net/http"
+ "os"
+
+ g "euandre.org/gobang/src"
+
+ "github.com/gorilla/websocket"
+)
+
+
+
+type CLIArgs struct {
+ FromAddr string
+ ToAddr string
+}
+
+
+
+const X = 1
+
+var EmitActiveConnection = g.MakeGauge("active-connections")
+
+
+
+func ParseArgs(args []string) CLIArgs {
+ if len(args) != 3 {
+ fmt.Fprintf(
+ os.Stderr,
+ "Usage: %s FROM.socket TO.socket\n",
+ args[0],
+ )
+ os.Exit(2)
+ }
+ return CLIArgs {
+ FromAddr: args[1],
+ ToAddr: args[2],
+ }
+}
+
+func Listen(fromAddr string) net.Listener {
+ listener, err := net.Listen("unix", fromAddr)
+ g.FatalIf(err)
+ g.Info("Started listening", "listen-start", "from-address", fromAddr)
+ return listener
+}
+
+func Start(toAddr string, listener net.Listener) {
+ upgrader := websocket.Upgrader {}
+ http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
+ connFrom, err := upgrader.Upgrade(w, r, nil)
+ if err != nil {
+ g.Warning(
+ "Error upgrading connection",
+ "upgrade-connection-error",
+ "err", err,
+ )
+ return
+ }
+ defer connFrom.Close()
+ EmitActiveConnection.Inc()
+
+ connTo, err := net.Dial("unix", toAddr)
+ if err != nil {
+ g.Error(
+ "Error dialing connection",
+ "dial-connection",
+ "err", err,
+ )
+ os.Exit(1)
+ }
+ defer connTo.Close()
+
+ messageType, reader, err := connFrom.NextReader()
+ if err != nil {
+ g.Warning(
+ "Failed to get next reader from connection",
+ "connection-next-reader-error",
+ "err", err,
+ )
+ return
+ }
+
+ writer, err := connFrom.NextWriter(messageType)
+ if err != nil {
+ g.Warning(
+ "Failed to get next reader from connection",
+ "connection-next-reader-error",
+ "err", err,
+ )
+ return
+ }
+
+
+ c := make(chan g.CopyResult)
+ go g.CopyData(c, "c2s", connTo, writer)
+ go g.CopyData(c, "s2c", reader, connTo)
+ go func() {
+ <- c
+ EmitActiveConnection.Dec()
+ }()
+ });
+
+ server := http.Server{}
+ err := server.Serve(listener)
+ g.FatalIf(err)
+}
+
+
+func Main() {
+ g.Init()
+ args := ParseArgs(os.Args)
+ listener := Listen(args.FromAddr)
+ Start(args.ToAddr, listener)
+}