From da01a0d119d21d99acf557345f0f6e534898d271 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Sun, 19 Oct 2025 17:48:13 -0400 Subject: [PATCH] internal/connshark: Add utility to log activity over a net.Conn --- internal/connshark/connshark.go | 56 +++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 internal/connshark/connshark.go diff --git a/internal/connshark/connshark.go b/internal/connshark/connshark.go new file mode 100644 index 0000000..3ec68e7 --- /dev/null +++ b/internal/connshark/connshark.go @@ -0,0 +1,56 @@ +package connshark + +import "os" +import "io" +import "fmt" +import "net" +import "log" +import "sync" +import "math/rand" +import tu "git.tebibyte.media/sashakoshka/hopp/internal/testutil" + +type insert struct { + net.Conn + output io.WriteCloser + lock sync.Mutex +} + +func LogDebugFile(underlying net.Conn) net.Conn { + file, err := os.Create(fmt.Sprintf("connshark-%08X.log", rand.Uint32())) + if err != nil { + log.Println("XXX COULD NOT OPEN DEBUG FILE! reason: ", err) + return underlying + } + return Log(underlying, file) +} + +func Log(underlying net.Conn, output io.WriteCloser) net.Conn { + return &insert { + Conn: underlying, + output: output, + } +} + +func (this *insert) Read(buffer []byte) (n int, err error) { + if n > 0 { + this.lock.Lock() + defer this.lock.Unlock() + fmt.Fprintf(this.output, "TX: %s\n", tu.HexBytes(buffer[:n])) + } + return n, err +} + +func (this *insert) Write(buffer []byte) (n int, err error) { + n, err = this.Conn.Write(buffer) + if n > 0 { + this.lock.Lock() + defer this.lock.Unlock() + fmt.Fprintf(this.output, "RX: %s\n", tu.HexBytes(buffer[:n])) + } + return n, err +} + +func (this *insert) Close() error { + this.output.Close() + return this.Conn.Close() +}