restis/main.go
Knut Ahlers 956122ef95
Add CORS header middleware
Signed-off-by: Knut Ahlers <knut@ahlers.me>
2022-12-27 18:31:46 +01:00

98 lines
2.6 KiB
Go

package main
import (
"fmt"
"net/http"
"os"
"time"
"github.com/go-redis/redis/v8"
"github.com/gorilla/mux"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"github.com/Luzifer/rconfig/v2"
)
var (
cfg = struct {
DisableCORS bool `flag:"disable-cors" default:"false" description:"Disable setting CORS headers for all requests"`
Listen string `flag:"listen" default:":3000" description:"Port/IP to listen on"`
LogLevel string `flag:"log-level" default:"info" description:"Log level (debug, info, warn, error, fatal)"`
RedisConnString string `flag:"redis-conn-string" default:"redis://localhost:6379/0" description:"Connection string for redis"`
RedisKeyPrefix string `flag:"redis-key-prefix" default:"" description:"Prefix to prepend to keys (will be prepended without delimiter!)"`
VersionAndExit bool `flag:"version" default:"false" description:"Prints current version and exits"`
}{}
version = "dev"
)
func initApp() error {
rconfig.AutoEnv(true)
if err := rconfig.ParseAndValidate(&cfg); err != nil {
return errors.Wrap(err, "parsing cli options")
}
if cfg.VersionAndExit {
fmt.Printf("git-changerelease %s\n", version)
os.Exit(0)
}
l, err := logrus.ParseLevel(cfg.LogLevel)
if err != nil {
return errors.Wrap(err, "parsing log-level")
}
logrus.SetLevel(l)
return nil
}
func main() {
var err error
if err = initApp(); err != nil {
logrus.WithError(err).Fatal("initializing app")
}
redisOpts, err := redis.ParseURL(cfg.RedisConnString)
if err != nil {
logrus.WithError(err).Fatal("parsing redis connection string")
}
var (
client = redis.NewClient(redisOpts)
router = mux.NewRouter()
)
if !cfg.DisableCORS {
router.Use(corsMiddleware)
}
router.MethodNotAllowedHandler = corsMiddleware(http.HandlerFunc(func(res http.ResponseWriter, r *http.Request) {
if r.Method == http.MethodOptions {
// Most likely JS client asking for CORS headers
res.WriteHeader(http.StatusNoContent)
return
}
res.WriteHeader(http.StatusMethodNotAllowed)
}))
router.Methods(http.MethodDelete).HandlerFunc(handlerDelete(client))
router.Methods(http.MethodGet).HandlerFunc(handlerGet(client))
router.Methods(http.MethodPut).HandlerFunc(handlerPut(client))
server := &http.Server{
Addr: cfg.Listen,
Handler: router,
ReadHeaderTimeout: time.Second,
}
logrus.WithFields(logrus.Fields{
"addr": cfg.Listen,
"version": version,
}).Info("starting HTTP server")
if err := server.ListenAndServe(); err != nil {
logrus.WithError(err).Fatal("HTTP server quit unexpectedly")
}
}