package router import ( "context" "fmt" "log" "net/http" "github.com/ajikamaludin/go-grpc_basic/configs" "github.com/ajikamaludin/go-grpc_basic/pkg/v1/utils/constants" "github.com/ajikamaludin/go-grpc_basic/pkg/v1/utils/errors" "github.com/ajikamaludin/go-grpc_basic/pkg/v1/utils/logger" "github.com/gorilla/handlers" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/sirupsen/logrus" "google.golang.org/grpc" "github.com/golang/protobuf/proto" authpb "github.com/ajikamaludin/go-grpc_basic/proto/v1/auth" hlpb "github.com/ajikamaludin/go-grpc_basic/proto/v1/health" ) func NewHTTPServer(configs *configs.Configs, loggger *logrus.Logger) error { // create custom http errors runtime.HTTPError = errors.CustomHTTPError ctx := context.Background() ctx, cancel := context.WithCancel(ctx) defer cancel() // Connect to the GRPC server conn, err := grpc.Dial(fmt.Sprintf("0.0.0.0:%v", configs.Config.Server.Grpc.Port), grpc.WithInsecure()) if err != nil { return err } defer conn.Close() // Create new grpc-gateway rmux := runtime.NewServeMux(runtime.WithForwardResponseOption(httpResponseModifier)) // register gateway endpoints for _, f := range []func(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error{ // register grpc service handler hlpb.RegisterHealthServiceHandler, authpb.RegisterAuthServiceHandler, } { if err = f(ctx, rmux, conn); err != nil { return err } } // create http server mux mux := http.NewServeMux() mux.Handle("/", rmux) // run swagger server if configs.Config.Env != constants.EnvProduction { CreateSwagger(mux) } // Where ORIGIN_ALLOWED is like `scheme://dns[:port]`, or `*` (insecure) headersOk := handlers.AllowedHeaders([]string{"Accept", "Accept-Language", "Content-Language", "Content-Type", "X-Requested-With", "Content-Length", "Accept-Encoding", "X-CSRF-Token", "Authorization", "Timezone-Offset"}) originsOk := handlers.AllowedOrigins([]string{"*"}) methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "OPTIONS"}) // running rest http server log.Println("[SERVER] REST HTTP server is ready") err = http.ListenAndServe(fmt.Sprintf("0.0.0.0:%v", configs.Config.Server.Rest.Port), handlers.CORS(headersOk, originsOk, methodsOk)(mux)) if err != nil { return err } return nil } // // CreateSwagger creates the swagger server serve mux. func CreateSwagger(gwmux *http.ServeMux) { // // register swagger service server gwmux.HandleFunc("/api/health/docs.json", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "swagger/docs.json") }) } func httpResponseModifier(ctx context.Context, w http.ResponseWriter, p proto.Message) error { // store response log err := logger.StoreRestResponse(ctx, w, p) if err != nil { return err } return nil }