63 lines
1.3 KiB
Go
63 lines
1.3 KiB
Go
package main
|
|
|
|
import (
|
|
"log"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/go-chi/chi/v5"
|
|
"github.com/go-chi/chi/v5/middleware"
|
|
)
|
|
|
|
type application struct {
|
|
config config
|
|
// logger
|
|
// db driver
|
|
}
|
|
|
|
type dbConfig struct {
|
|
dsn string // database connection string
|
|
}
|
|
|
|
type config struct {
|
|
addr string // 12 factor document
|
|
db dbConfig
|
|
}
|
|
|
|
// mount
|
|
func (app *application) mount() http.Handler {
|
|
r := chi.NewRouter()
|
|
|
|
// A good base middleware stack
|
|
r.Use(middleware.RequestID) // important for rate-limiting
|
|
r.Use(middleware.ClientIPFromRemoteAddr) // also important for rate-limiting, analytics and tracing
|
|
r.Use(middleware.Logger)
|
|
r.Use(middleware.Recoverer) // nice to recover from panics and crashes
|
|
|
|
// Set a timeout value on the request context (ctx), that will signal
|
|
// through ctx.Done() that the request has timed out and further
|
|
// processing should be stopped.
|
|
r.Use(middleware.Timeout(60 * time.Second))
|
|
|
|
r.Get("/health", func(w http.ResponseWriter, r *http.Request) {
|
|
w.Write([]byte("hey"))
|
|
})
|
|
|
|
return r
|
|
}
|
|
|
|
// run
|
|
func (app *application) run(h http.Handler) error {
|
|
srv := &http.Server{
|
|
Addr: app.config.addr,
|
|
Handler: h,
|
|
WriteTimeout: 30 * time.Second,
|
|
ReadTimeout: 10 * time.Second,
|
|
IdleTimeout: 60 * time.Second,
|
|
}
|
|
|
|
log.Printf("Starting server on %s\n", app.config.addr)
|
|
|
|
return srv.ListenAndServe()
|
|
}
|