rest-api-prototype/internal/app/server.go
2022-03-11 18:08:03 +01:00

70 lines
1.7 KiB
Go

package app
import (
"bytes"
"encoding/json"
"io/ioutil"
"log"
"net/http"
"time"
def "git.pbiernat.dev/golang/rest-api-prototype/internal/app/definition"
"git.pbiernat.dev/golang/rest-api-prototype/internal/app/handler"
)
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() {
log.Println("Server listening on " + s.Addr)
if err := s.ListenAndServe(); err != nil {
log.Println(err)
}
}
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)
})
}