70 lines
1.5 KiB
Go
70 lines
1.5 KiB
Go
package server
|
|
|
|
import (
|
|
"net/http"
|
|
"strings"
|
|
|
|
lib "git.sr.ht/~cco/go-scopes"
|
|
"git.sr.ht/~cco/go-scopes/core"
|
|
"git.sr.ht/~cco/go-scopes/core/message"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
type ServerState struct {
|
|
server *http.Server
|
|
}
|
|
|
|
func Start(ctx lib.Context) {
|
|
gin.SetMode(gin.ReleaseMode)
|
|
lib.GetCfg[*Cfg](ctx).BaseCfg.WithDoneHandler(HandleDone)
|
|
Serve(ctx)
|
|
lib.RunCtx(ctx, core.Listen)
|
|
}
|
|
|
|
func HandleDone(ctx lib.Context) bool {
|
|
lib.GetState[*ServerState](ctx).server.Shutdown(ctx)
|
|
return false
|
|
}
|
|
|
|
func Serve(ctx lib.Context) {
|
|
r := gin.New()
|
|
r.Use(gin.Recovery())
|
|
r.Use(Logger(ctx))
|
|
cfg := ctx.Config().(*Cfg)
|
|
for _, rcfg := range cfg.routes {
|
|
setRoute(ctx, rcfg, r)
|
|
}
|
|
srv := &http.Server{
|
|
Addr: ":8123",
|
|
Handler: r,
|
|
}
|
|
ctx.WithState(&ServerState{
|
|
server: srv,
|
|
})
|
|
lib.RunCtx(ctx, func(ctx lib.Context) {
|
|
srv.ListenAndServe()
|
|
})
|
|
}
|
|
|
|
func setRoute(ctx lib.Context, rcfg routeCfg, r *gin.Engine) {
|
|
switch spec := rcfg.spec.(type) {
|
|
case *fsSpec:
|
|
r.Static(rcfg.path, spec.docRoot)
|
|
case lib.Config:
|
|
r.Match(rcfg.methods, rcfg.path+"/*msg", func(c *gin.Context) {
|
|
handle(ctx, spec, c)
|
|
})
|
|
}
|
|
}
|
|
|
|
// scopes standard request (= message) handler implementation
|
|
|
|
func handle(ctx lib.Context, cfg lib.Config, gc *gin.Context) {
|
|
head := strings.Split(gc.Param("msg"), "/")[1:]
|
|
msg := message.New(head...)
|
|
//fmt.Printf("*** RCell called: msg: %+v, method: %s\n", msg, gc.Request.Method)
|
|
cctx := ctx.ChildContext(cfg)
|
|
core.HandleMessage(cctx, msg)
|
|
// cfg.Starter()(cctx)
|
|
gc.String(http.StatusOK, "Hello World")
|
|
}
|