From a93e520c20d20f3446435371860b4c056f498c25 Mon Sep 17 00:00:00 2001 From: leofvo Date: Thu, 24 Oct 2024 14:37:22 +0200 Subject: [PATCH] refactor(server.go): improve code lisibility factorize repetitive blocks verify http method on openapi request --- internal/servers/server.go | 39 ++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/internal/servers/server.go b/internal/servers/server.go index 7f99f6a53..553102619 100644 --- a/internal/servers/server.go +++ b/internal/servers/server.go @@ -8,6 +8,7 @@ import ( "net" "net/http" "net/http/pprof" + "os" "time" "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging" @@ -308,28 +309,38 @@ func (s *Container) Run( // Create the gRPC gateway mux grpcMux := runtime.NewServeMux(muxOpts...) - if err = grpcV1.RegisterPermissionHandler(ctx, grpcMux, conn); err != nil { - return err - } - if err = grpcV1.RegisterSchemaHandler(ctx, grpcMux, conn); err != nil { - return err + handlers := []func(context.Context, *runtime.ServeMux, *grpc.ClientConn) error{ + grpcV1.RegisterPermissionHandler, + grpcV1.RegisterSchemaHandler, + grpcV1.RegisterDataHandler, + grpcV1.RegisterBundleHandler, + grpcV1.RegisterTenancyHandler, } - if err = grpcV1.RegisterDataHandler(ctx, grpcMux, conn); err != nil { - return err - } - if err = grpcV1.RegisterBundleHandler(ctx, grpcMux, conn); err != nil { - return err - } - if err = grpcV1.RegisterTenancyHandler(ctx, grpcMux, conn); err != nil { - return err + + for _, handler := range handlers { + if err = handler(ctx, grpcMux, conn); err != nil { + return fmt.Errorf("failed to register handler: %w", err) + } } // Create a new http.ServeMux for serving your OpenAPI file and gRPC gateway httpMux := http.NewServeMux() + const openAPIPath = "./docs/api-reference/openapi.json" if srv.HTTP.ExposeOpenAPI { httpMux.HandleFunc("/openapi.json", func(w http.ResponseWriter, r *http.Request) { - http.ServeFile(w, r, "./docs/api-reference/openapi.json") + if r.Method != http.MethodGet { + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + return + } + w.Header().Set("Content-Type", "application/json") + w.Header().Set("Cache-Control", "public, max-age=3600") + if _, err := os.Stat(openAPIPath); os.IsNotExist(err) { + http.Error(w, "OpenAPI specification not found", http.StatusNotFound) + return + } + + http.ServeFile(w, r, openAPIPath) }) }