diff options
author | EuAndreh <eu@euandre.org> | 2024-07-24 16:28:14 -0300 |
---|---|---|
committer | EuAndreh <eu@euandre.org> | 2024-07-25 06:19:32 -0300 |
commit | 1dae188a72b9b3bed93c1bd8fd95890e02e57b2a (patch) | |
tree | 345ef96f5e4b7233173d381737ae0d7bb0a3c738 /src/lib.go | |
parent | Initial empty commit (diff) | |
download | wscat-1dae188a72b9b3bed93c1bd8fd95890e02e57b2a.tar.gz wscat-1dae188a72b9b3bed93c1bd8fd95890e02e57b2a.tar.xz |
Initial implementation
Diffstat (limited to 'src/lib.go')
-rw-r--r-- | src/lib.go | 118 |
1 files changed, 118 insertions, 0 deletions
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) +} |