1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- package pairec
- import (
- "fmt"
- "io"
- "net/http"
- "runtime/debug"
- "strings"
- "gitlab.alibaba-inc.com/pai_biz_arch/pairec/log"
- )
- type ControllerInterface interface {
- Process(http.ResponseWriter, *http.Request)
- }
- type ControllerRegister struct {
- routeInfos map[string]*RouteInfo
- }
- func NewControllerRegister() *ControllerRegister {
- cr := &ControllerRegister{
- routeInfos: make(map[string]*RouteInfo),
- }
- return cr
- }
- func (c *ControllerRegister) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
- defer func() {
- if err := recover(); err != nil {
- stack := string(debug.Stack())
- log.Error(fmt.Sprintf("error=%v, stack=%s", err, strings.ReplaceAll(stack, "\n", "\t")))
- Error(rw, 500, "server error")
- }
- }()
- uri := req.RequestURI
- if index := strings.Index(req.RequestURI, "?"); index != -1 {
- uri = req.RequestURI[:index]
- }
- if info, exist := c.routeInfos[uri]; exist {
- if info.initialize != nil {
- c := info.initialize()
- c.Process(rw, req)
- } else if info.hf != nil {
- info.hf(rw, req)
- } else {
- // return 404
- Error(rw, 404, "controller not found")
- return
- }
- } else {
- // return 404
- Error(rw, 404, "url not found route info")
- return
- }
- }
- func (c *ControllerRegister) Register(routeInfo *RouteInfo) {
- c.routeInfos[routeInfo.pattern] = routeInfo
- }
- func Error(rw http.ResponseWriter, code int, msg string) {
- rw.WriteHeader(code)
- io.WriteString(rw, msg)
- }
|