diff --git a/server/go.mod b/server/go.mod index 2b032e9..8da0262 100644 --- a/server/go.mod +++ b/server/go.mod @@ -3,12 +3,13 @@ module svitan.dev/keys/server go 1.24.1 require ( + github.com/gorilla/websocket v1.5.3 + github.com/joho/godotenv v1.5.1 github.com/labstack/echo/v4 v4.13.3 github.com/labstack/gommon v0.4.2 ) require ( - github.com/joho/godotenv v1.5.1 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect diff --git a/server/go.sum b/server/go.sum index f75a767..f17e4af 100644 --- a/server/go.sum +++ b/server/go.sum @@ -1,5 +1,7 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/labstack/echo/v4 v4.13.3 h1:pwhpCPrTl5qry5HRdM5FwdXnhXSLSY+WE+YQSeCaafY= diff --git a/server/main.go b/server/main.go index 949bc6a..b5290db 100644 --- a/server/main.go +++ b/server/main.go @@ -8,11 +8,11 @@ import ( "syscall" "time" + "github.com/gorilla/websocket" "github.com/joho/godotenv" "github.com/labstack/echo/v4" "github.com/labstack/echo/v4/middleware" "github.com/labstack/gommon/log" - "golang.org/x/net/websocket" ) const TimeFormat = "2006-01-02 15:04:05" @@ -27,6 +27,7 @@ var id = 0 var clients = []*Client{} var keyDir = "." var token = "" +var upgrader = websocket.Upgrader{} type ReqData struct { ID int `json:"id"` @@ -90,7 +91,7 @@ func main() { app.GET("/", func(c echo.Context) error { return c.JSON(http.StatusOK, "Hello World!") }) - app.GET("/key", key) + app.GET("/keys", keys) app.GET("/clients", func(c echo.Context) error { if c.Request().Header.Get("Authorization") != token { @@ -130,63 +131,67 @@ func main() { log.Fatal(app.Start(":8080")) } -func key(c echo.Context) error { - websocket.Handler(func(ws *websocket.Conn) { - client := Client{ - ID: id, - conn: ws, - Exit: false, - } - clients = append(clients, &client) - id += 1 - fmt.Printf("%s client %-3d connected", time.Now().Format(TimeFormat), client.ID) +func keys(c echo.Context) error { + ws, err := upgrader.Upgrade(c.Response(), c.Request(), nil) + if err != nil { + return err - defer ws.Close() - err := websocket.Message.Send(ws, "welcome") - if err != nil { - log.Error(err) - } + } + defer ws.Close() - f, err := os.OpenFile(fmt.Sprintf("%s/%s_%d.txt", keyDir, time.Now().Format("2006-01-02_15-04"), client.ID), syscall.O_CREAT|syscall.O_APPEND|syscall.O_WRONLY, 0644) - if err != nil { - log.Error(err) - fmt.Printf("%s client %-3d crashed (couldn't open file)", time.Now().Format(TimeFormat), client.ID) - client.Exit = true - return - } + client := Client{ + ID: id, + conn: ws, + Exit: false, + } + clients = append(clients, &client) + id += 1 + fmt.Printf("%s client %-3d connected", time.Now().Format(TimeFormat), client.ID) - for { - if client.Exit { - _ = websocket.Message.Send(ws, "exit") - _ = ws.Close() - break - } + err = ws.WriteMessage(websocket.TextMessage, []byte("welcome")) + if err != nil { + log.Error(err) + } - msg := "" - err = websocket.Message.Receive(ws, &msg) - if err != nil { - log.Error(err) - _ = websocket.Message.Send(ws, "exit") - _ = ws.Close() - fmt.Printf("%s client %-3d crashed (websocket error)", time.Now().Format(TimeFormat), client.ID) - client.Exit = true - break - } - - _, err = f.WriteString(msg) - if err != nil { - log.Error(err) - _ = websocket.Message.Send(ws, "exit") - _ = ws.Close() - fmt.Printf("%s client %-3d crashed (file write error)", time.Now().Format(TimeFormat), client.ID) - client.Exit = true - break - } - } - - fmt.Printf("%s client %-3d disconnected", time.Now().Format(TimeFormat), client.ID) + f, err := os.OpenFile(fmt.Sprintf("%s/%s_%d.txt", keyDir, time.Now().Format("2006-01-02_15-04"), client.ID), syscall.O_CREAT|syscall.O_APPEND|syscall.O_WRONLY, 0644) + if err != nil { + log.Error(err) + fmt.Printf("%s client %-3d crashed (couldn't open file)", time.Now().Format(TimeFormat), client.ID) client.Exit = true - }).ServeHTTP(c.Response(), c.Request()) + return c.NoContent(http.StatusInternalServerError) + } + defer f.Close() - return nil + for { + if client.Exit { + _ = ws.WriteMessage(websocket.TextMessage, []byte("exit")) + _ = ws.Close() + fmt.Printf("%s client %-3d disconnected", time.Now().Format(TimeFormat), client.ID) + client.Exit = true + break + } + + _, msg, err := ws.ReadMessage() + if err != nil { + log.Error(err) + _ = ws.WriteMessage(websocket.TextMessage, []byte("exit")) + _ = ws.Close() + fmt.Printf("%s client %-3d crashed (websocket error)", time.Now().Format(TimeFormat), client.ID) + client.Exit = true + break + } + + _, err = f.Write(msg) + if err != nil { + log.Error(err) + _ = ws.WriteMessage(websocket.TextMessage, []byte("exit")) + _ = ws.Close() + fmt.Printf("%s client %-3d crashed (file write error)", time.Now().Format(TimeFormat), client.ID) + client.Exit = true + break + } + + } + + return c.NoContent(http.StatusOK) }