yaxc/internal/server/server.go

86 lines
1.8 KiB
Go
Raw Normal View History

2021-03-24 23:11:23 +08:00
package server
import (
"errors"
"github.com/gofiber/fiber/v2"
"github.com/op/go-logging"
"github.com/patrickmn/go-cache"
"os"
"time"
)
var (
log = logging.MustGetLogger("example")
format = logging.MustStringFormatter(
`%{color}%{time:15:04:05.000} %{shortfunc} ▶ %{level:.4s} %{id:03x}%{color:reset} %{message}`,
)
)
func init() {
backend1 := logging.NewLogBackend(os.Stderr, "", 0)
backend2Formatter := logging.NewBackendFormatter(backend1, format)
logging.SetBackend(backend2Formatter)
}
type YAxCConfig struct {
// Address
BindAddress string // required
RedisAddress string // "" -> only use cache
// Timeout
DefaultTTL time.Duration // 0 -> infinite
MinTTL time.Duration // == MaxTTL -> cannot specify TTL
MaxTTL time.Duration // == MinTTL -> cannot specify TTL
// Other
MaxBodyLength int
}
type yAxCServer struct {
*YAxCConfig
App *fiber.App
Backend Backend
errBodyLen error
}
func NewServer(cfg *YAxCConfig) (s *yAxCServer) {
s = &yAxCServer{
YAxCConfig: cfg,
errBodyLen: errors.New("exceeded max body length"),
}
// backend
if s.RedisAddress == "" {
// use cache backend
s.Backend = &CacheBackend{
c: cache.New(s.DefaultTTL, s.DefaultTTL+time.Minute),
errCast: errors.New("not a string"),
}
} else {
// TODO: implement redis
}
if s.Backend == nil {
log.Critical("ERROR: No backend specified.")
os.Exit(1)
return
}
return
}
func (s *yAxCServer) Start() {
log.Info("Starting YAxC server on", s.BindAddress)
s.App = fiber.New()
// register routes
s.App.Get("/", func(ctx *fiber.Ctx) error {
return ctx.SendString(body)
})
s.App.Get("/:anywhere", s.handleGetAnywhere)
s.App.Post("/:anywhere", s.handlePostAnywhere)
if err := s.App.Listen(s.BindAddress); err != nil {
log.Critical(err)
}
}