Files
hsp.go/main.go

101 lines
2.2 KiB
Go

package main
import (
"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)
text, err := req.ExtractText()
if err != nil {
return hsp.NewStatusResponse(hsp.STATUS_INTERNALERR)
}
log.Println("Received text from req:", text)
return hsp.NewStatusResponse(hsp.STATUS_SUCCESS)
}
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 main() {
srv := server.NewServer("localhost:3000")
fmt.Printf("Server created on address: %s\n", srv.Addr)
handler := make(chan net.Conn, 1)
router := server.NewRouter()
router.AddRoute("/file-upload", FileUploadRoute)
router.AddRoute("/ping-pong", PingPongRoute)
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(2 * time.Second)
c := client.NewClient()
rsp, err := c.SendText("localhost:3000/ping-pong", "Hello, guys!")
if err != nil {
log.Fatalf("Failed to received response from ping-pong: %s\n", err)
}
log.Println("[CLIENT] received response from remote server:", rsp)
}()
if err := srv.Start(); err != nil {
log.Fatalln("Failed to start server")
}
}