From 7f37da209139281f83339b6a263b01eaed3d31b9 Mon Sep 17 00:00:00 2001 From: EnumDev Date: Sun, 9 Nov 2025 19:33:32 +0200 Subject: [PATCH] Allow reading data of any size through socket --- src/ectl/main.go | 84 +++++++++++++++++++++++----------------------- src/esvm/socket.go | 34 ++++++++++++++----- 2 files changed, 68 insertions(+), 50 deletions(-) diff --git a/src/ectl/main.go b/src/ectl/main.go index 80cbe2c..1b99460 100644 --- a/src/ectl/main.go +++ b/src/ectl/main.go @@ -1,6 +1,7 @@ package main import ( + "bytes" "encoding/json" "flag" "fmt" @@ -80,24 +81,22 @@ func main() { log.Fatalf("Could not write JSON data to socket! Error: %s\n", err) } - // Create a buffer for incoming data. - buf := make([]byte, 4096) - // Read data from the connection. - n, err := conn.Read(buf) + data, err := readAllConn(conn) if err != nil { + log.Fatalf("Could not read data from socket! Error: %s\n", err) return } // Print json data if flag is set if *printJson { - fmt.Println(string(buf[:n])) + fmt.Println(string(data)) return } // Decoode JSON data var returnedJsonData map[string]any - err = json.Unmarshal(buf[:n], &returnedJsonData) + err = json.Unmarshal(data, &returnedJsonData) if err != nil { log.Fatalf("Could not decode JSON data from connection!") } @@ -138,27 +137,22 @@ func main() { log.Fatalf("Could not write JSON data to socket! Error: %s\n", err) } - // Create a buffer for incoming data. - buf := make([]byte, 4096) - // Read data from the connection. - n, err := conn.Read(buf) - if err == io.EOF { - return - } + data, err := readAllConn(conn) if err != nil { + log.Fatalf("Could not read data from socket! Error: %s\n", err) return } // Print json data if flag is set if *printJson { - fmt.Println(string(buf[:n])) + fmt.Println(string(data)) return } // Decoode JSON data var returnedJsonData map[string]any - err = json.Unmarshal(buf[:n], &returnedJsonData) + err = json.Unmarshal(data, &returnedJsonData) if err != nil { log.Fatalf("Could not decode JSON data from connection!") } @@ -214,27 +208,22 @@ func main() { log.Fatalf("Could not write JSON data to socket! Error: %s\n", err) } - // Create a buffer for incoming data. - buf := make([]byte, 4096) - // Read data from the connection. - n, err := conn.Read(buf) - if err == io.EOF { - return - } + data, err := readAllConn(conn) if err != nil { + log.Fatalf("Could not read data from socket! Error: %s\n", err) return } // Print json data if flag is set if *printJson { - fmt.Println(string(buf[:n])) + fmt.Println(string(data)) return } // Decoode JSON data var returnedJsonData map[string]any - err = json.Unmarshal(buf[:n], &returnedJsonData) + err = json.Unmarshal(data, &returnedJsonData) if err != nil { log.Fatalf("Could not decode JSON data from connection!") } @@ -275,27 +264,22 @@ func main() { log.Fatalf("Could not write JSON data to socket! Error: %s\n", err) } - // Create a buffer for incoming data. - buf := make([]byte, 4096) - // Read data from the connection. - n, err := conn.Read(buf) - if err == io.EOF { - return - } + data, err := readAllConn(conn) if err != nil { + log.Fatalf("Could not read data from socket! Error: %s\n", err) return } // Print json data if flag is set if *printJson { - fmt.Println(string(buf[:n])) + fmt.Println(string(data)) return } // Decoode JSON data var returnedJsonData map[string]any - err = json.Unmarshal(buf[:n], &returnedJsonData) + err = json.Unmarshal(data, &returnedJsonData) if err != nil { log.Fatalf("Could not decode JSON data from connection!") } @@ -342,27 +326,22 @@ func main() { log.Fatalf("Could not write JSON data to socket! Error: %s\n", err) } - // Create a buffer for incoming data. - buf := make([]byte, 4096) - // Read data from the connection. - n, err := conn.Read(buf) - if err == io.EOF { - return - } + data, err := readAllConn(conn) if err != nil { + log.Fatalf("Could not read data from socket! Error: %s\n", err) return } // Print json data if flag is set if *printJson { - fmt.Println(string(buf[:n])) + fmt.Println(string(data)) return } // Decoode JSON data var returnedJsonData map[string]any - err = json.Unmarshal(buf[:n], &returnedJsonData) + err = json.Unmarshal(data, &returnedJsonData) if err != nil { log.Fatalf("Could not decode JSON data from connection!") } @@ -430,3 +409,24 @@ func dialSocket() { log.Fatalf("Failed to set write deadline! Error: %s\n", err) } } + +func readAllConn(conn net.Conn) ([]byte, error) { + var buf bytes.Buffer + + for { + dataChunk := make([]byte, 1024) + + n, err := conn.Read(dataChunk) + if err != nil && err != io.EOF { + return nil, err + } + + buf.Write(dataChunk[:n]) + + if n < 1024 { + break + } + } + + return buf.Bytes(), nil +} diff --git a/src/esvm/socket.go b/src/esvm/socket.go index 0ddd5f4..ed222d5 100644 --- a/src/esvm/socket.go +++ b/src/esvm/socket.go @@ -1,6 +1,7 @@ package main import ( + "bytes" "encoding/json" "fmt" "io" @@ -32,27 +33,23 @@ func listenToSocket() { conn, err := socket.Accept() if err != nil { logger.Println("Could not accept socket connection!") - panic(err) + return } // Handle the connection in a separate goroutine. go func(conn net.Conn) { defer conn.Close() - // Create a buffer for incoming data. - buf := make([]byte, 4096) // Read data from the connection. - n, err := conn.Read(buf) - if err == io.EOF { - return - } + data, err := readAllConn(conn) if err != nil { + logger.Fatalf("Could not read data from socket! Error: %s\n", err) return } // Decoode JSON data var jsonData map[string]any - err = json.Unmarshal(buf[:n], &jsonData) + err = json.Unmarshal(data, &jsonData) if err != nil { conn.Write(wrapErrorInJson(fmt.Errorf("Invalid JSON"))) return @@ -303,3 +300,24 @@ func wrapSuccessMsgInJson(msg string) []byte { } return jsonData } + +func readAllConn(conn net.Conn) ([]byte, error) { + var buf bytes.Buffer + + for { + dataChunk := make([]byte, 1024) + + n, err := conn.Read(dataChunk) + if err != nil && err != io.EOF { + return nil, err + } + + buf.Write(dataChunk[:n]) + + if n < 1024 { + break + } + } + + return buf.Bytes(), nil +}