From fcf57b0455e894043eb5172a708d772bce37d367 Mon Sep 17 00:00:00 2001 From: LandaMm Date: Sat, 19 Apr 2025 12:39:05 +0200 Subject: [PATCH] feat: create test executable (cli in future) --- cmd/main.go | 169 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 cmd/main.go diff --git a/cmd/main.go b/cmd/main.go new file mode 100644 index 0000000..b3a34e9 --- /dev/null +++ b/cmd/main.go @@ -0,0 +1,169 @@ +package main + +import ( + "encoding/json" + "fmt" + "log" + "net" + "os" + "os/signal" + "syscall" + "time" + + "github.com/LandaMm/hsp-go/hsp" + "github.com/LandaMm/hsp-go/hsp/client" + "github.com/LandaMm/hsp-go/hsp/server" +) + +func PingPongRoute(req *hsp.Request) *hsp.Response { + log.Println("Ping pong request:", req.GetRawPacket()) + df, err := req.GetDataFormat() + if err != nil { + return hsp.NewErrorResponse(err) + } + + log.Println("Data format of the request:", df) + + text, err := req.ExtractText() + if err != nil { + return hsp.NewErrorResponse(err) + } + + log.Println("Received text from req:", text) + + // return hsp.NewStatusResponse(hsp.STATUS_SUCCESS) + res, err := hsp.NewJsonResponse(map[string]any{ + "success": true, + "message": text, + }) + + if err != nil { + return hsp.NewErrorResponse(err) + } + + return res +} + +func FileUploadRoute(req *hsp.Request) *hsp.Response { + log.Println("[MAIN] File Upload request:", req) + bytes, err := req.ExtractBytes() + if err != nil { + return hsp.NewStatusResponse(hsp.STATUS_INTERNALERR) + } + + filename := "received.bin" + err = os.WriteFile(filename, bytes, 0644) + if err != nil { + log.Fatalln("Failed to write packet payload into a file:", err) + return hsp.NewStatusResponse(hsp.STATUS_INTERNALERR) + } + + log.Println("Received new request from client:", req.Conn().RemoteAddr().String()) + + res := hsp.NewTextResponse("Hello, World!") + res.AddHeader("filename", filename) + + return res +} + +func JsonMockRoute(req *hsp.Request) *hsp.Response { + log.Println("[JSON MOCK] New request:", req.GetRawPacket()) + + var test map[string]any + + if err := req.ExtractJson(&test); err != nil { + return hsp.NewErrorResponse(err) + } + + log.Println("Json data from request:", test) + + res, err := hsp.NewJsonResponse(test) + if err != nil { + return hsp.NewErrorResponse(err) + } + + return res +} + +func main() { + addr, err := hsp.ParseAddress("127.0.0.1") + if err != nil { + panic(err) + } + srv := server.NewServer(*addr) + fmt.Printf("Server created on address: %s\n", srv.Addr.String()) + + handler := make(chan net.Conn, 1) + + router := server.NewRouter() + + router.AddRoute("/file-upload", FileUploadRoute) + router.AddRoute("/ping-pong", PingPongRoute) + router.AddRoute("/mock-json", JsonMockRoute) + + srv.SetListener(handler) + + go func() { + for { + conn := <-handler + if err := router.Handle(conn); err != nil { + log.Println("[MAIN] Error handling connection:", err.Error()) + } + } + }() + + sigs := make(chan os.Signal, 1) + + go func() { + s := <-sigs + if s == syscall.SIGINT || s == syscall.SIGTERM { + log.Println("Gracefully shutting down the server") + if err := srv.Stop(); err != nil { + log.Fatalln("Failed to close the server:", err) + } + } + }() + + signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) + + go func() { + time.Sleep(3 * time.Second) + c := client.NewClient() + rsp, err := c.SendText("localhost/ping-pong", "Hello, guys!") + if err != nil { + log.Fatalf("[CLIENT] Failed to received response from ping-pong: %s\n", err) + } + log.Println("[CLIENT] received response from remote server:", rsp) + bts, err := json.Marshal(rsp) + if err != nil { + log.Fatalln("[CLIENT] Failed to serialize response from server") + } + + log.Println("[CLIENT] Serialized response from server:", string(bts)) + }() + + go func() { + time.Sleep(1 * time.Second) + c := client.NewClient() + rsp, err := c.SendJson("localhost/mock-json", map[string]any{ + "mock": true, + "message": "Hello, everyone!", + }) + + if err != nil { + log.Fatalf("[CLIENT] Failed to received response from ping-pong: %s\n", err) + } + + log.Println("[CLIENT] received response from remote server:", rsp) + bts, err := json.Marshal(rsp) + if err != nil { + log.Fatalln("[CLIENT] Failed to serialize response from server") + } + + log.Println("[CLIENT] Serialized response from server:", string(bts)) + }() + + if err := srv.Start(); err != nil { + log.Fatalln("Failed to start server:", err) + } +}