From 40b986c8bea96fdef84259e54cbc5d8b99f2e41a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20=C5=A0ediv=C3=BD?= Date: Sat, 14 Nov 2020 18:16:25 +0100 Subject: [PATCH] use Chi Router instead of Chi Mux. --- internal/api/member/handler.go | 6 +- internal/api/room/handler.go | 6 +- internal/api/router.go | 6 +- internal/http/endpoint/endpoint.go | 101 ----------------------------- internal/http/endpoint/error.go | 17 ----- internal/http/manager.go | 18 ++--- internal/types/api.go | 2 +- 7 files changed, 13 insertions(+), 143 deletions(-) delete mode 100644 internal/http/endpoint/endpoint.go delete mode 100644 internal/http/endpoint/error.go diff --git a/internal/api/member/handler.go b/internal/api/member/handler.go index 0f921a85..6d35d38a 100644 --- a/internal/api/member/handler.go +++ b/internal/api/member/handler.go @@ -20,8 +20,6 @@ func New( } } -func (h *MemberHandler) Router() *chi.Mux { - r := chi.NewRouter() - - return r +func (h *MemberHandler) Route(r chi.Router) { + } diff --git a/internal/api/room/handler.go b/internal/api/room/handler.go index 159755cb..af9d327d 100644 --- a/internal/api/room/handler.go +++ b/internal/api/room/handler.go @@ -26,9 +26,7 @@ func New( } } -func (h *RoomHandler) Router() *chi.Mux { - r := chi.NewRouter() - +func (h *RoomHandler) Route(r chi.Router) { // TODO: Authorizaton. r.Route("/screen", func(r chi.Router) { r.Get("/", h.ScreenConfiguration) @@ -41,6 +39,4 @@ func (h *RoomHandler) Router() *chi.Mux { r.Get("/", h.ClipboardRead) r.Post("/", h.ClipboardWrite) }) - - return r } diff --git a/internal/api/router.go b/internal/api/router.go index 735dd64a..b96d3052 100644 --- a/internal/api/router.go +++ b/internal/api/router.go @@ -37,14 +37,14 @@ func New( } } -func (api *ApiManagerCtx) Mount(r *chi.Mux) { +func (api *ApiManagerCtx) Route(r chi.Router) { r.Use(api.Authenticate) memberHandler := member.New(api.sessions) - r.Mount("/member", memberHandler.Router()) + r.Route("/member", memberHandler.Route) roomHandler := room.New(api.sessions, api.desktop, api.capture) - r.Mount("/room", roomHandler.Router()) + r.Route("/room", roomHandler.Route) r.Get("/test", func(w http.ResponseWriter, r *http.Request) { session, _ := r.Context().Value(keySessionCtx).(types.Session) diff --git a/internal/http/endpoint/endpoint.go b/internal/http/endpoint/endpoint.go deleted file mode 100644 index 92a29424..00000000 --- a/internal/http/endpoint/endpoint.go +++ /dev/null @@ -1,101 +0,0 @@ -package endpoint - -import ( - "encoding/json" - "fmt" - "net/http" - "runtime/debug" - - "github.com/go-chi/chi/middleware" - "github.com/rs/zerolog/log" -) - -type ( - Endpoint func(http.ResponseWriter, *http.Request) error - - ErrResponse struct { - Status int `json:"status,omitempty"` - Err string `json:"error,omitempty"` - Message string `json:"message,omitempty"` - Details string `json:"details,omitempty"` - Code string `json:"code,omitempty"` - RequestID string `json:"request,omitempty"` - } -) - -func Handle(handler Endpoint) http.HandlerFunc { - fn := func(w http.ResponseWriter, r *http.Request) { - if err := handler(w, r); err != nil { - WriteError(w, r, err) - } - } - - return http.HandlerFunc(fn) -} - -var nonErrorsCodes = map[int]bool{ - 404: true, -} - -func errResponse(input interface{}) *ErrResponse { - var res *ErrResponse - var err interface{} - - //nolint - switch input.(type) { - case *HandlerError: - e := input.(*HandlerError) - res = &ErrResponse{ - Status: e.Status, - Err: http.StatusText(e.Status), - Message: e.Message, - } - err = e.Err - default: - res = &ErrResponse{ - Status: http.StatusInternalServerError, - Err: http.StatusText(http.StatusInternalServerError), - } - err = input - } - - if err != nil { - switch err.(type) { - case *error: - e := err.(error) - res.Details = e.Error() - default: - res.Details = fmt.Sprintf("%+v", err) - } - } - - return res -} - -func WriteError(w http.ResponseWriter, r *http.Request, err interface{}) { - hlog := log.With(). - Str("module", "http"). - Logger() - - res := errResponse(err) - - if reqID := middleware.GetReqID(r.Context()); reqID != "" { - res.RequestID = reqID - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(res.Status) - - if err := json.NewEncoder(w).Encode(res); err != nil { - hlog.Warn().Err(err).Msg("Failed writing json error response") - } - - if !nonErrorsCodes[res.Status] { - logEntry := middleware.GetLogEntry(r) - if logEntry != nil { - logEntry.Panic(err, debug.Stack()) - } else { - hlog.Error().Str("stack", string(debug.Stack())).Msgf("%+v", err) - } - } -} diff --git a/internal/http/endpoint/error.go b/internal/http/endpoint/error.go deleted file mode 100644 index c92000e3..00000000 --- a/internal/http/endpoint/error.go +++ /dev/null @@ -1,17 +0,0 @@ -package endpoint - -import "fmt" - -type HandlerError struct { - Status int - Message string - Err error -} - -func (e *HandlerError) Error() string { - if e.Err != nil { - return fmt.Sprintf("%s: %s", e.Message, e.Err.Error()) - } - - return e.Message -} diff --git a/internal/http/manager.go b/internal/http/manager.go index dd5dd37a..08d33eb6 100644 --- a/internal/http/manager.go +++ b/internal/http/manager.go @@ -2,7 +2,6 @@ package http import ( "context" - "fmt" "net/http" "os" @@ -13,7 +12,7 @@ import ( "demodesk/neko/internal/types" "demodesk/neko/internal/config" - "demodesk/neko/internal/http/endpoint" + "demodesk/neko/internal/utils" ) type HttpManagerCtx struct { @@ -31,13 +30,11 @@ func New(WebSocketManager types.WebSocketManager, ApiManager types.ApiManager, c router.Use(middleware.RequestID) // Create a request ID for each request router.Use(Logger) // Log API request calls using custom logger function - ApiManager.Mount(router) + router.Route("/api", ApiManager.Route) router.Get("/ws", func(w http.ResponseWriter, r *http.Request) { - if WebSocketManager.Upgrade(w, r) != nil { - //nolint - w.Write([]byte("unable to upgrade your connection to a websocket")) - } + //nolint + WebSocketManager.Upgrade(w, r) }) if conf.Static != "" { @@ -51,11 +48,8 @@ func New(WebSocketManager types.WebSocketManager, ApiManager types.ApiManager, c }) } - router.NotFound(endpoint.Handle(func(w http.ResponseWriter, r *http.Request) error { - return &endpoint.HandlerError{ - Status: http.StatusNotFound, - Message: fmt.Sprintf("Endpoint '%s' was not found.", r.RequestURI), - } + router.NotFound(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + utils.HttpNotFound(w) })) http := &http.Server{ diff --git a/internal/types/api.go b/internal/types/api.go index f0efae68..cd821453 100644 --- a/internal/types/api.go +++ b/internal/types/api.go @@ -5,5 +5,5 @@ import ( ) type ApiManager interface { - Mount(r *chi.Mux) + Route(r chi.Router) }