You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
1.4 KiB
70 lines
1.4 KiB
11 months ago
|
package rest
|
||
|
|
||
|
import (
|
||
|
"git.diulo.com/mogfee/kit/rest/httpx"
|
||
|
"git.diulo.com/mogfee/kit/rest/internal/cors"
|
||
|
"git.diulo.com/mogfee/kit/rest/router"
|
||
|
"net/http"
|
||
|
)
|
||
|
|
||
|
type (
|
||
|
RunOption func(server *Server)
|
||
|
|
||
|
Server struct {
|
||
|
ngin *engine
|
||
|
router httpx.Router
|
||
|
}
|
||
|
)
|
||
|
|
||
|
func NewServer(c RestConf, opts ...RunOption) *Server {
|
||
|
srv := &Server{
|
||
|
ngin: newEngine(c),
|
||
|
router: router.NewRouter(),
|
||
|
}
|
||
|
for _, opt := range opts {
|
||
|
opt(srv)
|
||
|
}
|
||
|
return srv
|
||
|
}
|
||
|
func (s *Server) AddRoute(r Route, opts ...RouteOption) {
|
||
|
s.AddRoutes([]Route{r}, opts...)
|
||
|
}
|
||
|
func (s *Server) AddRoutes(rs []Route, opts ...RouteOption) {
|
||
|
r := featureRoutes{
|
||
|
routes: rs,
|
||
|
}
|
||
|
for _, opt := range opts {
|
||
|
opt(&r)
|
||
|
}
|
||
|
s.ngin.addRoutes(r)
|
||
|
}
|
||
|
func (s *Server) Start() error {
|
||
|
return s.ngin.start(s.router)
|
||
|
}
|
||
|
func (s *Server) Use(middleware ...Middleware) {
|
||
|
s.ngin.use(middleware...)
|
||
|
}
|
||
|
func WithCors(origin ...string) RunOption {
|
||
|
return func(server *Server) {
|
||
|
server.router.SetNotAllowedHandler(cors.NotAllowedHandler())
|
||
|
server.router = newCorsRouter(server.router, origin...)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
type corsRouter struct {
|
||
|
httpx.Router
|
||
|
middleware Middleware
|
||
|
}
|
||
|
|
||
|
func newCorsRouter(router httpx.Router, origin ...string) httpx.Router {
|
||
|
return &corsRouter{
|
||
|
Router: router,
|
||
|
middleware: cors.Middleware(func(w http.Header) {
|
||
|
}),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (c *corsRouter) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||
|
c.middleware(c.Router.ServeHTTP)(w, r)
|
||
|
}
|