diff --git a/admin_test.go b/admin_test.go index 04744f8c..0bf985f2 100644 --- a/admin_test.go +++ b/admin_test.go @@ -1,8 +1,8 @@ package beego import ( - "testing" "fmt" + "testing" ) func TestList_01(t *testing.T) { @@ -11,8 +11,8 @@ func TestList_01(t *testing.T) { t.Log(m) om := oldMap() for k, v := range om { - if fmt.Sprint(m[k])!= fmt.Sprint(v) { - t.Log(k, "old-key",v,"new-key", m[k]) + if fmt.Sprint(m[k]) != fmt.Sprint(v) { + t.Log(k, "old-key", v, "new-key", m[k]) t.FailNow() } } diff --git a/app.go b/app.go index 423a0a6b..32776298 100644 --- a/app.go +++ b/app.go @@ -148,7 +148,7 @@ func (app *App) Run() { BeeLogger.Info("Start https server error, confict with http.Please reset https port") return } - logs.Info("https server Running on %s", app.Server.Addr) + logs.Info("https server Running on https://%s", app.Server.Addr) if err := app.Server.ListenAndServeTLS(BConfig.Listen.HTTPSCertFile, BConfig.Listen.HTTPSKeyFile); err != nil { logs.Critical("ListenAndServeTLS: ", err) time.Sleep(100 * time.Microsecond) @@ -159,7 +159,7 @@ func (app *App) Run() { if BConfig.Listen.EnableHTTP { go func() { app.Server.Addr = addr - logs.Info("http server Running on %s", app.Server.Addr) + logs.Info("http server Running on http://%s", app.Server.Addr) if BConfig.Listen.ListenTCP4 { ln, err := net.Listen("tcp4", app.Server.Addr) if err != nil { diff --git a/config/ini.go b/config/ini.go index 53bd992d..9371fe61 100644 --- a/config/ini.go +++ b/config/ini.go @@ -86,11 +86,10 @@ func (ini *IniConfig) parseFile(name string) (*IniConfigContainer, error) { if _, ok := err.(*os.PathError); ok { return nil, err } + line = bytes.TrimSpace(line) if bytes.Equal(line, bEmpty) { continue } - line = bytes.TrimSpace(line) - var bComment []byte switch { case bytes.HasPrefix(line, bNumComment): diff --git a/config_test.go b/config_test.go index c9576afd..c1973f7b 100644 --- a/config_test.go +++ b/config_test.go @@ -117,8 +117,7 @@ func TestAssignConfig_03(t *testing.T) { ac.Set("StaticExtensionsToGzip", ".css,.js,.html,.jpg,.png") assignConfig(ac) - - t.Logf("%#v",BConfig) + t.Logf("%#v", BConfig) if BConfig.AppName != "test_app" { t.FailNow() diff --git a/error.go b/error.go index bad08d86..ce25d281 100644 --- a/error.go +++ b/error.go @@ -380,6 +380,11 @@ func ErrorController(c ControllerInterface) *App { return BeeApp } +// Exception Write HttpStatus with errCode and Exec error handler if exist. +func Exception(errCode uint64, ctx *context.Context) { + exception(strconv.FormatUint(errCode, 10), ctx) +} + // show error string as simple text message. // if error string is empty, show 503 or 500 error as default. func exception(errCode string, ctx *context.Context) { diff --git a/router.go b/router.go index 296100d9..d48e509a 100644 --- a/router.go +++ b/router.go @@ -603,6 +603,7 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request) findRouter bool runMethod string routerInfo *controllerInfo + isRunnable bool ) context := p.pool.Get().(*beecontext.Context) context.Reset(rw, r) @@ -666,136 +667,127 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request) goto Admin } - if !findRouter { - httpMethod := r.Method - if t, ok := p.routers[httpMethod]; ok { - runObject := t.Match(urlPath, context) - if r, ok := runObject.(*controllerInfo); ok { - routerInfo = r - findRouter = true - if splat := context.Input.Param(":splat"); splat != "" { - for k, v := range strings.Split(splat, "/") { - context.Input.SetParam(strconv.Itoa(k), v) - } - } - } - } - - } - + routerInfo, findRouter = p.FindRouter(context) //if no matches to url, throw a not found exception if !findRouter { exception("404", context) goto Admin } - - if findRouter { - //execute middleware filters - if len(p.filters[BeforeExec]) > 0 && p.execFilter(context, urlPath, BeforeExec) { - goto Admin - } - isRunnable := false - if routerInfo != nil { - if routerInfo.routerType == routerTypeRESTFul { - if _, ok := routerInfo.methods[r.Method]; ok { - isRunnable = true - routerInfo.runFunction(context) - } else { - exception("405", context) - goto Admin - } - } else if routerInfo.routerType == routerTypeHandler { - isRunnable = true - routerInfo.handler.ServeHTTP(rw, r) - } else { - runRouter = routerInfo.controllerType - method := r.Method - if r.Method == "POST" && context.Input.Query("_method") == "PUT" { - method = "PUT" - } - if r.Method == "POST" && context.Input.Query("_method") == "DELETE" { - method = "DELETE" - } - if m, ok := routerInfo.methods[method]; ok { - runMethod = m - } else if m, ok = routerInfo.methods["*"]; ok { - runMethod = m - } else { - runMethod = method - } - } - } - - // also defined runRouter & runMethod from filter - if !isRunnable { - //Invoke the request handler - vc := reflect.New(runRouter) - execController, ok := vc.Interface().(ControllerInterface) - if !ok { - panic("controller is not ControllerInterface") - } - - //call the controller init function - execController.Init(context, runRouter.Name(), runMethod, vc.Interface()) - - //call prepare function - execController.Prepare() - - //if XSRF is Enable then check cookie where there has any cookie in the request's cookie _csrf - if BConfig.WebConfig.EnableXSRF { - execController.XSRFToken() - if r.Method == "POST" || r.Method == "DELETE" || r.Method == "PUT" || - (r.Method == "POST" && (context.Input.Query("_method") == "DELETE" || context.Input.Query("_method") == "PUT")) { - execController.CheckXSRFCookie() - } - } - - execController.URLMapping() - - if !context.ResponseWriter.Started { - //exec main logic - switch runMethod { - case "GET": - execController.Get() - case "POST": - execController.Post() - case "DELETE": - execController.Delete() - case "PUT": - execController.Put() - case "HEAD": - execController.Head() - case "PATCH": - execController.Patch() - case "OPTIONS": - execController.Options() - default: - if !execController.HandlerFunc(runMethod) { - var in []reflect.Value - method := vc.MethodByName(runMethod) - method.Call(in) - } - } - - //render template - if !context.ResponseWriter.Started && context.Output.Status == 0 { - if BConfig.WebConfig.AutoRender { - if err := execController.Render(); err != nil { - logs.Error(err) - } - } - } - } - - // finish all runRouter. release resource - execController.Finish() - } - - //execute middleware filters - if len(p.filters[AfterExec]) > 0 && p.execFilter(context, urlPath, AfterExec) { - goto Admin + if splat := context.Input.Param(":splat"); splat != "" { + for k, v := range strings.Split(splat, "/") { + context.Input.SetParam(strconv.Itoa(k), v) } } + + //store router pattern into context + context.Input.SetData("RouterPattern", routerInfo.pattern) + + //execute middleware filters + if len(p.filters[BeforeExec]) > 0 && p.execFilter(context, urlPath, BeforeExec) { + goto Admin + } + + if routerInfo != nil { + if routerInfo.routerType == routerTypeRESTFul { + if _, ok := routerInfo.methods[r.Method]; ok { + isRunnable = true + routerInfo.runFunction(context) + } else { + exception("405", context) + goto Admin + } + } else if routerInfo.routerType == routerTypeHandler { + isRunnable = true + routerInfo.handler.ServeHTTP(rw, r) + } else { + runRouter = routerInfo.controllerType + method := r.Method + if r.Method == "POST" && context.Input.Query("_method") == "PUT" { + method = "PUT" + } + if r.Method == "POST" && context.Input.Query("_method") == "DELETE" { + method = "DELETE" + } + if m, ok := routerInfo.methods[method]; ok { + runMethod = m + } else if m, ok = routerInfo.methods["*"]; ok { + runMethod = m + } else { + runMethod = method + } + } + } + + // also defined runRouter & runMethod from filter + if !isRunnable { + //Invoke the request handler + vc := reflect.New(runRouter) + execController, ok := vc.Interface().(ControllerInterface) + if !ok { + panic("controller is not ControllerInterface") + } + + //call the controller init function + execController.Init(context, runRouter.Name(), runMethod, vc.Interface()) + + //call prepare function + execController.Prepare() + + //if XSRF is Enable then check cookie where there has any cookie in the request's cookie _csrf + if BConfig.WebConfig.EnableXSRF { + execController.XSRFToken() + if r.Method == "POST" || r.Method == "DELETE" || r.Method == "PUT" || + (r.Method == "POST" && (context.Input.Query("_method") == "DELETE" || context.Input.Query("_method") == "PUT")) { + execController.CheckXSRFCookie() + } + } + + execController.URLMapping() + + if !context.ResponseWriter.Started { + //exec main logic + switch runMethod { + case "GET": + execController.Get() + case "POST": + execController.Post() + case "DELETE": + execController.Delete() + case "PUT": + execController.Put() + case "HEAD": + execController.Head() + case "PATCH": + execController.Patch() + case "OPTIONS": + execController.Options() + default: + if !execController.HandlerFunc(runMethod) { + var in []reflect.Value + method := vc.MethodByName(runMethod) + method.Call(in) + } + } + + //render template + if !context.ResponseWriter.Started && context.Output.Status == 0 { + if BConfig.WebConfig.AutoRender { + if err := execController.Render(); err != nil { + logs.Error(err) + } + } + } + } + + // finish all runRouter. release resource + execController.Finish() + } + + //execute middleware filters + if len(p.filters[AfterExec]) > 0 && p.execFilter(context, urlPath, AfterExec) { + goto Admin + } + if len(p.filters[FinishRouter]) > 0 && p.execFilter(context, urlPath, FinishRouter) { goto Admin } @@ -851,6 +843,22 @@ Admin: } } +// FindRouter Find Router info for URL +func (p *ControllerRegister) FindRouter(context *beecontext.Context) (routerInfo *controllerInfo, isFind bool) { + var urlPath = context.Input.URL() + if !BConfig.RouterCaseSensitive { + urlPath = strings.ToLower(urlPath) + } + httpMethod := context.Input.Method() + if t, ok := p.routers[httpMethod]; ok { + runObject := t.Match(urlPath, context) + if r, ok := runObject.(*controllerInfo); ok { + return r, true + } + } + return +} + func (p *ControllerRegister) recoverPanic(context *beecontext.Context) { if err := recover(); err != nil { if err == ErrAbort {