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.
69 lines
1.4 KiB
69 lines
1.4 KiB
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) |
|
}
|
|
|