From 8e03b6328aa838095c1c3f860a20fe8e3ce859fd Mon Sep 17 00:00:00 2001 From: ihor_ostapovych Date: Fri, 1 Jul 2022 10:24:48 +0300 Subject: [PATCH 1/2] feat: add controllers package with implementation --- cmd/muxing/muxing.go | 33 ++++++++++++-------- go.mod | 12 ++------ go.sum | 15 ++------- index.http | 14 +++++++++ internal/controllers/controllers.go | 48 +++++++++++++++++++++++++++++ 5 files changed, 86 insertions(+), 36 deletions(-) create mode 100644 index.http create mode 100644 internal/controllers/controllers.go diff --git a/cmd/muxing/muxing.go b/cmd/muxing/muxing.go index 5060f2c..12eec93 100644 --- a/cmd/muxing/muxing.go +++ b/cmd/muxing/muxing.go @@ -2,31 +2,38 @@ package main import ( "fmt" - "log" "net/http" "os" "strconv" - "github.com/gorilla/mux" + "github.com/GolangUnited/helloweb/internal/controllers" + "github.com/go-chi/chi/v5" + "github.com/go-chi/chi/v5/middleware" ) -/** -Please note Start functions is a placeholder for you to start your own solution. -Feel free to drop gorilla.mux if you want and use any other solution available. - -main function reads host/port from env just for an example, flavor it following your taste -*/ - // Start /** Starts the web server listener on given host and port. func Start(host string, port int) { - router := mux.NewRouter() + r := chi.NewRouter() + + setupMiddleware(r) - log.Println(fmt.Printf("Starting API server on %s:%d\n", host, port)) - if err := http.ListenAndServe(fmt.Sprintf("%s:%d", host, port), router); err != nil { - log.Fatal(err) + r.Get("/name/{PARAM}", controllers.NameHandler) + r.Get("/bad", controllers.BadHandler) + r.Post("/data", controllers.DataHandler) + r.Post("/headers", controllers.HeadersHandler) + + if err := http.ListenAndServe(fmt.Sprintf("%s:%d", host, port), r); err != nil { + panic(err) } } +func setupMiddleware(r *chi.Mux) { + r.Use(middleware.RequestID) + r.Use(middleware.RealIP) + r.Use(middleware.Logger) + r.Use(middleware.Recoverer) +} + //main /** starts program, gets HOST:PORT param and calls Start func. func main() { host := os.Getenv("HOST") diff --git a/go.mod b/go.mod index 1441140..2220e7a 100644 --- a/go.mod +++ b/go.mod @@ -2,14 +2,6 @@ module github.com/GolangUnited/helloweb go 1.17 -require ( - github.com/gorilla/mux v1.8.0 - github.com/pkg/errors v0.9.1 - github.com/stretchr/testify v1.7.0 -) +require github.com/gorilla/mux v1.8.0 -require ( - github.com/davecgh/go-spew v1.1.0 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect -) +require github.com/go-chi/chi/v5 v5.0.7 // indirect diff --git a/go.sum b/go.sum index 16eb4ec..b68a29f 100644 --- a/go.sum +++ b/go.sum @@ -1,15 +1,4 @@ -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-chi/chi/v5 v5.0.7 h1:rDTPXLDHGATaeHvVlLcR4Qe0zftYethFucbjVQ1PxU8= +github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/index.http b/index.http new file mode 100644 index 0000000..0dde96c --- /dev/null +++ b/index.http @@ -0,0 +1,14 @@ +GET http://localhost:8081/name/PARAM + +### +GET http://localhost:8081/bad + +### +POST http://localhost:8081/data + +PARAM + +### +POST http://localhost:8081/headers +a: 2 +b: 3 diff --git a/internal/controllers/controllers.go b/internal/controllers/controllers.go new file mode 100644 index 0000000..86f0e39 --- /dev/null +++ b/internal/controllers/controllers.go @@ -0,0 +1,48 @@ +package controllers + +import ( + "fmt" + "github.com/go-chi/chi/v5" + "io" + "net/http" + "strconv" +) + +func NameHandler(w http.ResponseWriter, r *http.Request) { + param := chi.URLParam(r, "PARAM") + _, err := w.Write([]byte(fmt.Sprintf("Hello, %v", param))) + if err != nil { + http.Error(w, http.StatusText(500), 500) + } +} + +func BadHandler(w http.ResponseWriter, r *http.Request) { + http.Error(w, http.StatusText(500), 500) +} + +func DataHandler(w http.ResponseWriter, r *http.Request) { + body, err := io.ReadAll(r.Body) + if err != nil { + http.Error(w, http.StatusText(500), 500) + } + _, err = w.Write([]byte(fmt.Sprintf("I got message:\n%v", string(body)))) + if err != nil { + http.Error(w, http.StatusText(500), 500) + } +} + +func HeadersHandler(w http.ResponseWriter, r *http.Request) { + h := r.Header + + a, err := strconv.Atoi(h.Get("a")) + if err != nil { + http.Error(w, http.StatusText(400), 400) + } + + b, err := strconv.Atoi(h.Get("b")) + if err != nil { + http.Error(w, http.StatusText(400), 400) + } + + w.Header().Add("a+b", strconv.Itoa(a+b)) +} From be04c71b92485c532ae18dfb798438bb60a9eacf Mon Sep 17 00:00:00 2001 From: ihor_ostapovych Date: Fri, 1 Jul 2022 10:27:31 +0300 Subject: [PATCH 2/2] chore: tidy mod --- go.mod | 4 +--- go.sum | 2 -- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 2220e7a..8de3fdb 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,4 @@ module github.com/GolangUnited/helloweb go 1.17 -require github.com/gorilla/mux v1.8.0 - -require github.com/go-chi/chi/v5 v5.0.7 // indirect +require github.com/go-chi/chi/v5 v5.0.7 diff --git a/go.sum b/go.sum index b68a29f..433d671 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,2 @@ github.com/go-chi/chi/v5 v5.0.7 h1:rDTPXLDHGATaeHvVlLcR4Qe0zftYethFucbjVQ1PxU8= github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=