package app import ( "bytes" "encoding/json" "io/ioutil" "log" "net" "net/http" "os" "strconv" "time" def "git.pbiernat.dev/egommerce/application/services/identity/internal/app/definition" "git.pbiernat.dev/egommerce/application/services/identity/internal/app/handler" ) const Name = "REST API Service" type Server struct { *http.Server } func NewServer(env *handler.Env) *Server { return &Server{ &http.Server{ Handler: SetupRouter(env), Addr: env.Addr, WriteTimeout: 15 * time.Second, ReadTimeout: 15 * time.Second, IdleTimeout: 60 * time.Second, }, } } func (s *Server) Start() { if os.Getenv("LISTEN_PID") == strconv.Itoa(os.Getpid()) { // systemd run f := os.NewFile(3, "from systemd") l, err := net.FileListener(f) if err != nil { log.Fatalln(err) } log.Println("Server listening on " + l.Addr().String()) s.Serve(l) } else { log.Println("Server listening on " + s.Addr) log.Fatalln(s.ListenAndServe()) } } func PrepareHeadersMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=utf-8") w.Header().Set("Connection", "keep-alive") w.Header().Set("Keep-Alive", "timeout=5") next.ServeHTTP(w, r) }) } func ValidateJsonBodyMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { buf, _ := ioutil.ReadAll(r.Body) r.Body = ioutil.NopCloser(bytes.NewReader(buf)) // rollack *Request to original state if len(buf) > 0 && !json.Valid(buf) { w.WriteHeader(http.StatusBadRequest) json.NewEncoder(w).Encode(def.Error("Unable to parse JSON: " + string(buf))) return } next.ServeHTTP(w, r) }) } func LoggingMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Println("Request: " + r.RequestURI + " remote: " + r.RemoteAddr + " via: " + r.UserAgent()) next.ServeHTTP(w, r) }) }