diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..62c8935 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea/ \ No newline at end of file diff --git a/bin/darwin/lambda-local b/bin/darwin/lambda-local index e14a628..7e30ae3 100755 Binary files a/bin/darwin/lambda-local and b/bin/darwin/lambda-local differ diff --git a/bin/linux/lambda-local b/bin/linux/lambda-local index 3f75239..55c89a9 100755 Binary files a/bin/linux/lambda-local and b/bin/linux/lambda-local differ diff --git a/cmd/start.go b/cmd/start.go index 5c0fc06..733f3b9 100644 --- a/cmd/start.go +++ b/cmd/start.go @@ -42,14 +42,5 @@ func ExecuteCmdStart(cmd *cobra.Command, args []string) { Network: Network, EnvironmentFile: Environment, } - ep := controller.EndpointsController{ - Host: Host, - Port: Port, - Yaml: Yaml, - } - se.StartConfig() - - ep.ListEndpoints() - se.StartServer() } diff --git a/controller/server.go b/controller/server.go index 4dcac67..6347d10 100644 --- a/controller/server.go +++ b/controller/server.go @@ -7,9 +7,9 @@ import ( "log" "net/http" "os" - "regexp" "strings" + "github.com/gorilla/mux" "github.com/lbernardo/lambda-local/lambda" "github.com/lbernardo/lambda-local/model" ) @@ -24,53 +24,6 @@ type Server struct { JSON model.Serverless } -var strReg = "{[a-z0-9A-Z-]+}" - -const varsKey int = iota - -func checkPath(event model.HttpEvent, reqPath string, method string) (bool, map[string]string) { - parameters := map[string]string{} - emethod := strings.ToUpper(event.Method) - - event.Path = strings.ReplaceAll("/"+event.Path, "//", "/") - - if emethod != method { - return false, parameters - } - - if event.Path == reqPath { - return true, parameters - } - - match, _ := regexp.MatchString(strReg, event.Path) - if match == true { - reg, _ := regexp.Compile(strReg) - - ep := reg.ReplaceAllString(event.Path, "[a-z0-9A-Z-]+") - p := strings.ReplaceAll(ep, "[a-z0-9A-Z-]+", "") - - match, _ = regexp.MatchString(ep, reqPath) - if match == true { - reg2, _ := regexp.Compile("[a-z0-9A-Z-]+") - params := reg.FindStringSubmatch(event.Path) - m := strings.ReplaceAll(reqPath, p, "") - values := reg2.FindStringSubmatch(m) - var value string - - for i, param := range params { - value = values[i] - param = strings.ReplaceAll(param, "{", "") - param = strings.ReplaceAll(param, "}", "") - parameters[param] = value - } - - return true, parameters - } - } - - return false, parameters -} - func (se *Server) ContentYaml() { content, err := ReadYaml(se.Yaml) if err != nil { @@ -82,7 +35,7 @@ func (se *Server) ContentYaml() { func (se *Server) ReadEnv() { se.JSON.Provider.Environment = make(map[string]string, 0) if se.EnvironmentFile != "" { - file, err := os.Open(".local.env") + file, err := os.Open(se.EnvironmentFile) if err != nil { log.Fatal(err) } @@ -100,37 +53,49 @@ func (se *Server) ReadEnv() { } } -func (se *Server) StartConfig() { - se.ContentYaml() +func (se *Server) executeHandler(handler string, ) { + +} + +func (se *Server) StartConfig() *mux.Router { lambda.PullImageDocker(se.JSON.Provider.Runtime) - http.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - se.ContentYaml() - se.ReadEnv() - for _, functions := range se.JSON.Functions { - check, parameters := checkPath(functions.Events[0].HttpEvent, r.URL.RequestURI(), r.Method) - if check { - result, off := lambda.ExecuteDockerLambda(se.Volume, se.Network, functions.Handler, se.JSON.Provider.Runtime, se.JSON.Provider.Environment, r.Body, parameters) - if result.StatusCode == 0 { - w.WriteHeader(400) - fmt.Println(off) - return - } - - for key, val := range result.Headers { - w.Header().Set(key, val) - } - w.WriteHeader(result.StatusCode) - w.Write([]byte(result.Body)) + route := mux.NewRouter() + + for _, functions := range se.JSON.Functions { + path := "/" + functions.Events[0].HttpEvent.Path + method := functions.Events[0].HttpEvent.Method + function := functions.Handler + + path = strings.ReplaceAll(path,"//","/") + + fmt.Printf("http://%v:%v%v [%v]\n\n", se.Host, se.Port, path, strings.ToUpper(method)) + fff := func(w http.ResponseWriter, r *http.Request) { + parameters := mux.Vars(r) + result, off := lambda.ExecuteDockerLambda(se.Volume, se.Network, function, se.JSON.Provider.Runtime, se.JSON.Provider.Environment, r.Body, parameters) + if result.StatusCode == 0 { + w.WriteHeader(400) + fmt.Println(off) return } + + for key, val := range result.Headers { + w.Header().Set(key, val) + } + w.WriteHeader(result.StatusCode) + w.Write([]byte(result.Body)) + return } - w.WriteHeader(404) - w.Write([]byte("404 Not found")) - })) + route.HandleFunc(path, fff).Methods(method) + } + + return route } func (se *Server) StartServer() { - fmt.Printf("Start server lambda %v:%v\n", se.Host, se.Port) - log.Fatal(http.ListenAndServe(se.Host+":"+se.Port, nil)) + se.ContentYaml() + se.ReadEnv() + + fmt.Printf("Start server API Gateway -> lambda %v:%v\n", se.Host, se.Port) + log.Fatal(http.ListenAndServe(se.Host+":"+se.Port, se.StartConfig())) } diff --git a/example/go/serverless.yml b/example/go/serverless.yml index 819f866..b93bbb3 100644 --- a/example/go/serverless.yml +++ b/example/go/serverless.yml @@ -12,11 +12,11 @@ functions: handler: bin/hello events: - http: - path: hello + path: hello/{id} method: get world: handler: bin/world events: - http: - path: world + path: /world method: get