From 3e96b235514e83747979878d60349a953651b104 Mon Sep 17 00:00:00 2001 From: Deng Ming Date: Sun, 4 Jun 2023 14:26:53 +0800 Subject: [PATCH] httplib: fix unstable test, do not use httplib.org --- CHANGELOG.md | 1 + README.md | 2 + adapter/admin.go | 7 +- adapter/app.go | 118 ++++--- adapter/cache/cache.go | 6 +- adapter/cache/memcache/memcache.go | 9 +- adapter/cache/redis/redis.go | 9 +- adapter/config/config.go | 41 +-- adapter/config/env/env_test.go | 2 +- adapter/config/xml/xml.go | 10 +- adapter/config/yaml/yaml.go | 10 +- adapter/context/context.go | 1 - adapter/controller.go | 42 +-- adapter/error.go | 6 +- adapter/grace/grace.go | 36 +- adapter/httplib/httplib.go | 7 +- adapter/logs/log.go | 1 - adapter/namespace.go | 53 +-- adapter/orm/orm.go | 6 +- adapter/orm/types.go | 5 +- adapter/plugins/apiauth/apiauth.go | 8 +- adapter/plugins/auth/basic.go | 2 +- adapter/plugins/authz/authz.go | 2 +- adapter/plugins/cors/cors.go | 4 +- adapter/router.go | 75 +++-- adapter/session/couchbase/sess_couchbase.go | 7 +- adapter/session/memcache/sess_memcache.go | 7 +- adapter/session/mysql/sess_mysql.go | 8 +- adapter/session/postgres/sess_postgresql.go | 9 +- adapter/session/redis/sess_redis.go | 15 +- .../session/redis_cluster/redis_cluster.go | 7 +- .../redis_sentinel/sess_redis_sentinel.go | 6 +- adapter/session/sess_cookie.go | 11 +- adapter/session/session.go | 13 +- adapter/templatefunc.go | 39 +-- adapter/toolbox/healthcheck.go | 15 +- adapter/toolbox/task.go | 11 +- adapter/utils/captcha/captcha.go | 45 +-- adapter/utils/pagination/doc.go | 74 ++--- adapter/utils/pagination/paginator.go | 10 +- adapter/validation/util.go | 16 +- adapter/validation/validation.go | 1 - adapter/validation/validators.go | 41 +-- client/cache/bloom_filter_cache_test.go | 3 +- client/cache/cache.go | 6 +- client/cache/memcache/memcache.go | 9 +- client/cache/redis/redis.go | 9 +- client/httplib/httpclient.go | 5 +- client/httplib/httpclient_test.go | 272 +++++++++------ client/httplib/httplib.go | 11 +- client/httplib/httplib_test.go | 310 +++++++++++------- client/orm/mock/mock_orm.go | 6 +- client/orm/orm.go | 6 +- client/orm/orm_querym2m.go | 7 +- client/orm/orm_queryset.go | 30 +- client/orm/orm_raw.go | 18 +- client/orm/types.go | 61 ++-- core/admin/healthcheck.go | 15 +- core/config/config.go | 41 +-- core/config/env/env_test.go | 2 +- core/config/xml/xml.go | 13 +- core/config/yaml/yaml.go | 10 +- core/logs/file.go | 19 +- core/logs/smtp.go | 1 + core/utils/pagination/doc.go | 74 ++--- core/utils/pagination/paginator.go | 10 +- core/validation/util.go | 16 +- core/validation/validation.go | 1 - core/validation/validators.go | 41 +-- server/web/admin.go | 7 +- server/web/captcha/captcha.go | 45 +-- server/web/context/context.go | 1 - server/web/controller.go | 42 +-- server/web/doc.go | 1 - server/web/error.go | 6 +- server/web/filter.go | 4 +- server/web/filter/apiauth/apiauth.go | 8 +- server/web/filter/auth/basic.go | 2 +- server/web/filter/authz/authz.go | 2 +- server/web/filter/cors/cors.go | 4 +- server/web/grace/grace.go | 36 +- server/web/namespace.go | 53 +-- server/web/session/session.go | 13 +- server/web/templatefunc.go | 39 +-- task/task.go | 14 +- test/bindata.go | 12 +- 86 files changed, 1166 insertions(+), 917 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e11a696..d0ec860d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,5 @@ # developing +- [httplib: fix unstable unit test which use the httplib.org](https://github.com/beego/beego/pull/5232) # v2.1.0 - [unified gopkg.in/yaml version to v2](https://github.com/beego/beego/pull/5169) diff --git a/README.md b/README.md index 1d22455b..36480f82 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,8 @@ Beego is composed of four parts: **Please use RELEASE version, or master branch which contains the latest bug fix** +**We will remove the adapter package in v2.2.0 which will be released in Aug 2023** + ## Quick Start [Old Doc - github](https://github.com/beego/beedoc) diff --git a/adapter/admin.go b/adapter/admin.go index 527cb201..260bd947 100644 --- a/adapter/admin.go +++ b/adapter/admin.go @@ -24,7 +24,8 @@ import ( // FilterMonitorFunc is default monitor filter when admin module is enable. // if this func returns, admin module records qps for this request by condition of this function logic. // usage: -// func MyFilterMonitor(method, requestPath string, t time.Duration, pattern string, statusCode int) bool { +// +// func MyFilterMonitor(method, requestPath string, t time.Duration, pattern string, statusCode int) bool { // if method == "POST" { // return false // } @@ -35,8 +36,8 @@ import ( // return false // } // return true -// } -// beego.FilterMonitorFunc = MyFilterMonitor. +// } +// beego.FilterMonitorFunc = MyFilterMonitor. var FilterMonitorFunc func(string, string, time.Duration, string, int) bool // PrintTree prints all registered routers. diff --git a/adapter/app.go b/adapter/app.go index aaf85a17..61c7519c 100644 --- a/adapter/app.go +++ b/adapter/app.go @@ -58,19 +58,20 @@ func oldMiddlewareToNew(mws []MiddleWare) []web.MiddleWare { // Router adds a patterned controller handler to BeeApp. // it's an alias method of HttpServer.Router. // usage: -// simple router -// beego.Router("/admin", &admin.UserController{}) -// beego.Router("/admin/index", &admin.ArticleController{}) // -// regex router +// simple router +// beego.Router("/admin", &admin.UserController{}) +// beego.Router("/admin/index", &admin.ArticleController{}) // -// beego.Router("/api/:id([0-9]+)", &controllers.RController{}) +// regex router // -// custom rules -// beego.Router("/api/list",&RestController{},"*:ListFood") -// beego.Router("/api/create",&RestController{},"post:CreateFood") -// beego.Router("/api/update",&RestController{},"put:UpdateFood") -// beego.Router("/api/delete",&RestController{},"delete:DeleteFood") +// beego.Router("/api/:id([0-9]+)", &controllers.RController{}) +// +// custom rules +// beego.Router("/api/list",&RestController{},"*:ListFood") +// beego.Router("/api/create",&RestController{},"post:CreateFood") +// beego.Router("/api/update",&RestController{},"put:UpdateFood") +// beego.Router("/api/delete",&RestController{},"delete:DeleteFood") func Router(rootpath string, c ControllerInterface, mappingMethods ...string) *App { return (*App)(web.Router(rootpath, c, mappingMethods...)) } @@ -82,8 +83,9 @@ func Router(rootpath string, c ControllerInterface, mappingMethods ...string) *A // method type (e.g. "GET" or "POST") for selective removal. // // Usage (replace "GET" with "*" for all methods): -// beego.UnregisterFixedRoute("/yourpreviouspath", "GET") -// beego.Router("/yourpreviouspath", yourControllerAddress, "get:GetNewPage") +// +// beego.UnregisterFixedRoute("/yourpreviouspath", "GET") +// beego.Router("/yourpreviouspath", yourControllerAddress, "get:GetNewPage") func UnregisterFixedRoute(fixedRoute string, method string) *App { return (*App)(web.UnregisterFixedRoute(fixedRoute, method)) } @@ -91,26 +93,29 @@ func UnregisterFixedRoute(fixedRoute string, method string) *App { // Include will generate router file in the router/xxx.go from the controller's comments // usage: // beego.Include(&BankAccount{}, &OrderController{},&RefundController{},&ReceiptController{}) -// type BankAccount struct{ -// beego.Controller -// } +// +// type BankAccount struct{ +// beego.Controller +// } // // register the function -// func (b *BankAccount)Mapping(){ -// b.Mapping("ShowAccount" , b.ShowAccount) -// b.Mapping("ModifyAccount", b.ModifyAccount) -// } +// +// func (b *BankAccount)Mapping(){ +// b.Mapping("ShowAccount" , b.ShowAccount) +// b.Mapping("ModifyAccount", b.ModifyAccount) +// } // // //@router /account/:id [get] -// func (b *BankAccount) ShowAccount(){ -// //logic -// } // +// func (b *BankAccount) ShowAccount(){ +// //logic +// } // // //@router /account/:id [post] -// func (b *BankAccount) ModifyAccount(){ -// //logic -// } +// +// func (b *BankAccount) ModifyAccount(){ +// //logic +// } // // the comments @router url methodlist // url support all the function Router's pattern @@ -153,9 +158,10 @@ func AutoPrefix(prefix string, c ControllerInterface) *App { // Get used to register router for Get method // usage: -// beego.Get("/", func(ctx *context.Context){ -// ctx.Output.Body("hello world") -// }) +// +// beego.Get("/", func(ctx *context.Context){ +// ctx.Output.Body("hello world") +// }) func Get(rootpath string, f FilterFunc) *App { return (*App)(web.Get(rootpath, func(ctx *context.Context) { f((*context2.Context)(ctx)) @@ -164,9 +170,10 @@ func Get(rootpath string, f FilterFunc) *App { // Post used to register router for Post method // usage: -// beego.Post("/api", func(ctx *context.Context){ -// ctx.Output.Body("hello world") -// }) +// +// beego.Post("/api", func(ctx *context.Context){ +// ctx.Output.Body("hello world") +// }) func Post(rootpath string, f FilterFunc) *App { return (*App)(web.Post(rootpath, func(ctx *context.Context) { f((*context2.Context)(ctx)) @@ -175,9 +182,10 @@ func Post(rootpath string, f FilterFunc) *App { // Delete used to register router for Delete method // usage: -// beego.Delete("/api", func(ctx *context.Context){ -// ctx.Output.Body("hello world") -// }) +// +// beego.Delete("/api", func(ctx *context.Context){ +// ctx.Output.Body("hello world") +// }) func Delete(rootpath string, f FilterFunc) *App { return (*App)(web.Delete(rootpath, func(ctx *context.Context) { f((*context2.Context)(ctx)) @@ -186,9 +194,10 @@ func Delete(rootpath string, f FilterFunc) *App { // Put used to register router for Put method // usage: -// beego.Put("/api", func(ctx *context.Context){ -// ctx.Output.Body("hello world") -// }) +// +// beego.Put("/api", func(ctx *context.Context){ +// ctx.Output.Body("hello world") +// }) func Put(rootpath string, f FilterFunc) *App { return (*App)(web.Put(rootpath, func(ctx *context.Context) { f((*context2.Context)(ctx)) @@ -197,9 +206,10 @@ func Put(rootpath string, f FilterFunc) *App { // Head used to register router for Head method // usage: -// beego.Head("/api", func(ctx *context.Context){ -// ctx.Output.Body("hello world") -// }) +// +// beego.Head("/api", func(ctx *context.Context){ +// ctx.Output.Body("hello world") +// }) func Head(rootpath string, f FilterFunc) *App { return (*App)(web.Head(rootpath, func(ctx *context.Context) { f((*context2.Context)(ctx)) @@ -208,9 +218,10 @@ func Head(rootpath string, f FilterFunc) *App { // Options used to register router for Options method // usage: -// beego.Options("/api", func(ctx *context.Context){ -// ctx.Output.Body("hello world") -// }) +// +// beego.Options("/api", func(ctx *context.Context){ +// ctx.Output.Body("hello world") +// }) func Options(rootpath string, f FilterFunc) *App { return (*App)(web.Options(rootpath, func(ctx *context.Context) { f((*context2.Context)(ctx)) @@ -219,9 +230,10 @@ func Options(rootpath string, f FilterFunc) *App { // Patch used to register router for Patch method // usage: -// beego.Patch("/api", func(ctx *context.Context){ -// ctx.Output.Body("hello world") -// }) +// +// beego.Patch("/api", func(ctx *context.Context){ +// ctx.Output.Body("hello world") +// }) func Patch(rootpath string, f FilterFunc) *App { return (*App)(web.Patch(rootpath, func(ctx *context.Context) { f((*context2.Context)(ctx)) @@ -230,9 +242,10 @@ func Patch(rootpath string, f FilterFunc) *App { // Any used to register router for all methods // usage: -// beego.Any("/api", func(ctx *context.Context){ -// ctx.Output.Body("hello world") -// }) +// +// beego.Any("/api", func(ctx *context.Context){ +// ctx.Output.Body("hello world") +// }) func Any(rootpath string, f FilterFunc) *App { return (*App)(web.Any(rootpath, func(ctx *context.Context) { f((*context2.Context)(ctx)) @@ -241,9 +254,10 @@ func Any(rootpath string, f FilterFunc) *App { // Handler used to register a Handler router // usage: -// beego.Handler("/api", http.HandlerFunc(func (w http.ResponseWriter, r *http.Request) { -// fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path)) -// })) +// +// beego.Handler("/api", http.HandlerFunc(func (w http.ResponseWriter, r *http.Request) { +// fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path)) +// })) func Handler(rootpath string, h http.Handler, options ...interface{}) *App { return (*App)(web.Handler(rootpath, h, options...)) } diff --git a/adapter/cache/cache.go b/adapter/cache/cache.go index 9e3abfd3..0e3762b6 100644 --- a/adapter/cache/cache.go +++ b/adapter/cache/cache.go @@ -16,7 +16,9 @@ // Usage: // // import( -// "github.com/beego/beego/v2/client/cache" +// +// "github.com/beego/beego/v2/client/cache" +// // ) // // bm, err := cache.NewCache("memory", `{"interval":60}`) @@ -27,7 +29,6 @@ // bm.Get("astaxie") // bm.IsExist("astaxie") // bm.Delete("astaxie") -// package cache import ( @@ -37,6 +38,7 @@ import ( // Cache interface contains all behaviors for cache adapter. // usage: +// // cache.Register("file",cache.NewFileCache) // this operation is run in init method of file.go. // c,err := cache.NewCache("file","{....}") // c.Put("key",value, 3600 * time.Second) diff --git a/adapter/cache/memcache/memcache.go b/adapter/cache/memcache/memcache.go index 180e8e15..72372376 100644 --- a/adapter/cache/memcache/memcache.go +++ b/adapter/cache/memcache/memcache.go @@ -20,12 +20,13 @@ // // Usage: // import( -// _ "github.com/beego/beego/v2/client/cache/memcache" -// "github.com/beego/beego/v2/client/cache" +// +// _ "github.com/beego/beego/v2/client/cache/memcache" +// "github.com/beego/beego/v2/client/cache" +// // ) // -// bm, err := cache.NewCache("memcache", `{"conn":"127.0.0.1:11211"}`) -// +// bm, err := cache.NewCache("memcache", `{"conn":"127.0.0.1:11211"}`) package memcache import ( diff --git a/adapter/cache/redis/redis.go b/adapter/cache/redis/redis.go index 7c7bff80..c830f34b 100644 --- a/adapter/cache/redis/redis.go +++ b/adapter/cache/redis/redis.go @@ -20,12 +20,13 @@ // // Usage: // import( -// _ "github.com/beego/beego/v2/client/cache/redis" -// "github.com/beego/beego/v2/client/cache" +// +// _ "github.com/beego/beego/v2/client/cache/redis" +// "github.com/beego/beego/v2/client/cache" +// // ) // -// bm, err := cache.NewCache("redis", `{"conn":"127.0.0.1:11211"}`) -// +// bm, err := cache.NewCache("redis", `{"conn":"127.0.0.1:11211"}`) package redis import ( diff --git a/adapter/config/config.go b/adapter/config/config.go index 2a96a293..0b9a9c7d 100644 --- a/adapter/config/config.go +++ b/adapter/config/config.go @@ -14,29 +14,31 @@ // Package config is used to parse config. // Usage: -// import "github.com/beego/beego/v2/core/config" +// +// import "github.com/beego/beego/v2/core/config" +// // Examples. // -// cnf, err := config.NewConfig("ini", "config.conf") +// cnf, err := config.NewConfig("ini", "config.conf") // -// cnf APIS: +// cnf APIS: // -// cnf.Set(key, val string) error -// cnf.String(key string) string -// cnf.Strings(key string) []string -// cnf.Int(key string) (int, error) -// cnf.Int64(key string) (int64, error) -// cnf.Bool(key string) (bool, error) -// cnf.Float(key string) (float64, error) -// cnf.DefaultString(key string, defaultVal string) string -// cnf.DefaultStrings(key string, defaultVal []string) []string -// cnf.DefaultInt(key string, defaultVal int) int -// cnf.DefaultInt64(key string, defaultVal int64) int64 -// cnf.DefaultBool(key string, defaultVal bool) bool -// cnf.DefaultFloat(key string, defaultVal float64) float64 -// cnf.DIY(key string) (interface{}, error) -// cnf.GetSection(section string) (map[string]string, error) -// cnf.SaveConfigFile(filename string) error +// cnf.Set(key, val string) error +// cnf.String(key string) string +// cnf.Strings(key string) []string +// cnf.Int(key string) (int, error) +// cnf.Int64(key string) (int64, error) +// cnf.Bool(key string) (bool, error) +// cnf.Float(key string) (float64, error) +// cnf.DefaultString(key string, defaultVal string) string +// cnf.DefaultStrings(key string, defaultVal []string) []string +// cnf.DefaultInt(key string, defaultVal int) int +// cnf.DefaultInt64(key string, defaultVal int64) int64 +// cnf.DefaultBool(key string, defaultVal bool) bool +// cnf.DefaultFloat(key string, defaultVal float64) float64 +// cnf.DIY(key string) (interface{}, error) +// cnf.GetSection(section string) (map[string]string, error) +// cnf.SaveConfigFile(filename string) error package config import ( @@ -128,6 +130,7 @@ func ExpandValueEnvForMap(m map[string]interface{}) map[string]interface{} { // // It accept value formats "${env}" , "${env||}}" , "${env||defaultValue}" , "defaultvalue". // Examples: +// // v1 := config.ExpandValueEnv("${GOPATH}") // return the GOPATH environment variable. // v2 := config.ExpandValueEnv("${GOAsta||/usr/local/go}") // return the default value "/usr/local/go/". // v3 := config.ExpandValueEnv("Astaxie") // return the value "Astaxie". diff --git a/adapter/config/env/env_test.go b/adapter/config/env/env_test.go index 3f1d4dba..3f9694d7 100644 --- a/adapter/config/env/env_test.go +++ b/adapter/config/env/env_test.go @@ -5,7 +5,7 @@ // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // -// http://www.apache.org/licenses/LICENSE-2.0 +// http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, diff --git a/adapter/config/xml/xml.go b/adapter/config/xml/xml.go index d5ba6fd0..9de6d6c1 100644 --- a/adapter/config/xml/xml.go +++ b/adapter/config/xml/xml.go @@ -19,13 +19,13 @@ // go install github.com/beego/x2j. // // Usage: -// import( -// _ "github.com/beego/beego/v2/core/config/xml" -// "github.com/beego/beego/v2/core/config" -// ) // -// cnf, err := config.NewConfig("xml", "config.xml") +// import( +// _ "github.com/beego/beego/v2/core/config/xml" +// "github.com/beego/beego/v2/core/config" +// ) // +// cnf, err := config.NewConfig("xml", "config.xml") package xml import ( diff --git a/adapter/config/yaml/yaml.go b/adapter/config/yaml/yaml.go index ef6296fa..6697aaf6 100644 --- a/adapter/config/yaml/yaml.go +++ b/adapter/config/yaml/yaml.go @@ -19,13 +19,13 @@ // go install github.com/beego/goyaml2 // // Usage: -// import( -// _ "github.com/beego/beego/v2/core/config/yaml" -// "github.com/beego/beego/v2/core/config" -// ) // -// cnf, err := config.NewConfig("yaml", "config.yaml") +// import( +// _ "github.com/beego/beego/v2/core/config/yaml" +// "github.com/beego/beego/v2/core/config" +// ) // +// cnf, err := config.NewConfig("yaml", "config.yaml") package yaml import ( diff --git a/adapter/context/context.go b/adapter/context/context.go index 82f8e63a..0f399adb 100644 --- a/adapter/context/context.go +++ b/adapter/context/context.go @@ -18,7 +18,6 @@ // import "github.com/beego/beego/v2/server/web/context" // // ctx := context.Context{Request:req,ResponseWriter:rw} -// package context import ( diff --git a/adapter/controller.go b/adapter/controller.go index 6d2d5f64..2c48be89 100644 --- a/adapter/controller.go +++ b/adapter/controller.go @@ -296,31 +296,33 @@ func (c *Controller) GetFile(key string) (multipart.File, *multipart.FileHeader, // GetFiles return multi-upload files // files, err:=c.GetFiles("myfiles") +// // if err != nil { // http.Error(w, err.Error(), http.StatusNoContent) // return // } -// for i, _ := range files { -// //for each fileheader, get a handle to the actual file -// file, err := files[i].Open() -// defer file.Close() -// if err != nil { -// http.Error(w, err.Error(), http.StatusInternalServerError) -// return +// +// for i, _ := range files { +// //for each fileheader, get a handle to the actual file +// file, err := files[i].Open() +// defer file.Close() +// if err != nil { +// http.Error(w, err.Error(), http.StatusInternalServerError) +// return +// } +// //create destination file making sure the path is writeable. +// dst, err := os.Create("upload/" + files[i].Filename) +// defer dst.Close() +// if err != nil { +// http.Error(w, err.Error(), http.StatusInternalServerError) +// return +// } +// //copy the uploaded file to the destination file +// if _, err := io.Copy(dst, file); err != nil { +// http.Error(w, err.Error(), http.StatusInternalServerError) +// return +// } // } -// //create destination file making sure the path is writeable. -// dst, err := os.Create("upload/" + files[i].Filename) -// defer dst.Close() -// if err != nil { -// http.Error(w, err.Error(), http.StatusInternalServerError) -// return -// } -// //copy the uploaded file to the destination file -// if _, err := io.Copy(dst, file); err != nil { -// http.Error(w, err.Error(), http.StatusInternalServerError) -// return -// } -// } func (c *Controller) GetFiles(key string) ([]*multipart.FileHeader, error) { return (*web.Controller)(c).GetFiles(key) } diff --git a/adapter/error.go b/adapter/error.go index 67f2ab82..62ded60e 100644 --- a/adapter/error.go +++ b/adapter/error.go @@ -182,7 +182,8 @@ var ErrorMaps = web.ErrorMaps // ErrorHandler registers http.HandlerFunc to each http err code string. // usage: -// beego.ErrorHandler("404",NotFound) +// +// beego.ErrorHandler("404",NotFound) // beego.ErrorHandler("500",InternalServerError) func ErrorHandler(code string, h http.HandlerFunc) *App { return (*App)(web.ErrorHandler(code, h)) @@ -190,7 +191,8 @@ func ErrorHandler(code string, h http.HandlerFunc) *App { // ErrorController registers ControllerInterface to each http err code string. // usage: -// beego.ErrorController(&controllers.ErrorController{}) +// +// beego.ErrorController(&controllers.ErrorController{}) func ErrorController(c ControllerInterface) *App { return (*App)(web.ErrorController(c)) } diff --git a/adapter/grace/grace.go b/adapter/grace/grace.go index de047eb1..0df47b61 100644 --- a/adapter/grace/grace.go +++ b/adapter/grace/grace.go @@ -18,28 +18,30 @@ // Usage: // // import( -// "log" -// "net/http" -// "os" // -// "github.com/beego/beego/v2/server/web/grace" +// "log" +// "net/http" +// "os" +// +// "github.com/beego/beego/v2/server/web/grace" +// // ) // -// func handler(w http.ResponseWriter, r *http.Request) { -// w.Write([]byte("WORLD!")) -// } +// func handler(w http.ResponseWriter, r *http.Request) { +// w.Write([]byte("WORLD!")) +// } // -// func main() { -// mux := http.NewServeMux() -// mux.HandleFunc("/hello", handler) +// func main() { +// mux := http.NewServeMux() +// mux.HandleFunc("/hello", handler) // -// err := grace.ListenAndServe("localhost:8080", mux) -// if err != nil { -// log.Println(err) -// } -// log.Println("Server on 8080 stopped") -// os.Exit(0) -// } +// err := grace.ListenAndServe("localhost:8080", mux) +// if err != nil { +// log.Println(err) +// } +// log.Println("Server on 8080 stopped") +// os.Exit(0) +// } package grace import ( diff --git a/adapter/httplib/httplib.go b/adapter/httplib/httplib.go index 9b0cfe26..1fb8ad73 100644 --- a/adapter/httplib/httplib.go +++ b/adapter/httplib/httplib.go @@ -27,7 +27,6 @@ // t.Fatal(err) // } // fmt.Println(str) -// package httplib import ( @@ -175,9 +174,9 @@ func (b *BeegoHTTPRequest) SetTransport(transport http.RoundTripper) *BeegoHTTPR // example: // // func(req *http.Request) (*url.URL, error) { -// u, _ := url.ParseRequestURI("http://127.0.0.1:8118") -// return u, nil -// } +// u, _ := url.ParseRequestURI("http://127.0.0.1:8118") +// return u, nil +// } func (b *BeegoHTTPRequest) SetProxy(proxy func(*http.Request) (*url.URL, error)) *BeegoHTTPRequest { b.delegate.SetProxy(proxy) return b diff --git a/adapter/logs/log.go b/adapter/logs/log.go index a040a1f5..76bbbc1f 100644 --- a/adapter/logs/log.go +++ b/adapter/logs/log.go @@ -29,7 +29,6 @@ // log.Warn("warning") // log.Debug("debug") // log.Critical("critical") -// package logs import ( diff --git a/adapter/namespace.go b/adapter/namespace.go index 9c3dcbb9..b20cdf05 100644 --- a/adapter/namespace.go +++ b/adapter/namespace.go @@ -50,12 +50,14 @@ func oldToNewLinkNs(params []LinkNamespace) []web.LinkNamespace { // Cond set condition function // if cond return true can run this namespace, else can't // usage: -// ns.Cond(func (ctx *context.Context) bool{ -// if ctx.Input.Domain() == "api.beego.vip" { -// return true -// } -// return false -// }) +// +// ns.Cond(func (ctx *context.Context) bool{ +// if ctx.Input.Domain() == "api.beego.vip" { +// return true +// } +// return false +// }) +// // Cond as the first filter func (n *Namespace) Cond(cond namespaceCond) *Namespace { (*web.Namespace)(n).Cond(func(context *context.Context) bool { @@ -68,12 +70,13 @@ func (n *Namespace) Cond(cond namespaceCond) *Namespace { // action has before & after // FilterFunc // usage: -// Filter("before", func (ctx *context.Context){ -// _, ok := ctx.Input.Session("uid").(int) -// if !ok && ctx.Request.RequestURI != "/login" { -// ctx.Redirect(302, "/login") -// } -// }) +// +// Filter("before", func (ctx *context.Context){ +// _, ok := ctx.Input.Session("uid").(int) +// if !ok && ctx.Request.RequestURI != "/login" { +// ctx.Redirect(302, "/login") +// } +// }) func (n *Namespace) Filter(action string, filter ...FilterFunc) *Namespace { nfs := oldToNewFilter(filter) (*web.Namespace)(n).Filter(action, nfs...) @@ -203,18 +206,20 @@ func (n *Namespace) Include(cList ...ControllerInterface) *Namespace { // usage: // ns := beego.NewNamespace(“/v1”). // Namespace( -// beego.NewNamespace("/shop"). -// Get("/:id", func(ctx *context.Context) { -// ctx.Output.Body([]byte("shopinfo")) -// }), -// beego.NewNamespace("/order"). -// Get("/:id", func(ctx *context.Context) { -// ctx.Output.Body([]byte("orderinfo")) -// }), -// beego.NewNamespace("/crm"). -// Get("/:id", func(ctx *context.Context) { -// ctx.Output.Body([]byte("crminfo")) -// }), +// +// beego.NewNamespace("/shop"). +// Get("/:id", func(ctx *context.Context) { +// ctx.Output.Body([]byte("shopinfo")) +// }), +// beego.NewNamespace("/order"). +// Get("/:id", func(ctx *context.Context) { +// ctx.Output.Body([]byte("orderinfo")) +// }), +// beego.NewNamespace("/crm"). +// Get("/:id", func(ctx *context.Context) { +// ctx.Output.Body([]byte("crminfo")) +// }), +// // ) func (n *Namespace) Namespace(ns ...*Namespace) *Namespace { nns := oldToNewNs(ns) diff --git a/adapter/orm/orm.go b/adapter/orm/orm.go index 2b2b29e0..516d17f8 100644 --- a/adapter/orm/orm.go +++ b/adapter/orm/orm.go @@ -50,7 +50,6 @@ // // delete // num, err = o.Delete(&u) // } -// package orm import ( @@ -170,8 +169,9 @@ func (o *ormer) QueryM2M(md interface{}, name string) QueryM2Mer { // args are limit, offset int and order string. // // example: -// orm.LoadRelated(post,"Tags") -// for _,tag := range post.Tags{...} +// +// orm.LoadRelated(post,"Tags") +// for _,tag := range post.Tags{...} // // make sure the relation is defined in model struct tags. func (o *ormer) LoadRelated(md interface{}, name string, args ...interface{}) (int64, error) { diff --git a/adapter/orm/types.go b/adapter/orm/types.go index ecc4d6f4..d7744d09 100644 --- a/adapter/orm/types.go +++ b/adapter/orm/types.go @@ -145,6 +145,7 @@ type RawPreparer orm.RawPreparer // RawSeter raw query seter // create From Ormer.Raw // for example: -// sql := fmt.Sprintf("SELECT %sid%s,%sname%s FROM %suser%s WHERE id = ?",Q,Q,Q,Q,Q,Q) -// rs := Ormer.Raw(sql, 1) +// +// sql := fmt.Sprintf("SELECT %sid%s,%sname%s FROM %suser%s WHERE id = ?",Q,Q,Q,Q,Q,Q) +// rs := Ormer.Raw(sql, 1) type RawSeter orm.RawSeter diff --git a/adapter/plugins/apiauth/apiauth.go b/adapter/plugins/apiauth/apiauth.go index d5511427..a786d8de 100644 --- a/adapter/plugins/apiauth/apiauth.go +++ b/adapter/plugins/apiauth/apiauth.go @@ -15,6 +15,7 @@ // Package apiauth provides handlers to enable apiauth support. // // Simple Usage: +// // import( // "github.com/beego/beego/v2" // "github.com/beego/beego/v2/server/web/filter/apiauth" @@ -37,11 +38,11 @@ // // Information: // -// In the request user should include these params in the query +// # In the request user should include these params in the query // // 1. appid // -// appid is assigned to the application +// appid is assigned to the application // // 2. signature // @@ -51,8 +52,7 @@ // // 3. timestamp: // -// send the request time, the format is yyyy-mm-dd HH:ii:ss -// +// send the request time, the format is yyyy-mm-dd HH:ii:ss package apiauth import ( diff --git a/adapter/plugins/auth/basic.go b/adapter/plugins/auth/basic.go index 173252ca..e82f533a 100644 --- a/adapter/plugins/auth/basic.go +++ b/adapter/plugins/auth/basic.go @@ -14,6 +14,7 @@ // Package auth provides handlers to enable basic auth support. // Simple Usage: +// // import( // "github.com/beego/beego/v2" // "github.com/beego/beego/v2/server/web/filter/auth" @@ -25,7 +26,6 @@ // beego.Run() // } // -// // Advanced Usage: // // func SecretAuth(username, password string) bool { diff --git a/adapter/plugins/authz/authz.go b/adapter/plugins/authz/authz.go index 096d7efb..c7872220 100644 --- a/adapter/plugins/authz/authz.go +++ b/adapter/plugins/authz/authz.go @@ -14,6 +14,7 @@ // Package authz provides handlers to enable ACL, RBAC, ABAC authorization support. // Simple Usage: +// // import( // "github.com/beego/beego/v2" // "github.com/beego/beego/v2/server/web/filter/authz" @@ -26,7 +27,6 @@ // beego.Run() // } // -// // Advanced Usage: // // func main(){ diff --git a/adapter/plugins/cors/cors.go b/adapter/plugins/cors/cors.go index c02ab877..dec80dfa 100644 --- a/adapter/plugins/cors/cors.go +++ b/adapter/plugins/cors/cors.go @@ -14,9 +14,11 @@ // Package cors provides handlers to enable CORS support. // Usage +// // import ( -// "github.com/beego/beego/v2" +// "github.com/beego/beego/v2" // "github.com/beego/beego/v2/server/web/filter/cors" +// // ) // // func main() { diff --git a/adapter/router.go b/adapter/router.go index 23f08e1e..28fedba2 100644 --- a/adapter/router.go +++ b/adapter/router.go @@ -77,6 +77,7 @@ func NewControllerRegister() *ControllerRegister { // Add controller handler and pattern rules to ControllerRegister. // usage: +// // default methods is the same name as method // Add("/user",&UserController{}) // Add("/api/list",&RestController{},"*:ListFood") @@ -99,9 +100,10 @@ func (p *ControllerRegister) Include(cList ...ControllerInterface) { // GetContext returns a context from pool, so usually you should remember to call Reset function to clean the context // And don't forget to give back context to pool // example: -// ctx := p.GetContext() -// ctx.Reset(w, q) -// defer p.GiveBackContext(ctx) +// +// ctx := p.GetContext() +// ctx.Reset(w, q) +// defer p.GiveBackContext(ctx) func (p *ControllerRegister) GetContext() *beecontext.Context { return (*beecontext.Context)((*web.ControllerRegister)(p).GetContext()) } @@ -113,9 +115,10 @@ func (p *ControllerRegister) GiveBackContext(ctx *beecontext.Context) { // Get add get method // usage: -// Get("/", func(ctx *context.Context){ -// ctx.Output.Body("hello world") -// }) +// +// Get("/", func(ctx *context.Context){ +// ctx.Output.Body("hello world") +// }) func (p *ControllerRegister) Get(pattern string, f FilterFunc) { (*web.ControllerRegister)(p).Get(pattern, func(ctx *context.Context) { f((*beecontext.Context)(ctx)) @@ -124,9 +127,10 @@ func (p *ControllerRegister) Get(pattern string, f FilterFunc) { // Post add post method // usage: -// Post("/api", func(ctx *context.Context){ -// ctx.Output.Body("hello world") -// }) +// +// Post("/api", func(ctx *context.Context){ +// ctx.Output.Body("hello world") +// }) func (p *ControllerRegister) Post(pattern string, f FilterFunc) { (*web.ControllerRegister)(p).Post(pattern, func(ctx *context.Context) { f((*beecontext.Context)(ctx)) @@ -135,9 +139,10 @@ func (p *ControllerRegister) Post(pattern string, f FilterFunc) { // Put add put method // usage: -// Put("/api/:id", func(ctx *context.Context){ -// ctx.Output.Body("hello world") -// }) +// +// Put("/api/:id", func(ctx *context.Context){ +// ctx.Output.Body("hello world") +// }) func (p *ControllerRegister) Put(pattern string, f FilterFunc) { (*web.ControllerRegister)(p).Put(pattern, func(ctx *context.Context) { f((*beecontext.Context)(ctx)) @@ -146,9 +151,10 @@ func (p *ControllerRegister) Put(pattern string, f FilterFunc) { // Delete add delete method // usage: -// Delete("/api/:id", func(ctx *context.Context){ -// ctx.Output.Body("hello world") -// }) +// +// Delete("/api/:id", func(ctx *context.Context){ +// ctx.Output.Body("hello world") +// }) func (p *ControllerRegister) Delete(pattern string, f FilterFunc) { (*web.ControllerRegister)(p).Delete(pattern, func(ctx *context.Context) { f((*beecontext.Context)(ctx)) @@ -157,9 +163,10 @@ func (p *ControllerRegister) Delete(pattern string, f FilterFunc) { // Head add head method // usage: -// Head("/api/:id", func(ctx *context.Context){ -// ctx.Output.Body("hello world") -// }) +// +// Head("/api/:id", func(ctx *context.Context){ +// ctx.Output.Body("hello world") +// }) func (p *ControllerRegister) Head(pattern string, f FilterFunc) { (*web.ControllerRegister)(p).Head(pattern, func(ctx *context.Context) { f((*beecontext.Context)(ctx)) @@ -168,9 +175,10 @@ func (p *ControllerRegister) Head(pattern string, f FilterFunc) { // Patch add patch method // usage: -// Patch("/api/:id", func(ctx *context.Context){ -// ctx.Output.Body("hello world") -// }) +// +// Patch("/api/:id", func(ctx *context.Context){ +// ctx.Output.Body("hello world") +// }) func (p *ControllerRegister) Patch(pattern string, f FilterFunc) { (*web.ControllerRegister)(p).Patch(pattern, func(ctx *context.Context) { f((*beecontext.Context)(ctx)) @@ -179,9 +187,10 @@ func (p *ControllerRegister) Patch(pattern string, f FilterFunc) { // Options add options method // usage: -// Options("/api/:id", func(ctx *context.Context){ -// ctx.Output.Body("hello world") -// }) +// +// Options("/api/:id", func(ctx *context.Context){ +// ctx.Output.Body("hello world") +// }) func (p *ControllerRegister) Options(pattern string, f FilterFunc) { (*web.ControllerRegister)(p).Options(pattern, func(ctx *context.Context) { f((*beecontext.Context)(ctx)) @@ -190,9 +199,10 @@ func (p *ControllerRegister) Options(pattern string, f FilterFunc) { // Any add all method // usage: -// Any("/api/:id", func(ctx *context.Context){ -// ctx.Output.Body("hello world") -// }) +// +// Any("/api/:id", func(ctx *context.Context){ +// ctx.Output.Body("hello world") +// }) func (p *ControllerRegister) Any(pattern string, f FilterFunc) { (*web.ControllerRegister)(p).Any(pattern, func(ctx *context.Context) { f((*beecontext.Context)(ctx)) @@ -201,9 +211,10 @@ func (p *ControllerRegister) Any(pattern string, f FilterFunc) { // AddMethod add http method router // usage: -// AddMethod("get","/api/:id", func(ctx *context.Context){ -// ctx.Output.Body("hello world") -// }) +// +// AddMethod("get","/api/:id", func(ctx *context.Context){ +// ctx.Output.Body("hello world") +// }) func (p *ControllerRegister) AddMethod(method, pattern string, f FilterFunc) { (*web.ControllerRegister)(p).AddMethod(method, pattern, func(ctx *context.Context) { f((*beecontext.Context)(ctx)) @@ -235,8 +246,8 @@ func (p *ControllerRegister) AddAutoPrefix(prefix string, c ControllerInterface) // InsertFilter Add a FilterFunc with pattern rule and action constant. // params is for: -// 1. setting the returnOnOutput value (false allows multiple filters to execute) -// 2. determining whether or not params need to be reset. +// 1. setting the returnOnOutput value (false allows multiple filters to execute) +// 2. determining whether or not params need to be reset. func (p *ControllerRegister) InsertFilter(pattern string, pos int, filter FilterFunc, params ...bool) error { opts := oldToNewFilterOpts(params) return (*web.ControllerRegister)(p).InsertFilter(pattern, pos, func(ctx *context.Context) { diff --git a/adapter/session/couchbase/sess_couchbase.go b/adapter/session/couchbase/sess_couchbase.go index 9e37e56b..a7ab407d 100644 --- a/adapter/session/couchbase/sess_couchbase.go +++ b/adapter/session/couchbase/sess_couchbase.go @@ -20,15 +20,16 @@ // // Usage: // import( -// _ "github.com/beego/beego/v2/server/web/session/couchbase" -// "github.com/beego/beego/v2/server/web/session" +// +// _ "github.com/beego/beego/v2/server/web/session/couchbase" +// "github.com/beego/beego/v2/server/web/session" +// // ) // // func init() { // globalSessions, _ = session.NewManager("couchbase", ``{"cookieName":"gosessionid","gclifetime":3600,"ProviderConfig":"http://host:port/, Pool, Bucket"}``) // go globalSessions.GC() // } -// package couchbase import ( diff --git a/adapter/session/memcache/sess_memcache.go b/adapter/session/memcache/sess_memcache.go index 4ca779f7..55abe694 100644 --- a/adapter/session/memcache/sess_memcache.go +++ b/adapter/session/memcache/sess_memcache.go @@ -20,15 +20,16 @@ // // Usage: // import( -// _ "github.com/beego/beego/v2/server/web/session/memcache" -// "github.com/beego/beego/v2/server/web/session" +// +// _ "github.com/beego/beego/v2/server/web/session/memcache" +// "github.com/beego/beego/v2/server/web/session" +// // ) // // func init() { // globalSessions, _ = session.NewManager("memcache", ``{"cookieName":"gosessionid","gclifetime":3600,"ProviderConfig":"127.0.0.1:11211"}``) // go globalSessions.GC() // } -// package memcache import ( diff --git a/adapter/session/mysql/sess_mysql.go b/adapter/session/mysql/sess_mysql.go index eb2bd090..2e75f4eb 100644 --- a/adapter/session/mysql/sess_mysql.go +++ b/adapter/session/mysql/sess_mysql.go @@ -19,6 +19,7 @@ // go install github.com/go-sql-driver/mysql // // mysql session support need create table as sql: +// // CREATE TABLE `session` ( // `session_key` char(64) NOT NULL, // `session_data` blob, @@ -28,15 +29,16 @@ // // Usage: // import( -// _ "github.com/beego/beego/v2/server/web/session/mysql" -// "github.com/beego/beego/v2/server/web/session" +// +// _ "github.com/beego/beego/v2/server/web/session/mysql" +// "github.com/beego/beego/v2/server/web/session" +// // ) // // func init() { // globalSessions, _ = session.NewManager("mysql", ``{"cookieName":"gosessionid","gclifetime":3600,"ProviderConfig":"[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=valueN]"}``) // go globalSessions.GC() // } -// package mysql import ( diff --git a/adapter/session/postgres/sess_postgresql.go b/adapter/session/postgres/sess_postgresql.go index b50e3c59..5d1fb8de 100644 --- a/adapter/session/postgres/sess_postgresql.go +++ b/adapter/session/postgres/sess_postgresql.go @@ -18,7 +18,6 @@ // // go install github.com/lib/pq // -// // needs this table in your database: // // CREATE TABLE session ( @@ -35,18 +34,18 @@ // SessionSavePath = "user=a password=b dbname=c sslmode=disable" // SessionName = session // -// // Usage: // import( -// _ "github.com/beego/beego/v2/server/web/session/postgresql" -// "github.com/beego/beego/v2/server/web/session" +// +// _ "github.com/beego/beego/v2/server/web/session/postgresql" +// "github.com/beego/beego/v2/server/web/session" +// // ) // // func init() { // globalSessions, _ = session.NewManager("postgresql", ``{"cookieName":"gosessionid","gclifetime":3600,"ProviderConfig":"user=pqgotest dbname=pqgotest sslmode=verify-full"}``) // go globalSessions.GC() // } -// package postgres import ( diff --git a/adapter/session/redis/sess_redis.go b/adapter/session/redis/sess_redis.go index 7d3287ff..355bfa77 100644 --- a/adapter/session/redis/sess_redis.go +++ b/adapter/session/redis/sess_redis.go @@ -20,15 +20,16 @@ // // Usage: // import( -// _ "github.com/beego/beego/v2/server/web/session/redis" -// "github.com/beego/beego/v2/server/web/session" +// +// _ "github.com/beego/beego/v2/server/web/session/redis" +// "github.com/beego/beego/v2/server/web/session" +// // ) // -// func init() { -// globalSessions, _ = session.NewManager("redis", ``{"cookieName":"gosessionid","gclifetime":3600,"ProviderConfig":"127.0.0.1:7070"}``) -// go globalSessions.GC() -// } -// +// func init() { +// globalSessions, _ = session.NewManager("redis", ``{"cookieName":"gosessionid","gclifetime":3600,"ProviderConfig":"127.0.0.1:7070"}``) +// go globalSessions.GC() +// } package redis import ( diff --git a/adapter/session/redis_cluster/redis_cluster.go b/adapter/session/redis_cluster/redis_cluster.go index 4b9c09b4..8c4c28c0 100644 --- a/adapter/session/redis_cluster/redis_cluster.go +++ b/adapter/session/redis_cluster/redis_cluster.go @@ -20,15 +20,16 @@ // // Usage: // import( -// _ "github.com/beego/beego/v2/server/web/session/redis_cluster" -// "github.com/beego/beego/v2/server/web/session" +// +// _ "github.com/beego/beego/v2/server/web/session/redis_cluster" +// "github.com/beego/beego/v2/server/web/session" +// // ) // // func init() { // globalSessions, _ = session.NewManager("redis_cluster", ``{"cookieName":"gosessionid","gclifetime":3600,"ProviderConfig":"127.0.0.1:7070;127.0.0.1:7071"}``) // go globalSessions.GC() // } -// package redis_cluster import ( diff --git a/adapter/session/redis_sentinel/sess_redis_sentinel.go b/adapter/session/redis_sentinel/sess_redis_sentinel.go index 633fb5fa..5746cb4a 100644 --- a/adapter/session/redis_sentinel/sess_redis_sentinel.go +++ b/adapter/session/redis_sentinel/sess_redis_sentinel.go @@ -20,8 +20,10 @@ // // Usage: // import( -// _ "github.com/beego/beego/v2/server/web/session/redis_sentinel" -// "github.com/beego/beego/v2/server/web/session" +// +// _ "github.com/beego/beego/v2/server/web/session/redis_sentinel" +// "github.com/beego/beego/v2/server/web/session" +// // ) // // func init() { diff --git a/adapter/session/sess_cookie.go b/adapter/session/sess_cookie.go index ef3b6799..f6610960 100644 --- a/adapter/session/sess_cookie.go +++ b/adapter/session/sess_cookie.go @@ -61,11 +61,12 @@ type CookieProvider session.CookieProvider // SessionInit Init cookie session provider with max lifetime and config json. // maxlifetime is ignored. // json config: -// securityKey - hash string -// blockKey - gob encode hash string. it's saved as aes crypto. -// securityName - recognized name in encoded cookie string -// cookieName - cookie name -// maxage - cookie max life time. +// +// securityKey - hash string +// blockKey - gob encode hash string. it's saved as aes crypto. +// securityName - recognized name in encoded cookie string +// cookieName - cookie name +// maxage - cookie max life time. func (pder *CookieProvider) SessionInit(maxlifetime int64, config string) error { return (*session.CookieProvider)(pder).SessionInit(context.Background(), maxlifetime, config) } diff --git a/adapter/session/session.go b/adapter/session/session.go index 256bd601..629b0898 100644 --- a/adapter/session/session.go +++ b/adapter/session/session.go @@ -16,14 +16,15 @@ // // Usage: // import( -// "github.com/beego/beego/v2/server/web/session" +// +// "github.com/beego/beego/v2/server/web/session" +// // ) // -// func init() { -// globalSessions, _ = session.NewManager("memory", `{"cookieName":"gosessionid", "enableSetCookie,omitempty": true, "gclifetime":3600, "maxLifetime": 3600, "secure": false, "cookieLifeTime": 3600, "providerConfig": ""}`) -// go globalSessions.GC() -// } -// +// func init() { +// globalSessions, _ = session.NewManager("memory", `{"cookieName":"gosessionid", "enableSetCookie,omitempty": true, "gclifetime":3600, "maxLifetime": 3600, "secure": false, "cookieLifeTime": 3600, "providerConfig": ""}`) +// go globalSessions.GC() +// } package session import ( diff --git a/adapter/templatefunc.go b/adapter/templatefunc.go index 32a250d1..c7460d51 100644 --- a/adapter/templatefunc.go +++ b/adapter/templatefunc.go @@ -91,21 +91,21 @@ func Htmlunquote(text string) string { } // URLFor returns url string with another registered controller handler with params. -// usage: // -// URLFor(".index") -// print URLFor("index") -// router /login -// print URLFor("login") -// print URLFor("login", "next","/"") -// router /profile/:username -// print UrlFor("profile", ":username","John Doe") -// result: -// / -// /login -// /login?next=/ -// /user/John%20Doe +// usage: // +// URLFor(".index") +// print URLFor("index") +// router /login +// print URLFor("login") +// print URLFor("login", "next","/"") +// router /profile/:username +// print UrlFor("profile", ":username","John Doe") +// result: +// / +// /login +// /login?next=/ +// /user/John%20Doe func URLFor(endpoint string, values ...interface{}) string { return web.URLFor(endpoint, values...) } @@ -135,12 +135,13 @@ func RenderForm(obj interface{}) template.HTML { // MapGet getting value from map by keys // usage: -// Data["m"] = M{ -// "a": 1, -// "1": map[string]float64{ -// "c": 4, -// }, -// } +// +// Data["m"] = M{ +// "a": 1, +// "1": map[string]float64{ +// "c": 4, +// }, +// } // // {{ map_get m "a" }} // return 1 // {{ map_get m 1 "c" }} // return 4 diff --git a/adapter/toolbox/healthcheck.go b/adapter/toolbox/healthcheck.go index 400e707e..438946cf 100644 --- a/adapter/toolbox/healthcheck.go +++ b/adapter/toolbox/healthcheck.go @@ -17,16 +17,15 @@ // type DatabaseCheck struct { // } // -// func (dc *DatabaseCheck) Check() error { -// if dc.isConnected() { -// return nil -// } else { -// return errors.New("can't connect database") -// } -// } +// func (dc *DatabaseCheck) Check() error { +// if dc.isConnected() { +// return nil +// } else { +// return errors.New("can't connect database") +// } +// } // // AddHealthCheck("database",&DatabaseCheck{}) -// package toolbox import ( diff --git a/adapter/toolbox/task.go b/adapter/toolbox/task.go index 81864e9a..ebabbc10 100644 --- a/adapter/toolbox/task.go +++ b/adapter/toolbox/task.go @@ -141,11 +141,16 @@ func (t *Task) GetPrev() time.Time { // week:0-6(0 means Sunday) // SetCron some signals: -// *: any time -// ,:  separate signal +// +// *: any time +// ,:  separate signal +// //    -:duration -// /n : do as n times of time duration +// +// /n : do as n times of time duration +// // /////////////////////////////////////////////////////// +// // 0/30 * * * * * every 30s // 0 43 21 * * * 21:43 // 0 15 05 * * *    05:15 diff --git a/adapter/utils/captcha/captcha.go b/adapter/utils/captcha/captcha.go index 7cdcab2d..0dd10d6b 100644 --- a/adapter/utils/captcha/captcha.go +++ b/adapter/utils/captcha/captcha.go @@ -19,32 +19,35 @@ // package controllers // // import ( -// "github.com/beego/beego/v2" -// "github.com/beego/beego/v2/client/cache" -// "github.com/beego/beego/v2/server/web/captcha" +// +// "github.com/beego/beego/v2" +// "github.com/beego/beego/v2/client/cache" +// "github.com/beego/beego/v2/server/web/captcha" +// // ) // // var cpt *captcha.Captcha // -// func init() { -// // use beego cache system store the captcha data -// store := cache.NewMemoryCache() -// cpt = captcha.NewWithFilter("/captcha/", store) -// } +// func init() { +// // use beego cache system store the captcha data +// store := cache.NewMemoryCache() +// cpt = captcha.NewWithFilter("/captcha/", store) +// } // -// type MainController struct { -// beego.Controller -// } +// type MainController struct { +// beego.Controller +// } // -// func (this *MainController) Get() { -// this.TplName = "index.tpl" -// } +// func (this *MainController) Get() { +// this.TplName = "index.tpl" +// } // -// func (this *MainController) Post() { -// this.TplName = "index.tpl" +// func (this *MainController) Post() { +// this.TplName = "index.tpl" +// +// this.Data["Success"] = cpt.VerifyReq(this.Ctx.Request) +// } // -// this.Data["Success"] = cpt.VerifyReq(this.Ctx.Request) -// } // ``` // // template usage @@ -52,8 +55,10 @@ // ``` // {{.Success}} //
-// {{create_captcha}} -// +// +// {{create_captcha}} +// +// //
// ``` package captcha diff --git a/adapter/utils/pagination/doc.go b/adapter/utils/pagination/doc.go index 67530041..d3ccd06f 100644 --- a/adapter/utils/pagination/doc.go +++ b/adapter/utils/pagination/doc.go @@ -2,53 +2,51 @@ Package pagination provides utilities to setup a paginator within the context of a http request. -Usage +# Usage In your beego.Controller: - package controllers + package controllers - import "github.com/beego/beego/v2/server/web/pagination" + import "github.com/beego/beego/v2/server/web/pagination" - type PostsController struct { - beego.Controller - } + type PostsController struct { + beego.Controller + } - func (this *PostsController) ListAllPosts() { - // sets this.Data["paginator"] with the current offset (from the url query param) - postsPerPage := 20 - paginator := pagination.SetPaginator(this.Ctx, postsPerPage, CountPosts()) - - // fetch the next 20 posts - this.Data["posts"] = ListPostsByOffsetAndLimit(paginator.Offset(), postsPerPage) - } + func (this *PostsController) ListAllPosts() { + // sets this.Data["paginator"] with the current offset (from the url query param) + postsPerPage := 20 + paginator := pagination.SetPaginator(this.Ctx, postsPerPage, CountPosts()) + // fetch the next 20 posts + this.Data["posts"] = ListPostsByOffsetAndLimit(paginator.Offset(), postsPerPage) + } In your view templates: - {{if .paginator.HasPages}} - - {{end}} - + {{if .paginator.HasPages}} + + {{end}} */ package pagination diff --git a/adapter/utils/pagination/paginator.go b/adapter/utils/pagination/paginator.go index cbf71da4..bf4d9782 100644 --- a/adapter/utils/pagination/paginator.go +++ b/adapter/utils/pagination/paginator.go @@ -47,11 +47,11 @@ func (p *Paginator) Page() int { // // Usage (in a view template): // -// {{range $index, $page := .paginator.Pages}} -// -// {{$page}} -// -// {{end}} +// {{range $index, $page := .paginator.Pages}} +// +// {{$page}} +// +// {{end}} func (p *Paginator) Pages() []int { return (*pagination.Paginator)(p).Pages() } diff --git a/adapter/validation/util.go b/adapter/validation/util.go index 5ff43ebc..8747b8bd 100644 --- a/adapter/validation/util.go +++ b/adapter/validation/util.go @@ -34,13 +34,15 @@ type CustomFunc func(v *Validation, obj interface{}, key string) // AddCustomFunc Add a custom function to validation // The name can not be: -// Clear -// HasErrors -// ErrorMap -// Error -// Check -// Valid -// NoMatch +// +// Clear +// HasErrors +// ErrorMap +// Error +// Check +// Valid +// NoMatch +// // If the name is same with exists function, it will replace the origin valid function func AddCustomFunc(name string, f CustomFunc) error { return validation.AddCustomFunc(name, func(v *validation.Validation, obj interface{}, key string) { diff --git a/adapter/validation/validation.go b/adapter/validation/validation.go index 0e7f9adf..ead64d05 100644 --- a/adapter/validation/validation.go +++ b/adapter/validation/validation.go @@ -42,7 +42,6 @@ // log.Println(v.Error.Key, v.Error.Message) // } // } -// package validation import ( diff --git a/adapter/validation/validators.go b/adapter/validation/validators.go index f4d7db3b..e8a0d36e 100644 --- a/adapter/validation/validators.go +++ b/adapter/validation/validators.go @@ -51,26 +51,27 @@ var once sync.Once // SetDefaultMessage set default messages // if not set, the default messages are -// "Required": "Can not be empty", -// "Min": "Minimum is %d", -// "Max": "Maximum is %d", -// "Range": "Range is %d to %d", -// "MinSize": "Minimum size is %d", -// "MaxSize": "Maximum size is %d", -// "Length": "Required length is %d", -// "Alpha": "Must be valid alpha characters", -// "Numeric": "Must be valid numeric characters", -// "AlphaNumeric": "Must be valid alpha or numeric characters", -// "Match": "Must match %s", -// "NoMatch": "Must not match %s", -// "AlphaDash": "Must be valid alpha or numeric or dash(-_) characters", -// "Email": "Must be a valid email address", -// "IP": "Must be a valid ip address", -// "Base64": "Must be valid base64 characters", -// "Mobile": "Must be valid mobile number", -// "Tel": "Must be valid telephone number", -// "Phone": "Must be valid telephone or mobile phone number", -// "ZipCode": "Must be valid zipcode", +// +// "Required": "Can not be empty", +// "Min": "Minimum is %d", +// "Max": "Maximum is %d", +// "Range": "Range is %d to %d", +// "MinSize": "Minimum size is %d", +// "MaxSize": "Maximum size is %d", +// "Length": "Required length is %d", +// "Alpha": "Must be valid alpha characters", +// "Numeric": "Must be valid numeric characters", +// "AlphaNumeric": "Must be valid alpha or numeric characters", +// "Match": "Must match %s", +// "NoMatch": "Must not match %s", +// "AlphaDash": "Must be valid alpha or numeric or dash(-_) characters", +// "Email": "Must be a valid email address", +// "IP": "Must be a valid ip address", +// "Base64": "Must be valid base64 characters", +// "Mobile": "Must be valid mobile number", +// "Tel": "Must be valid telephone number", +// "Phone": "Must be valid telephone or mobile phone number", +// "ZipCode": "Must be valid zipcode", func SetDefaultMessage(msg map[string]string) { validation.SetDefaultMessage(msg) } diff --git a/client/cache/bloom_filter_cache_test.go b/client/cache/bloom_filter_cache_test.go index ad15f2b4..d26d27cc 100644 --- a/client/cache/bloom_filter_cache_test.go +++ b/client/cache/bloom_filter_cache_test.go @@ -23,9 +23,10 @@ import ( "testing" "time" - "github.com/beego/beego/v2/core/berror" "github.com/bits-and-blooms/bloom/v3" "github.com/stretchr/testify/assert" + + "github.com/beego/beego/v2/core/berror" ) type MockDB struct { diff --git a/client/cache/cache.go b/client/cache/cache.go index 8710643a..f7599dbb 100644 --- a/client/cache/cache.go +++ b/client/cache/cache.go @@ -16,7 +16,9 @@ // Usage: // // import( -// "github.com/beego/beego/v2/client/cache" +// +// "github.com/beego/beego/v2/client/cache" +// // ) // // bm, err := cache.NewCache("memory", `{"interval":60}`) @@ -27,7 +29,6 @@ // bm.Get("astaxie") // bm.IsExist("astaxie") // bm.Delete("astaxie") -// package cache import ( @@ -39,6 +40,7 @@ import ( // Cache interface contains all behaviors for cache adapter. // usage: +// // cache.Register("file",cache.NewFileCache) // this operation is run in init method of file.go. // c,err := cache.NewCache("file","{....}") // c.Put("key",value, 3600 * time.Second) diff --git a/client/cache/memcache/memcache.go b/client/cache/memcache/memcache.go index ad645f07..4c6cf0dd 100644 --- a/client/cache/memcache/memcache.go +++ b/client/cache/memcache/memcache.go @@ -20,12 +20,13 @@ // // Usage: // import( -// _ "github.com/beego/beego/v2/client/cache/memcache" -// "github.com/beego/beego/v2/client/cache" +// +// _ "github.com/beego/beego/v2/client/cache/memcache" +// "github.com/beego/beego/v2/client/cache" +// // ) // -// bm, err := cache.NewCache("memcache", `{"conn":"127.0.0.1:11211"}`) -// +// bm, err := cache.NewCache("memcache", `{"conn":"127.0.0.1:11211"}`) package memcache import ( diff --git a/client/cache/redis/redis.go b/client/cache/redis/redis.go index 4d891a80..8c38b474 100644 --- a/client/cache/redis/redis.go +++ b/client/cache/redis/redis.go @@ -20,12 +20,13 @@ // // Usage: // import( -// _ "github.com/beego/beego/v2/client/cache/redis" -// "github.com/beego/beego/v2/client/cache" +// +// _ "github.com/beego/beego/v2/client/cache/redis" +// "github.com/beego/beego/v2/client/cache" +// // ) // -// bm, err := cache.NewCache("redis", `{"conn":"127.0.0.1:11211"}`) -// +// bm, err := cache.NewCache("redis", `{"conn":"127.0.0.1:11211"}`) package redis import ( diff --git a/client/httplib/httpclient.go b/client/httplib/httpclient.go index 524f8bbb..f3ac4afe 100644 --- a/client/httplib/httpclient.go +++ b/client/httplib/httpclient.go @@ -17,7 +17,6 @@ package httplib import ( "bytes" "io" - "io/ioutil" "net/http" ) @@ -105,7 +104,7 @@ func (c *Client) handleCarrier(value interface{}, req *BeegoHTTPRequest) error { if err != nil { return err } - req.resp.Body = ioutil.NopCloser(bytes.NewReader(b)) + req.resp.Body = io.NopCloser(bytes.NewReader(b)) carrier.SetHTTPResponse(req.resp) } if carrier, ok := value.(HTTPBodyCarrier); ok { @@ -113,7 +112,7 @@ func (c *Client) handleCarrier(value interface{}, req *BeegoHTTPRequest) error { if err != nil { return err } - reader := ioutil.NopCloser(bytes.NewReader(b)) + reader := io.NopCloser(bytes.NewReader(b)) carrier.SetReader(reader) } if carrier, ok := value.(HTTPBytesCarrier); ok { diff --git a/client/httplib/httpclient_test.go b/client/httplib/httpclient_test.go index 1ab6d95f..b7dc8769 100644 --- a/client/httplib/httpclient_test.go +++ b/client/httplib/httpclient_test.go @@ -15,12 +15,17 @@ package httplib import ( + "encoding/json" "encoding/xml" "io" - "io/ioutil" + "net" "net/http" "testing" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" + "gopkg.in/yaml.v3" + "github.com/stretchr/testify/assert" ) @@ -32,13 +37,13 @@ func TestNewClient(t *testing.T) { } type slideShowResponse struct { - Resp *http.Response - bytes []byte - StatusCode int - Body io.ReadCloser - Header map[string][]string + Resp *http.Response `json:"resp,omitempty"` + bytes []byte `json:"bytes,omitempty"` + StatusCode int `json:"status_code,omitempty"` + Body io.ReadCloser `json:"body,omitempty"` + Header map[string][]string `json:"header,omitempty"` - Slideshow slideshow `json:"slideshow" yaml:"slideshow"` + Slideshow slideshow `json:"slideshow,omitempty" yaml:"slideshow" xml:"slideshow"` } func (r *slideShowResponse) SetHTTPResponse(resp *http.Response) { @@ -66,7 +71,7 @@ func (r *slideShowResponse) String() string { } type slideshow struct { - XMLName xml.Name `xml:"slideshow"` + //XMLName xml.Name `xml:"slideshow"` Title string `json:"title" yaml:"title" xml:"title,attr"` Author string `json:"author" yaml:"author" xml:"author,attr"` @@ -80,63 +85,122 @@ type slide struct { Title string `json:"title" yaml:"title" xml:"title"` } -func TestClientHandleCarrier(t *testing.T) { - v := "beego" - client, err := NewClient("test", "http://httpbin.org/", - WithUserAgent(v)) - if err != nil { - t.Fatal(err) - } - - s := &slideShowResponse{} - err = client.Get(s, "/json") - if err != nil { - t.Fatal(err) - } - defer s.Body.Close() - - assert.NotNil(t, s.Resp) - assert.NotNil(t, s.Body) - assert.Equal(t, "429", s.Header["Content-Length"][0]) - assert.Equal(t, 200, s.StatusCode) - - b, err := ioutil.ReadAll(s.Body) - if err != nil { - t.Fatal(err) - } - assert.Equal(t, 429, len(b)) - assert.Equal(t, s.String(), string(b)) +type ClientTestSuite struct { + suite.Suite + l net.Listener } -func TestClientGet(t *testing.T) { - client, err := NewClient("test", "http://httpbin.org/") +func (c *ClientTestSuite) SetupSuite() { + listener, err := net.Listen("tcp", ":8080") + require.NoError(c.T(), err) + c.l = listener + + handler := http.NewServeMux() + handler.HandleFunc("/json", func(writer http.ResponseWriter, request *http.Request) { + data, _ := json.Marshal(slideshow{}) + _, _ = writer.Write(data) + }) + + ssr := slideShowResponse{ + Slideshow: slideshow{ + Title: "Sample Slide Show", + Slides: []slide{ + { + Title: "Content", + }, + { + Title: "Overview", + }, + }, + }, + } + + handler.HandleFunc("/req2resp", func(writer http.ResponseWriter, request *http.Request) { + data, _ := io.ReadAll(request.Body) + _, _ = writer.Write(data) + }) + + handler.HandleFunc("/get", func(writer http.ResponseWriter, request *http.Request) { + data, _ := json.Marshal(ssr) + _, _ = writer.Write(data) + }) + + handler.HandleFunc("/get/xml", func(writer http.ResponseWriter, request *http.Request) { + data, err := xml.Marshal(ssr.Slideshow) + require.NoError(c.T(), err) + _, _ = writer.Write(data) + }) + + handler.HandleFunc("/get/yaml", func(writer http.ResponseWriter, request *http.Request) { + data, _ := yaml.Marshal(ssr) + _, _ = writer.Write(data) + }) + + go func() { + _ = http.Serve(listener, handler) + }() +} + +func (c *ClientTestSuite) TearDownSuite() { + _ = c.l.Close() +} + +func TestClient(t *testing.T) { + suite.Run(t, &ClientTestSuite{}) +} + +func (c *ClientTestSuite) TestClientHandleCarrier() { + t := c.T() + v := "beego" + client, err := NewClient("test", "http://localhost:8080/", + WithUserAgent(v)) + require.NoError(t, err) + resp := &slideShowResponse{} + err = client.Get(resp, "/json") + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + + assert.NotNil(t, resp.Resp) + assert.NotNil(t, resp.Body) + assert.Equal(t, "48", resp.Header["Content-Length"][0]) + assert.Equal(t, 200, resp.StatusCode) + + b, err := io.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + assert.Equal(t, 48, len(b)) + assert.Equal(t, resp.String(), string(b)) +} + +func (c *ClientTestSuite) TestClientGet() { + t := c.T() + client, err := NewClient("test", "http://localhost:8080/") if err != nil { t.Fatal(err) } // json - var s *slideShowResponse - err = client.Get(&s, "/json") - if err != nil { - t.Fatal(err) - } + var s slideShowResponse + err = client.Get(&s, "/get") + require.NoError(t, err) assert.Equal(t, "Sample Slide Show", s.Slideshow.Title) assert.Equal(t, 2, len(s.Slideshow.Slides)) assert.Equal(t, "Overview", s.Slideshow.Slides[1].Title) // xml - var ssp *slideshow - err = client.Get(&ssp, "/base64/PD94bWwgPz48c2xpZGVzaG93CnRpdGxlPSJTYW1wbGUgU2xpZGUgU2hvdyIKZGF0ZT0iRGF0ZSBvZiBwdWJsaWNhdGlvbiIKYXV0aG9yPSJZb3VycyBUcnVseSI+PHNsaWRlIHR5cGU9ImFsbCI+PHRpdGxlPldha2UgdXAgdG8gV29uZGVyV2lkZ2V0cyE8L3RpdGxlPjwvc2xpZGU+PHNsaWRlIHR5cGU9ImFsbCI+PHRpdGxlPk92ZXJ2aWV3PC90aXRsZT48aXRlbT5XaHkgPGVtPldvbmRlcldpZGdldHM8L2VtPiBhcmUgZ3JlYXQ8L2l0ZW0+PGl0ZW0vPjxpdGVtPldobyA8ZW0+YnV5czwvZW0+IFdvbmRlcldpZGdldHM8L2l0ZW0+PC9zbGlkZT48L3NsaWRlc2hvdz4=") - if err != nil { - t.Fatal(err) - } - assert.Equal(t, "Sample Slide Show", ssp.Title) - assert.Equal(t, 2, len(ssp.Slides)) - assert.Equal(t, "Overview", ssp.Slides[1].Title) + var ss slideshow + err = client.Get(&ss, "/get/xml") + require.NoError(t, err) + assert.Equal(t, "Sample Slide Show", ss.Title) + assert.Equal(t, 2, len(ss.Slides)) + assert.Equal(t, "Overview", ss.Slides[1].Title) // yaml - s = nil - err = client.Get(&s, "/base64/c2xpZGVzaG93OgogIGF1dGhvcjogWW91cnMgVHJ1bHkKICBkYXRlOiBkYXRlIG9mIHB1YmxpY2F0aW9uCiAgc2xpZGVzOgogIC0gdGl0bGU6IFdha2UgdXAgdG8gV29uZGVyV2lkZ2V0cyEKICAgIHR5cGU6IGFsbAogIC0gaXRlbXM6CiAgICAtIFdoeSA8ZW0+V29uZGVyV2lkZ2V0czwvZW0+IGFyZSBncmVhdAogICAgLSBXaG8gPGVtPmJ1eXM8L2VtPiBXb25kZXJXaWRnZXRzCiAgICB0aXRsZTogT3ZlcnZpZXcKICAgIHR5cGU6IGFsbAogIHRpdGxlOiBTYW1wbGUgU2xpZGUgU2hvdw==") + s = slideShowResponse{} + err = client.Get(&s, "/get/yaml") if err != nil { t.Fatal(err) } @@ -145,72 +209,82 @@ func TestClientGet(t *testing.T) { assert.Equal(t, "Overview", s.Slideshow.Slides[1].Title) } -func TestClientPost(t *testing.T) { - client, err := NewClient("test", "http://httpbin.org") - if err != nil { - t.Fatal(err) +func (c *ClientTestSuite) TestClientPost() { + t := c.T() + client, err := NewClient("test", "http://localhost:8080") + require.NoError(t, err) + + input := slideShowResponse{ + Slideshow: slideshow{ + Title: "Sample Slide Show", + Slides: []slide{ + { + Title: "Content", + }, + { + Title: "Overview", + }, + }, + }, } - resp := &slideShowResponse{} - err = client.Get(resp, "/json") - if err != nil { - t.Fatal(err) - } - - jsonStr := resp.String() - err = client.Post(resp, "/post", jsonStr) - if err != nil { - t.Fatal(err) - } - assert.NotNil(t, resp) + jsonStr, err := json.Marshal(input) + require.NoError(t, err) + resp := slideShowResponse{} + err = client.Post(&resp, "/req2resp", jsonStr) + require.NoError(t, err) + assert.Equal(t, input.Slideshow, resp.Slideshow) assert.Equal(t, http.MethodPost, resp.Resp.Request.Method) } -func TestClientPut(t *testing.T) { - client, err := NewClient("test", "http://httpbin.org") - if err != nil { - t.Fatal(err) +func (c *ClientTestSuite) TestClientPut() { + t := c.T() + client, err := NewClient("test", "http://localhost:8080") + require.NoError(t, err) + + input := slideShowResponse{ + Slideshow: slideshow{ + Title: "Sample Slide Show", + Slides: []slide{ + { + Title: "Content", + }, + { + Title: "Overview", + }, + }, + }, } - resp := &slideShowResponse{} - err = client.Get(resp, "/json") - if err != nil { - t.Fatal(err) - } - - jsonStr := resp.String() - err = client.Put(resp, "/put", jsonStr) - if err != nil { - t.Fatal(err) - } - assert.NotNil(t, resp) + jsonStr, err := json.Marshal(input) + require.NoError(t, err) + resp := slideShowResponse{} + err = client.Put(&resp, "/req2resp", jsonStr) + require.NoError(t, err) + assert.Equal(t, input.Slideshow, resp.Slideshow) assert.Equal(t, http.MethodPut, resp.Resp.Request.Method) } -func TestClientDelete(t *testing.T) { - client, err := NewClient("test", "http://httpbin.org") - if err != nil { - t.Fatal(err) - } +func (c *ClientTestSuite) TestClientDelete() { + t := c.T() + client, err := NewClient("test", "http://localhost:8080") + require.NoError(t, err) resp := &slideShowResponse{} - err = client.Delete(resp, "/delete") - if err != nil { - t.Fatal(err) - } + err = client.Delete(resp, "/req2resp") + require.NoError(t, err) defer resp.Resp.Body.Close() + assert.NotNil(t, resp) assert.Equal(t, http.MethodDelete, resp.Resp.Request.Method) } -func TestClientHead(t *testing.T) { - client, err := NewClient("test", "http://beego.gocn.vip") - if err != nil { - t.Fatal(err) - } - +func (c *ClientTestSuite) TestClientHead() { + t := c.T() + client, err := NewClient("test", "http://localhost:8080") + require.NoError(t, err) resp := &slideShowResponse{} - err = client.Head(resp, "") + err = client.Head(resp, "/req2resp") if err != nil { t.Fatal(err) } diff --git a/client/httplib/httplib.go b/client/httplib/httplib.go index 304c5909..cbe3f9db 100644 --- a/client/httplib/httplib.go +++ b/client/httplib/httplib.go @@ -27,7 +27,6 @@ // t.Fatal(err) // } // fmt.Println(str) -// package httplib import ( @@ -225,9 +224,9 @@ func (b *BeegoHTTPRequest) SetTransport(transport http.RoundTripper) *BeegoHTTPR // example: // // func(req *http.Request) (*url.URL, error) { -// u, _ := url.ParseRequestURI("http://127.0.0.1:8118") -// return u, nil -// } +// u, _ := url.ParseRequestURI("http://127.0.0.1:8118") +// return u, nil +// } func (b *BeegoHTTPRequest) SetProxy(proxy func(*http.Request) (*url.URL, error)) *BeegoHTTPRequest { b.setting.Proxy = proxy return b @@ -592,10 +591,10 @@ func (b *BeegoHTTPRequest) Bytes() ([]byte, error) { if err != nil { return nil, berror.Wrap(err, ReadGzipBodyFailed, "building gzip reader failed") } - b.body, err = ioutil.ReadAll(reader) + b.body, err = io.ReadAll(reader) return b.body, berror.Wrap(err, ReadGzipBodyFailed, "reading gzip data failed") } - b.body, err = ioutil.ReadAll(resp.Body) + b.body, err = io.ReadAll(resp.Body) return b.body, err } diff --git a/client/httplib/httplib_test.go b/client/httplib/httplib_test.go index 39828d08..6c823223 100644 --- a/client/httplib/httplib_test.go +++ b/client/httplib/httplib_test.go @@ -17,9 +17,10 @@ package httplib import ( "bytes" "context" + json "encoding/json" "errors" "fmt" - "io/ioutil" + "io" "net" "net/http" "os" @@ -27,19 +28,104 @@ import ( "testing" "time" + "github.com/stretchr/testify/suite" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) -func TestResponse(t *testing.T) { - req := Get("http://httpbin.org/get") - resp, err := req.Response() - require.NoError(t, err) - t.Log(resp) +type HttplibTestSuite struct { + suite.Suite + l net.Listener } -func TestDoRequest(t *testing.T) { - req := Get("https://goolnk.com/33BD2j") +func (h *HttplibTestSuite) SetupSuite() { + listener, err := net.Listen("tcp", ":8080") + require.NoError(h.T(), err) + h.l = listener + + handler := http.NewServeMux() + + handler.HandleFunc("/get", func(writer http.ResponseWriter, request *http.Request) { + agent := request.Header.Get("User-Agent") + _, _ = writer.Write([]byte("hello, " + agent)) + }) + + handler.HandleFunc("/put", func(writer http.ResponseWriter, request *http.Request) { + _, _ = writer.Write([]byte("hello, put")) + }) + + handler.HandleFunc("/post", func(writer http.ResponseWriter, request *http.Request) { + body, _ := io.ReadAll(request.Body) + _, _ = writer.Write(body) + }) + + handler.HandleFunc("/delete", func(writer http.ResponseWriter, request *http.Request) { + _, _ = writer.Write([]byte("hello, delete")) + }) + + handler.HandleFunc("/cookies/set", func(writer http.ResponseWriter, request *http.Request) { + k1 := request.URL.Query().Get("k1") + http.SetCookie(writer, &http.Cookie{ + Name: "k1", + Value: k1, + }) + _, _ = writer.Write([]byte("hello, set cookie")) + }) + + handler.HandleFunc("/cookies", func(writer http.ResponseWriter, request *http.Request) { + body := request.Cookies()[0].String() + _, _ = writer.Write([]byte(body)) + }) + + handler.HandleFunc("/basic-auth/user/passwd", func(writer http.ResponseWriter, request *http.Request) { + _, _, ok := request.BasicAuth() + if ok { + _, _ = writer.Write([]byte("authenticated")) + } else { + _, _ = writer.Write([]byte("no auth")) + } + }) + + handler.HandleFunc("/headers", func(writer http.ResponseWriter, request *http.Request) { + agent := request.Header.Get("User-Agent") + _, _ = writer.Write([]byte(agent)) + }) + + handler.HandleFunc("/ip", func(writer http.ResponseWriter, request *http.Request) { + data := map[string]string{"origin": "127.0.0.1"} + jsonBytes, _ := json.Marshal(data) + _, _ = writer.Write(jsonBytes) + }) + + handler.HandleFunc("/redirect", func(writer http.ResponseWriter, request *http.Request) { + http.Redirect(writer, request, "redirect_dst", http.StatusTemporaryRedirect) + }) + handler.HandleFunc("redirect_dst", func(writer http.ResponseWriter, request *http.Request) { + _, _ = writer.Write([]byte("hello")) + }) + go func() { + _ = http.Serve(listener, handler) + }() +} + +func (h *HttplibTestSuite) TearDownSuite() { + _ = h.l.Close() +} + +func TestHttplib(t *testing.T) { + suite.Run(t, &HttplibTestSuite{}) +} + +func (h *HttplibTestSuite) TestResponse() { + req := Get("http://localhost:8080/get") + _, err := req.Response() + require.NoError(h.T(), err) +} + +func (h *HttplibTestSuite) TestDoRequest() { + t := h.T() + req := Get("http://localhost:8080/redirect") retryAmount := 1 req.Retries(1) req.RetryDelay(1400 * time.Millisecond) @@ -63,107 +149,79 @@ func TestDoRequest(t *testing.T) { } } -func TestGet(t *testing.T) { - req := Get("http://httpbin.org/get") +func (h *HttplibTestSuite) TestGet() { + t := h.T() + req := Get("http://localhost:8080/get") b, err := req.Bytes() require.NoError(t, err) - t.Log(b) s, err := req.String() require.NoError(t, err) - t.Log(s) require.Equal(t, string(b), s) } -func TestSimplePost(t *testing.T) { +func (h *HttplibTestSuite) TestSimplePost() { + t := h.T() v := "smallfish" - req := Post("http://httpbin.org/post") + req := Post("http://localhost:8080/post") req.Param("username", v) str, err := req.String() require.NoError(t, err) - t.Log(str) + n := strings.Index(str, v) + require.NotEqual(t, -1, n) +} + +func (h *HttplibTestSuite) TestSimplePut() { + t := h.T() + _, err := Put("http://localhost:8080/put").String() + require.NoError(t, err) +} + +func (h *HttplibTestSuite) TestSimpleDelete() { + t := h.T() + _, err := Delete("http://localhost:8080/delete").String() + require.NoError(t, err) +} + +func (h *HttplibTestSuite) TestSimpleDeleteParam() { + t := h.T() + _, err := Delete("http://localhost:8080/delete").Param("key", "val").String() + require.NoError(t, err) +} + +func (h *HttplibTestSuite) TestWithCookie() { + t := h.T() + v := "smallfish" + _, err := Get("http://localhost:8080/cookies/set?k1=" + v).SetEnableCookie(true).String() + require.NoError(t, err) + + str, err := Get("http://localhost:8080/cookies").SetEnableCookie(true).String() + require.NoError(t, err) n := strings.Index(str, v) require.NotEqual(t, -1, n) } -// func TestPostFile(t *testing.T) { -// v := "smallfish" -// req := Post("http://httpbin.org/post") -// req.Debug(true) -// req.Param("username", v) -// req.PostFile("uploadfile", "httplib_test.go") - -// str, err := req.String() -// if err != nil { -// t.Fatal(err) -// } -// t.Log(str) - -// n := strings.Index(str, v) -// if n == -1 { -// t.Fatal(v + " not found in post") -// } -// } - -func TestSimplePut(t *testing.T) { - str, err := Put("http://httpbin.org/put").String() +func (h *HttplibTestSuite) TestWithBasicAuth() { + t := h.T() + str, err := Get("http://localhost:8080/basic-auth/user/passwd").SetBasicAuth("user", "passwd").String() require.NoError(t, err) - t.Log(str) -} - -func TestSimpleDelete(t *testing.T) { - str, err := Delete("http://httpbin.org/delete").String() - require.NoError(t, err) - t.Log(str) -} - -func TestSimpleDeleteParam(t *testing.T) { - str, err := Delete("http://httpbin.org/delete").Param("key", "val").String() - require.NoError(t, err) - t.Log(str) -} - -func TestWithCookie(t *testing.T) { - v := "smallfish" - str, err := Get("http://httpbin.org/cookies/set?k1=" + v).SetEnableCookie(true).String() - require.NoError(t, err) - t.Log(str) - - str, err = Get("http://httpbin.org/cookies").SetEnableCookie(true).String() - require.NoError(t, err) - t.Log(str) - - n := strings.Index(str, v) - if n == -1 { - t.Fatal(v + " not found in cookie") - } -} - -func TestWithBasicAuth(t *testing.T) { - str, err := Get("http://httpbin.org/basic-auth/user/passwd").SetBasicAuth("user", "passwd").String() - require.NoError(t, err) - t.Log(str) n := strings.Index(str, "authenticated") - if n == -1 { - t.Fatal("authenticated not found in response") - } + require.NotEqual(t, -1, n) } -func TestWithUserAgent(t *testing.T) { +func (h *HttplibTestSuite) TestWithUserAgent() { + t := h.T() v := "beego" - str, err := Get("http://httpbin.org/headers").SetUserAgent(v).String() + str, err := Get("http://localhost:8080/headers").SetUserAgent(v).String() require.NoError(t, err) - t.Log(str) - n := strings.Index(str, v) - if n == -1 { - t.Fatal(v + " not found in user-agent") - } + require.NotEqual(t, -1, n) } -func TestWithSetting(t *testing.T) { +func (h *HttplibTestSuite) TestWithSetting() { + t := h.T() v := "beego" var setting BeegoHTTPSettings setting.EnableCookie = true @@ -181,75 +239,68 @@ func TestWithSetting(t *testing.T) { setting.ReadWriteTimeout = 5 * time.Second SetDefaultSetting(setting) - str, err := Get("http://httpbin.org/get").String() + str, err := Get("http://localhost:8080/get").String() require.NoError(t, err) - t.Log(str) - n := strings.Index(str, v) - if n == -1 { - t.Fatal(v + " not found in user-agent") - } + require.NotEqual(t, -1, n) } -func TestToJson(t *testing.T) { - req := Get("http://httpbin.org/ip") +func (h *HttplibTestSuite) TestToJson() { + t := h.T() + req := Get("http://localhost:8080/ip") resp, err := req.Response() require.NoError(t, err) t.Log(resp) - // httpbin will return http remote addr type IP struct { Origin string `json:"origin"` } var ip IP err = req.ToJSON(&ip) require.NoError(t, err) - t.Log(ip.Origin) + require.Equal(t, "127.0.0.1", ip.Origin) + ips := strings.Split(ip.Origin, ",") - if len(ips) == 0 { - t.Fatal("response is not valid ip") - } - for i := range ips { - if net.ParseIP(strings.TrimSpace(ips[i])).To4() == nil { - t.Fatal("response is not valid ip") - } - } + require.NotEmpty(t, ips) } -func TestToFile(t *testing.T) { +func (h *HttplibTestSuite) TestToFile() { + t := h.T() f := "beego_testfile" - req := Get("http://httpbin.org/ip") + req := Get("http://localhost:8080/ip") err := req.ToFile(f) require.NoError(t, err) defer os.Remove(f) - b, err := ioutil.ReadFile(f) - if n := bytes.Index(b, []byte("origin")); n == -1 { - t.Fatal(err) - } + + b, err := os.ReadFile(f) + n := bytes.Index(b, []byte("origin")) + require.NotEqual(t, -1, n) } -func TestToFileDir(t *testing.T) { +func (h *HttplibTestSuite) TestToFileDir() { + t := h.T() f := "./files/beego_testfile" - req := Get("http://httpbin.org/ip") + req := Get("http://localhost:8080/ip") err := req.ToFile(f) require.NoError(t, err) defer os.RemoveAll("./files") - b, err := ioutil.ReadFile(f) - if n := bytes.Index(b, []byte("origin")); n == -1 { - t.Fatal(err) - } + b, err := os.ReadFile(f) + require.NoError(t, err) + n := bytes.Index(b, []byte("origin")) + require.NotEqual(t, -1, n) } -func TestHeader(t *testing.T) { - req := Get("http://httpbin.org/headers") +func (h *HttplibTestSuite) TestHeader() { + t := h.T() + req := Get("http://localhost:8080/headers") req.Header("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36") - str, err := req.String() + _, err := req.String() require.NoError(t, err) - t.Log(str) } // TestAddFilter make sure that AddFilters only work for the specific request -func TestAddFilter(t *testing.T) { +func (h *HttplibTestSuite) TestAddFilter() { + t := h.T() req := Get("http://beego.vip") req.AddFilters(func(next Filter) Filter { return func(ctx context.Context, req *BeegoHTTPRequest) (*http.Response, error) { @@ -261,7 +312,8 @@ func TestAddFilter(t *testing.T) { assert.Equal(t, 1, len(req.setting.FilterChains)-len(r.setting.FilterChains)) } -func TestFilterChainOrder(t *testing.T) { +func (h *HttplibTestSuite) TestFilterChainOrder() { + t := h.T() req := Get("http://beego.vip") req.AddFilters(func(next Filter) Filter { return func(ctx context.Context, req *BeegoHTTPRequest) (*http.Response, error) { @@ -282,24 +334,34 @@ func TestFilterChainOrder(t *testing.T) { assert.Equal(t, "first", string(data)) } -func TestHead(t *testing.T) { +func (h *HttplibTestSuite) TestHead() { + t := h.T() req := Head("http://beego.vip") assert.NotNil(t, req) assert.Equal(t, "HEAD", req.req.Method) } -func TestDelete(t *testing.T) { +func (h *HttplibTestSuite) TestDelete() { + t := h.T() req := Delete("http://beego.vip") assert.NotNil(t, req) assert.Equal(t, "DELETE", req.req.Method) } -func TestPost(t *testing.T) { +func (h *HttplibTestSuite) TestPost() { + t := h.T() req := Post("http://beego.vip") assert.NotNil(t, req) assert.Equal(t, "POST", req.req.Method) } +func (h *HttplibTestSuite) TestPut() { + t := h.T() + req := Put("http://beego.vip") + assert.NotNil(t, req) + assert.Equal(t, "PUT", req.req.Method) +} + func TestNewBeegoRequest(t *testing.T) { req := NewBeegoRequest("http://beego.vip", "GET") assert.NotNil(t, req) @@ -341,12 +403,6 @@ func TestBeegoHTTPRequestSetProtocolVersion(t *testing.T) { assert.Equal(t, 1, req.req.ProtoMinor) } -func TestPut(t *testing.T) { - req := Put("http://beego.vip") - assert.NotNil(t, req) - assert.Equal(t, "PUT", req.req.Method) -} - func TestBeegoHTTPRequestHeader(t *testing.T) { req := Post("http://beego.vip") key, value := "test-header", "test-header-value" diff --git a/client/orm/mock/mock_orm.go b/client/orm/mock/mock_orm.go index ce6712a4..77fe2496 100644 --- a/client/orm/mock/mock_orm.go +++ b/client/orm/mock/mock_orm.go @@ -106,8 +106,10 @@ func MockDeleteWithCtx(tableName string, affectedRow int64, err error) *Mock { // Now you may be need to use golang/mock to generate QueryM2M mock instance // Or use DoNothingQueryM2Mer // for example: -// post := Post{Id: 4} -// m2m := Ormer.QueryM2M(&post, "Tags") +// +// post := Post{Id: 4} +// m2m := Ormer.QueryM2M(&post, "Tags") +// // when you write test code: // MockQueryM2MWithCtx("post", "Tags", mockM2Mer) // "post" is the table name of model Post structure diff --git a/client/orm/orm.go b/client/orm/orm.go index 2c27a290..3f4a374b 100644 --- a/client/orm/orm.go +++ b/client/orm/orm.go @@ -50,7 +50,6 @@ // // delete // num, err = o.Delete(&u) // } -// package orm import ( @@ -324,8 +323,9 @@ func (o *ormBase) QueryM2MWithCtx(_ context.Context, md interface{}, name string // args are limit, offset int and order string. // // example: -// orm.LoadRelated(post,"Tags") -// for _,tag := range post.Tags{...} +// +// orm.LoadRelated(post,"Tags") +// for _,tag := range post.Tags{...} // // make sure the relation is defined in model struct tags. func (o *ormBase) LoadRelated(md interface{}, name string, args ...utils.KV) (int64, error) { diff --git a/client/orm/orm_querym2m.go b/client/orm/orm_querym2m.go index 9da49bba..44312ae3 100644 --- a/client/orm/orm_querym2m.go +++ b/client/orm/orm_querym2m.go @@ -30,9 +30,10 @@ type queryM2M struct { // add models to origin models when creating queryM2M. // example: -// m2m := orm.QueryM2M(post,"Tag") -// m2m.Add(&Tag1{},&Tag2{}) -// for _,tag := range post.Tags{} +// +// m2m := orm.QueryM2M(post,"Tag") +// m2m.Add(&Tag1{},&Tag2{}) +// for _,tag := range post.Tags{} // // make sure the relation is defined in post model struct tag. func (o *queryM2M) Add(mds ...interface{}) (int64, error) { diff --git a/client/orm/orm_queryset.go b/client/orm/orm_queryset.go index 82325899..c922a37f 100644 --- a/client/orm/orm_queryset.go +++ b/client/orm/orm_queryset.go @@ -43,9 +43,10 @@ const ( ) // ColValue do the field raw changes. e.g Nums = Nums + 10. usage: -// Params{ -// "Nums": ColValue(Col_Add, 10), -// } +// +// Params{ +// "Nums": ColValue(Col_Add, 10), +// } func ColValue(opt operator, value interface{}) interface{} { switch opt { case ColAdd, ColMinus, ColMultiply, ColExcept, ColBitAnd, ColBitRShift, @@ -260,8 +261,9 @@ func (o *querySet) DeleteWithCtx(ctx context.Context) (int64, error) { // return an insert queryer. // it can be used in times. // example: -// i,err := sq.PrepareInsert() -// i.Add(&user1{},&user2{}) +// +// i,err := sq.PrepareInsert() +// i.Add(&user1{},&user2{}) func (o *querySet) PrepareInsert() (Inserter, error) { return o.PrepareInsertWithCtx(context.Background()) } @@ -339,10 +341,11 @@ func (o *querySet) ValuesFlatWithCtx(ctx context.Context, result *ParamsList, ex // name | value // total | 100 // found | 200 -// to map[string]interface{}{ -// "total": 100, -// "found": 200, -// } +// +// to map[string]interface{}{ +// "total": 100, +// "found": 200, +// } func (o *querySet) RowsToMap(result *Params, keyCol, valueCol string) (int64, error) { panic(ErrNotImplement) } @@ -353,10 +356,11 @@ func (o *querySet) RowsToMap(result *Params, keyCol, valueCol string) (int64, er // name | value // total | 100 // found | 200 -// to struct { -// Total int -// Found int -// } +// +// to struct { +// Total int +// Found int +// } func (o *querySet) RowsToStruct(ptrStruct interface{}, keyCol, valueCol string) (int64, error) { panic(ErrNotImplement) } diff --git a/client/orm/orm_raw.go b/client/orm/orm_raw.go index f4f3a62e..f40d7c86 100644 --- a/client/orm/orm_raw.go +++ b/client/orm/orm_raw.go @@ -874,10 +874,11 @@ func (o *rawSet) ValuesFlat(container *ParamsList, cols ...string) (int64, error // name | value // total | 100 // found | 200 -// to map[string]interface{}{ -// "total": 100, -// "found": 200, -// } +// +// to map[string]interface{}{ +// "total": 100, +// "found": 200, +// } func (o *rawSet) RowsToMap(result *Params, keyCol, valueCol string) (int64, error) { return o.queryRowsTo(result, keyCol, valueCol) } @@ -888,10 +889,11 @@ func (o *rawSet) RowsToMap(result *Params, keyCol, valueCol string) (int64, erro // name | value // total | 100 // found | 200 -// to struct { -// Total int -// Found int -// } +// +// to struct { +// Total int +// Found int +// } func (o *rawSet) RowsToStruct(ptrStruct interface{}, keyCol, valueCol string) (int64, error) { return o.queryRowsTo(ptrStruct, keyCol, valueCol) } diff --git a/client/orm/types.go b/client/orm/types.go index df50a500..140eeda3 100644 --- a/client/orm/types.go +++ b/client/orm/types.go @@ -27,12 +27,14 @@ import ( // TableNaming is usually used by model // when you custom your table name, please implement this interfaces // for example: -// type User struct { -// ... -// } -// func (u *User) TableName() string { -// return "USER_TABLE" -// } +// +// type User struct { +// ... +// } +// +// func (u *User) TableName() string { +// return "USER_TABLE" +// } type TableNameI interface { TableName() string } @@ -40,12 +42,14 @@ type TableNameI interface { // TableEngineI is usually used by model // when you want to use specific engine, like myisam, you can implement this interface // for example: -// type User struct { -// ... -// } -// func (u *User) TableEngine() string { -// return "myisam" -// } +// +// type User struct { +// ... +// } +// +// func (u *User) TableEngine() string { +// return "myisam" +// } type TableEngineI interface { TableEngine() string } @@ -53,12 +57,14 @@ type TableEngineI interface { // TableIndexI is usually used by model // when you want to create indexes, you can implement this interface // for example: -// type User struct { -// ... -// } -// func (u *User) TableIndex() [][]string { -// return [][]string{{"Name"}} -// } +// +// type User struct { +// ... +// } +// +// func (u *User) TableIndex() [][]string { +// return [][]string{{"Name"}} +// } type TableIndexI interface { TableIndex() [][]string } @@ -66,12 +72,14 @@ type TableIndexI interface { // TableUniqueI is usually used by model // when you want to create unique indexes, you can implement this interface // for example: -// type User struct { -// ... -// } -// func (u *User) TableUnique() [][]string { -// return [][]string{{"Email"}} -// } +// +// type User struct { +// ... +// } +// +// func (u *User) TableUnique() [][]string { +// return [][]string{{"Email"}} +// } type TableUniqueI interface { TableUnique() [][]string } @@ -526,8 +534,9 @@ type RawPreparer interface { // RawSeter raw query seter // create From Ormer.Raw // for example: -// sql := fmt.Sprintf("SELECT %sid%s,%sname%s FROM %suser%s WHERE id = ?",Q,Q,Q,Q,Q,Q) -// rs := Ormer.Raw(sql, 1) +// +// sql := fmt.Sprintf("SELECT %sid%s,%sname%s FROM %suser%s WHERE id = ?",Q,Q,Q,Q,Q,Q) +// rs := Ormer.Raw(sql, 1) type RawSeter interface { // execute sql and get result Exec() (sql.Result, error) diff --git a/core/admin/healthcheck.go b/core/admin/healthcheck.go index ea155b86..077b1c53 100644 --- a/core/admin/healthcheck.go +++ b/core/admin/healthcheck.go @@ -17,16 +17,15 @@ // type DatabaseCheck struct { // } // -// func (dc *DatabaseCheck) Check() error { -// if dc.isConnected() { -// return nil -// } else { -// return errors.New("can't connect database") -// } -// } +// func (dc *DatabaseCheck) Check() error { +// if dc.isConnected() { +// return nil +// } else { +// return errors.New("can't connect database") +// } +// } // // AddHealthCheck("database",&DatabaseCheck{}) -// package admin // AdminCheckList holds health checker map diff --git a/core/config/config.go b/core/config/config.go index 1222fb49..145333f9 100644 --- a/core/config/config.go +++ b/core/config/config.go @@ -14,29 +14,31 @@ // Package config is used to parse config. // Usage: -// import "github.com/beego/beego/v2/core/config" +// +// import "github.com/beego/beego/v2/core/config" +// // Examples. // -// cnf, err := config.NewConfig("ini", "config.conf") +// cnf, err := config.NewConfig("ini", "config.conf") // -// cnf APIS: +// cnf APIS: // -// cnf.Set(key, val string) error -// cnf.String(key string) string -// cnf.Strings(key string) []string -// cnf.Int(key string) (int, error) -// cnf.Int64(key string) (int64, error) -// cnf.Bool(key string) (bool, error) -// cnf.Float(key string) (float64, error) -// cnf.DefaultString(key string, defaultVal string) string -// cnf.DefaultStrings(key string, defaultVal []string) []string -// cnf.DefaultInt(key string, defaultVal int) int -// cnf.DefaultInt64(key string, defaultVal int64) int64 -// cnf.DefaultBool(key string, defaultVal bool) bool -// cnf.DefaultFloat(key string, defaultVal float64) float64 -// cnf.DIY(key string) (interface{}, error) -// cnf.GetSection(section string) (map[string]string, error) -// cnf.SaveConfigFile(filename string) error +// cnf.Set(key, val string) error +// cnf.String(key string) string +// cnf.Strings(key string) []string +// cnf.Int(key string) (int, error) +// cnf.Int64(key string) (int64, error) +// cnf.Bool(key string) (bool, error) +// cnf.Float(key string) (float64, error) +// cnf.DefaultString(key string, defaultVal string) string +// cnf.DefaultStrings(key string, defaultVal []string) []string +// cnf.DefaultInt(key string, defaultVal int) int +// cnf.DefaultInt64(key string, defaultVal int64) int64 +// cnf.DefaultBool(key string, defaultVal bool) bool +// cnf.DefaultFloat(key string, defaultVal float64) float64 +// cnf.DIY(key string) (interface{}, error) +// cnf.GetSection(section string) (map[string]string, error) +// cnf.SaveConfigFile(filename string) error package config import ( @@ -266,6 +268,7 @@ func ExpandValueEnvForMap(m map[string]interface{}) map[string]interface{} { // // It accept value formats "${env}" , "${env||}}" , "${env||defaultValue}" , "defaultvalue". // Examples: +// // v1 := config.ExpandValueEnv("${GOPATH}") // return the GOPATH environment variable. // v2 := config.ExpandValueEnv("${GOAsta||/usr/local/go}") // return the default value "/usr/local/go/". // v3 := config.ExpandValueEnv("Astaxie") // return the value "Astaxie". diff --git a/core/config/env/env_test.go b/core/config/env/env_test.go index 1cd88147..eabff737 100644 --- a/core/config/env/env_test.go +++ b/core/config/env/env_test.go @@ -5,7 +5,7 @@ // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // -// http://www.apache.org/licenses/LICENSE-2.0 +// http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, diff --git a/core/config/xml/xml.go b/core/config/xml/xml.go index 173f2246..1d7494b4 100644 --- a/core/config/xml/xml.go +++ b/core/config/xml/xml.go @@ -19,13 +19,13 @@ // go install github.com/beego/x2j. // // Usage: -// import( -// _ "github.com/beego/beego/v2/core/config/xml" -// "github.com/beego/beego/v2/core/config" -// ) // -// cnf, err := config.NewConfig("xml", "config.xml") +// import( +// _ "github.com/beego/beego/v2/core/config/xml" +// "github.com/beego/beego/v2/core/config" +// ) // +// cnf, err := config.NewConfig("xml", "config.xml") package xml import ( @@ -40,9 +40,10 @@ import ( "github.com/mitchellh/mapstructure" + "github.com/beego/x2j" + "github.com/beego/beego/v2/core/config" "github.com/beego/beego/v2/core/logs" - "github.com/beego/x2j" ) // Config is a xml config parser and implements Config interface. diff --git a/core/config/yaml/yaml.go b/core/config/yaml/yaml.go index b18ce06b..1af53b75 100644 --- a/core/config/yaml/yaml.go +++ b/core/config/yaml/yaml.go @@ -14,13 +14,13 @@ // Package yaml for config provider // Usage: -// import( -// _ "github.com/beego/beego/v2/core/config/yaml" -// "github.com/beego/beego/v2/core/config" -// ) // -// cnf, err := config.NewConfig("yaml", "config.yaml") +// import( +// _ "github.com/beego/beego/v2/core/config/yaml" +// "github.com/beego/beego/v2/core/config" +// ) // +// cnf, err := config.NewConfig("yaml", "config.yaml") package yaml import ( diff --git a/core/logs/file.go b/core/logs/file.go index 3234a674..b50369e7 100644 --- a/core/logs/file.go +++ b/core/logs/file.go @@ -110,15 +110,16 @@ func (w *fileLogWriter) SetFormatter(f LogFormatter) { // Init file logger with json config. // jsonConfig like: -// { -// "filename":"logs/beego.log", -// "maxLines":10000, -// "maxsize":1024, -// "daily":true, -// "maxDays":15, -// "rotate":true, -// "perm":"0600" -// } +// +// { +// "filename":"logs/beego.log", +// "maxLines":10000, +// "maxsize":1024, +// "daily":true, +// "maxDays":15, +// "rotate":true, +// "perm":"0600" +// } func (w *fileLogWriter) Init(config string) error { err := json.Unmarshal([]byte(config), w) if err != nil { diff --git a/core/logs/smtp.go b/core/logs/smtp.go index 40891a7c..10630070 100644 --- a/core/logs/smtp.go +++ b/core/logs/smtp.go @@ -47,6 +47,7 @@ func newSMTPWriter() Logger { // Init smtp writer with json config. // config like: +// // { // "username":"example@gmail.com", // "password:"password", diff --git a/core/utils/pagination/doc.go b/core/utils/pagination/doc.go index 808301a5..78beccd3 100644 --- a/core/utils/pagination/doc.go +++ b/core/utils/pagination/doc.go @@ -2,53 +2,51 @@ Package pagination provides utilities to setup a paginator within the context of a http request. -Usage +# Usage In your beego.Controller: - package controllers + package controllers - import "github.com/beego/beego/v2/core/utils/pagination" + import "github.com/beego/beego/v2/core/utils/pagination" - type PostsController struct { - beego.Controller - } + type PostsController struct { + beego.Controller + } - func (this *PostsController) ListAllPosts() { - // sets this.Data["paginator"] with the current offset (from the url query param) - postsPerPage := 20 - paginator := pagination.SetPaginator(this.Ctx, postsPerPage, CountPosts()) - - // fetch the next 20 posts - this.Data["posts"] = ListPostsByOffsetAndLimit(paginator.Offset(), postsPerPage) - } + func (this *PostsController) ListAllPosts() { + // sets this.Data["paginator"] with the current offset (from the url query param) + postsPerPage := 20 + paginator := pagination.SetPaginator(this.Ctx, postsPerPage, CountPosts()) + // fetch the next 20 posts + this.Data["posts"] = ListPostsByOffsetAndLimit(paginator.Offset(), postsPerPage) + } In your view templates: - {{if .paginator.HasPages}} - - {{end}} - + {{if .paginator.HasPages}} + + {{end}} */ package pagination diff --git a/core/utils/pagination/paginator.go b/core/utils/pagination/paginator.go index c6db31e0..6a9ca7c4 100644 --- a/core/utils/pagination/paginator.go +++ b/core/utils/pagination/paginator.go @@ -78,11 +78,11 @@ func (p *Paginator) Page() int { // // Usage (in a view template): // -// {{range $index, $page := .paginator.Pages}} -// -// {{$page}} -// -// {{end}} +// {{range $index, $page := .paginator.Pages}} +// +// {{$page}} +// +// {{end}} func (p *Paginator) Pages() []int { if p.pageRange == nil && p.nums > 0 { var pages []int diff --git a/core/validation/util.go b/core/validation/util.go index 918b206c..69a43243 100644 --- a/core/validation/util.go +++ b/core/validation/util.go @@ -67,13 +67,15 @@ type CustomFunc func(v *Validation, obj interface{}, key string) // AddCustomFunc Add a custom function to validation // The name can not be: -// Clear -// HasErrors -// ErrorMap -// Error -// Check -// Valid -// NoMatch +// +// Clear +// HasErrors +// ErrorMap +// Error +// Check +// Valid +// NoMatch +// // If the name is same with exists function, it will replace the origin valid function func AddCustomFunc(name string, f CustomFunc) error { if unFuncs[name] { diff --git a/core/validation/validation.go b/core/validation/validation.go index a6e502c7..33d466fa 100644 --- a/core/validation/validation.go +++ b/core/validation/validation.go @@ -42,7 +42,6 @@ // log.Println(v.Error.Key, v.Error.Message) // } // } -// package validation import ( diff --git a/core/validation/validators.go b/core/validation/validators.go index c4ea1f51..3150fda5 100644 --- a/core/validation/validators.go +++ b/core/validation/validators.go @@ -64,26 +64,27 @@ var once sync.Once // SetDefaultMessage set default messages // if not set, the default messages are -// "Required": "Can not be empty", -// "Min": "Minimum is %d", -// "Max": "Maximum is %d", -// "Range": "Range is %d to %d", -// "MinSize": "Minimum size is %d", -// "MaxSize": "Maximum size is %d", -// "Length": "Required length is %d", -// "Alpha": "Must be valid alpha characters", -// "Numeric": "Must be valid numeric characters", -// "AlphaNumeric": "Must be valid alpha or numeric characters", -// "Match": "Must match %s", -// "NoMatch": "Must not match %s", -// "AlphaDash": "Must be valid alpha or numeric or dash(-_) characters", -// "Email": "Must be a valid email address", -// "IP": "Must be a valid ip address", -// "Base64": "Must be valid base64 characters", -// "Mobile": "Must be valid mobile number", -// "Tel": "Must be valid telephone number", -// "Phone": "Must be valid telephone or mobile phone number", -// "ZipCode": "Must be valid zipcode", +// +// "Required": "Can not be empty", +// "Min": "Minimum is %d", +// "Max": "Maximum is %d", +// "Range": "Range is %d to %d", +// "MinSize": "Minimum size is %d", +// "MaxSize": "Maximum size is %d", +// "Length": "Required length is %d", +// "Alpha": "Must be valid alpha characters", +// "Numeric": "Must be valid numeric characters", +// "AlphaNumeric": "Must be valid alpha or numeric characters", +// "Match": "Must match %s", +// "NoMatch": "Must not match %s", +// "AlphaDash": "Must be valid alpha or numeric or dash(-_) characters", +// "Email": "Must be a valid email address", +// "IP": "Must be a valid ip address", +// "Base64": "Must be valid base64 characters", +// "Mobile": "Must be valid mobile number", +// "Tel": "Must be valid telephone number", +// "Phone": "Must be valid telephone or mobile phone number", +// "ZipCode": "Must be valid zipcode", func SetDefaultMessage(msg map[string]string) { if len(msg) == 0 { return diff --git a/server/web/admin.go b/server/web/admin.go index 56d2906f..10c80d6d 100644 --- a/server/web/admin.go +++ b/server/web/admin.go @@ -30,7 +30,8 @@ var beeAdminApp *adminApp // FilterMonitorFunc is default monitor filter when admin module is enable. // if this func returns, admin module records qps for this request by condition of this function logic. // usage: -// func MyFilterMonitor(method, requestPath string, t time.Duration, pattern string, statusCode int) bool { +// +// func MyFilterMonitor(method, requestPath string, t time.Duration, pattern string, statusCode int) bool { // if method == "POST" { // return false // } @@ -41,8 +42,8 @@ var beeAdminApp *adminApp // return false // } // return true -// } -// beego.FilterMonitorFunc = MyFilterMonitor. +// } +// beego.FilterMonitorFunc = MyFilterMonitor. var FilterMonitorFunc func(string, string, time.Duration, string, int) bool func init() { diff --git a/server/web/captcha/captcha.go b/server/web/captcha/captcha.go index 6d8c33b4..827c7276 100644 --- a/server/web/captcha/captcha.go +++ b/server/web/captcha/captcha.go @@ -19,32 +19,35 @@ // package controllers // // import ( -// "github.com/beego/beego/v2" -// "github.com/beego/beego/v2/client/cache" -// "github.com/beego/beego/v2/server/web/captcha" +// +// "github.com/beego/beego/v2" +// "github.com/beego/beego/v2/client/cache" +// "github.com/beego/beego/v2/server/web/captcha" +// // ) // // var cpt *captcha.Captcha // -// func init() { -// // use beego cache system store the captcha data -// store := cache.NewMemoryCache() -// cpt = captcha.NewWithFilter("/captcha/", store) -// } +// func init() { +// // use beego cache system store the captcha data +// store := cache.NewMemoryCache() +// cpt = captcha.NewWithFilter("/captcha/", store) +// } // -// type MainController struct { -// beego.Controller -// } +// type MainController struct { +// beego.Controller +// } // -// func (this *MainController) Get() { -// this.TplName = "index.tpl" -// } +// func (this *MainController) Get() { +// this.TplName = "index.tpl" +// } // -// func (this *MainController) Post() { -// this.TplName = "index.tpl" +// func (this *MainController) Post() { +// this.TplName = "index.tpl" +// +// this.Data["Success"] = cpt.VerifyReq(this.Ctx.Request) +// } // -// this.Data["Success"] = cpt.VerifyReq(this.Ctx.Request) -// } // ``` // // template usage @@ -52,8 +55,10 @@ // ``` // {{.Success}} //
-// {{create_captcha}} -// +// +// {{create_captcha}} +// +// //
// ``` package captcha diff --git a/server/web/context/context.go b/server/web/context/context.go index 8d0a3f3a..4adff2c7 100644 --- a/server/web/context/context.go +++ b/server/web/context/context.go @@ -18,7 +18,6 @@ // import "github.com/beego/beego/v2/server/web/context" // // ctx := context.Context{Request:req,ResponseWriter:rw} -// package context import ( diff --git a/server/web/controller.go b/server/web/controller.go index 90cc2dd3..68b1fc64 100644 --- a/server/web/controller.go +++ b/server/web/controller.go @@ -635,31 +635,33 @@ func (c *Controller) GetFile(key string) (multipart.File, *multipart.FileHeader, // GetFiles return multi-upload files // files, err:=c.GetFiles("myfiles") +// // if err != nil { // http.Error(w, err.Error(), http.StatusNoContent) // return // } -// for i, _ := range files { -// //for each fileheader, get a handle to the actual file -// file, err := files[i].Open() -// defer file.Close() -// if err != nil { -// http.Error(w, err.Error(), http.StatusInternalServerError) -// return +// +// for i, _ := range files { +// //for each fileheader, get a handle to the actual file +// file, err := files[i].Open() +// defer file.Close() +// if err != nil { +// http.Error(w, err.Error(), http.StatusInternalServerError) +// return +// } +// //create destination file making sure the path is writeable. +// dst, err := os.Create("upload/" + files[i].Filename) +// defer dst.Close() +// if err != nil { +// http.Error(w, err.Error(), http.StatusInternalServerError) +// return +// } +// //copy the uploaded file to the destination file +// if _, err := io.Copy(dst, file); err != nil { +// http.Error(w, err.Error(), http.StatusInternalServerError) +// return +// } // } -// //create destination file making sure the path is writeable. -// dst, err := os.Create("upload/" + files[i].Filename) -// defer dst.Close() -// if err != nil { -// http.Error(w, err.Error(), http.StatusInternalServerError) -// return -// } -// //copy the uploaded file to the destination file -// if _, err := io.Copy(dst, file); err != nil { -// http.Error(w, err.Error(), http.StatusInternalServerError) -// return -// } -// } func (c *Controller) GetFiles(key string) ([]*multipart.FileHeader, error) { if files, ok := c.Ctx.Request.MultipartForm.File[key]; ok { return files, nil diff --git a/server/web/doc.go b/server/web/doc.go index dd62b41a..2ea053e4 100644 --- a/server/web/doc.go +++ b/server/web/doc.go @@ -11,6 +11,5 @@ beego is inspired by Tornado, Sinatra and Flask with the added benefit of some G func main() { beego.Run() } - */ package web diff --git a/server/web/error.go b/server/web/error.go index 118585dc..da35ad8a 100644 --- a/server/web/error.go +++ b/server/web/error.go @@ -386,7 +386,8 @@ func responseError(rw http.ResponseWriter, r *http.Request, errCode int, errCont // ErrorHandler registers http.HandlerFunc to each http err code string. // usage: -// beego.ErrorHandler("404",NotFound) +// +// beego.ErrorHandler("404",NotFound) // beego.ErrorHandler("500",InternalServerError) func ErrorHandler(code string, h http.HandlerFunc) *HttpServer { ErrorMaps[code] = &errorInfo{ @@ -399,7 +400,8 @@ func ErrorHandler(code string, h http.HandlerFunc) *HttpServer { // ErrorController registers ControllerInterface to each http err code string. // usage: -// beego.ErrorController(&controllers.ErrorController{}) +// +// beego.ErrorController(&controllers.ErrorController{}) func ErrorController(c ControllerInterface) *HttpServer { reflectVal := reflect.ValueOf(c) rt := reflectVal.Type() diff --git a/server/web/filter.go b/server/web/filter.go index 2237703d..8ada5b32 100644 --- a/server/web/filter.go +++ b/server/web/filter.go @@ -43,8 +43,8 @@ type FilterRouter struct { } // params is for: -// 1. setting the returnOnOutput value (false allows multiple filters to execute) -// 2. determining whether or not params need to be reset. +// 1. setting the returnOnOutput value (false allows multiple filters to execute) +// 2. determining whether or not params need to be reset. func newFilterRouter(pattern string, filter FilterFunc, opts ...FilterOpt) *FilterRouter { mr := &FilterRouter{ tree: NewTree(), diff --git a/server/web/filter/apiauth/apiauth.go b/server/web/filter/apiauth/apiauth.go index 55a914a2..104d1770 100644 --- a/server/web/filter/apiauth/apiauth.go +++ b/server/web/filter/apiauth/apiauth.go @@ -15,6 +15,7 @@ // Package apiauth provides handlers to enable apiauth support. // // Simple Usage: +// // import( // "github.com/beego/beego/v2" // "github.com/beego/beego/v2/server/web/filter/apiauth" @@ -37,11 +38,11 @@ // // Information: // -// In the request user should include these params in the query +// # In the request user should include these params in the query // // 1. appid // -// appid is assigned to the application +// appid is assigned to the application // // 2. signature // @@ -51,8 +52,7 @@ // // 3. timestamp: // -// send the request time, the format is yyyy-mm-dd HH:ii:ss -// +// send the request time, the format is yyyy-mm-dd HH:ii:ss package apiauth import ( diff --git a/server/web/filter/auth/basic.go b/server/web/filter/auth/basic.go index 403d4b2c..2881d7cf 100644 --- a/server/web/filter/auth/basic.go +++ b/server/web/filter/auth/basic.go @@ -14,6 +14,7 @@ // Package auth provides handlers to enable basic auth support. // Simple Usage: +// // import( // "github.com/beego/beego/v2" // "github.com/beego/beego/v2/server/web/filter/auth" @@ -25,7 +26,6 @@ // beego.Run() // } // -// // Advanced Usage: // // func SecretAuth(username, password string) bool { diff --git a/server/web/filter/authz/authz.go b/server/web/filter/authz/authz.go index 4ff2d6bf..7475ea6c 100644 --- a/server/web/filter/authz/authz.go +++ b/server/web/filter/authz/authz.go @@ -14,6 +14,7 @@ // Package authz provides handlers to enable ACL, RBAC, ABAC authorization support. // Simple Usage: +// // import( // "github.com/beego/beego/v2" // "github.com/beego/beego/v2/server/web/filter/authz" @@ -26,7 +27,6 @@ // beego.Run() // } // -// // Advanced Usage: // // func main(){ diff --git a/server/web/filter/cors/cors.go b/server/web/filter/cors/cors.go index f6c68ca0..4c5cb5b7 100644 --- a/server/web/filter/cors/cors.go +++ b/server/web/filter/cors/cors.go @@ -14,9 +14,11 @@ // Package cors provides handlers to enable CORS support. // Usage +// // import ( -// "github.com/beego/beego/v2" +// "github.com/beego/beego/v2" // "github.com/beego/beego/v2/server/web/filter/cors" +// // ) // // func main() { diff --git a/server/web/grace/grace.go b/server/web/grace/grace.go index bad7e61d..cefc890b 100644 --- a/server/web/grace/grace.go +++ b/server/web/grace/grace.go @@ -18,28 +18,30 @@ // Usage: // // import( -// "log" -// "net/http" -// "os" // -// "github.com/beego/beego/v2/server/web/grace" +// "log" +// "net/http" +// "os" +// +// "github.com/beego/beego/v2/server/web/grace" +// // ) // -// func handler(w http.ResponseWriter, r *http.Request) { -// w.Write([]byte("WORLD!")) -// } +// func handler(w http.ResponseWriter, r *http.Request) { +// w.Write([]byte("WORLD!")) +// } // -// func main() { -// mux := http.NewServeMux() -// mux.HandleFunc("/hello", handler) +// func main() { +// mux := http.NewServeMux() +// mux.HandleFunc("/hello", handler) // -// err := grace.ListenAndServe("localhost:8080", mux) -// if err != nil { -// log.Println(err) -// } -// log.Println("Server on 8080 stopped") -// os.Exit(0) -// } +// err := grace.ListenAndServe("localhost:8080", mux) +// if err != nil { +// log.Println(err) +// } +// log.Println("Server on 8080 stopped") +// os.Exit(0) +// } package grace import ( diff --git a/server/web/namespace.go b/server/web/namespace.go index 8da8a797..0a9c7e6e 100644 --- a/server/web/namespace.go +++ b/server/web/namespace.go @@ -47,12 +47,14 @@ func NewNamespace(prefix string, params ...LinkNamespace) *Namespace { // Cond set condition function // if cond return true can run this namespace, else can't // usage: -// ns.Cond(func (ctx *context.Context) bool{ -// if ctx.Input.Domain() == "api.beego.vip" { -// return true -// } -// return false -// }) +// +// ns.Cond(func (ctx *context.Context) bool{ +// if ctx.Input.Domain() == "api.beego.vip" { +// return true +// } +// return false +// }) +// // Cond as the first filter func (n *Namespace) Cond(cond namespaceCond) *Namespace { fn := func(ctx *beecontext.Context) { @@ -77,12 +79,13 @@ func (n *Namespace) Cond(cond namespaceCond) *Namespace { // action has before & after // FilterFunc // usage: -// Filter("before", func (ctx *context.Context){ -// _, ok := ctx.Input.Session("uid").(int) -// if !ok && ctx.Request.RequestURI != "/login" { -// ctx.Redirect(302, "/login") -// } -// }) +// +// Filter("before", func (ctx *context.Context){ +// _, ok := ctx.Input.Session("uid").(int) +// if !ok && ctx.Request.RequestURI != "/login" { +// ctx.Redirect(302, "/login") +// } +// }) func (n *Namespace) Filter(action string, filter ...FilterFunc) *Namespace { var a int if action == "before" { @@ -239,18 +242,20 @@ func (n *Namespace) CtrlAny(rootpath string, f interface{}) *Namespace { // usage: // ns := beego.NewNamespace(“/v1”). // Namespace( -// beego.NewNamespace("/shop"). -// Get("/:id", func(ctx *context.Context) { -// ctx.Output.Body([]byte("shopinfo")) -// }), -// beego.NewNamespace("/order"). -// Get("/:id", func(ctx *context.Context) { -// ctx.Output.Body([]byte("orderinfo")) -// }), -// beego.NewNamespace("/crm"). -// Get("/:id", func(ctx *context.Context) { -// ctx.Output.Body([]byte("crminfo")) -// }), +// +// beego.NewNamespace("/shop"). +// Get("/:id", func(ctx *context.Context) { +// ctx.Output.Body([]byte("shopinfo")) +// }), +// beego.NewNamespace("/order"). +// Get("/:id", func(ctx *context.Context) { +// ctx.Output.Body([]byte("orderinfo")) +// }), +// beego.NewNamespace("/crm"). +// Get("/:id", func(ctx *context.Context) { +// ctx.Output.Body([]byte("crminfo")) +// }), +// // ) func (n *Namespace) Namespace(ns ...*Namespace) *Namespace { for _, ni := range ns { diff --git a/server/web/session/session.go b/server/web/session/session.go index 7e46bb7f..a83542ec 100644 --- a/server/web/session/session.go +++ b/server/web/session/session.go @@ -16,14 +16,15 @@ // // Usage: // import( -// "github.com/beego/beego/v2/server/web/session" +// +// "github.com/beego/beego/v2/server/web/session" +// // ) // -// func init() { -// globalSessions, _ = session.NewManager("memory", `{"cookieName":"gosessionid", "enableSetCookie,omitempty": true, "gclifetime":3600, "maxLifetime": 3600, "secure": false, "cookieLifeTime": 3600, "providerConfig": ""}`) -// go globalSessions.GC() -// } -// +// func init() { +// globalSessions, _ = session.NewManager("memory", `{"cookieName":"gosessionid", "enableSetCookie,omitempty": true, "gclifetime":3600, "maxLifetime": 3600, "secure": false, "cookieLifeTime": 3600, "providerConfig": ""}`) +// go globalSessions.GC() +// } package session import ( diff --git a/server/web/templatefunc.go b/server/web/templatefunc.go index 6a380761..24f28502 100644 --- a/server/web/templatefunc.go +++ b/server/web/templatefunc.go @@ -227,21 +227,21 @@ func Htmlunquote(text string) string { } // URLFor returns url string with another registered controller handler with params. -// usage: // -// URLFor(".index") -// print URLFor("index") -// router /login -// print URLFor("login") -// print URLFor("login", "next","/"") -// router /profile/:username -// print UrlFor("profile", ":username","John Doe") -// result: -// / -// /login -// /login?next=/ -// /user/John%20Doe +// usage: // +// URLFor(".index") +// print URLFor("index") +// router /login +// print URLFor("login") +// print URLFor("login", "next","/"") +// router /profile/:username +// print UrlFor("profile", ":username","John Doe") +// result: +// / +// /login +// /login?next=/ +// /user/John%20Doe func URLFor(endpoint string, values ...interface{}) string { return BeeApp.Handlers.URLFor(endpoint, values...) } @@ -564,12 +564,13 @@ func ge(arg1, arg2 interface{}) (bool, error) { // MapGet getting value from map by keys // usage: -// Data["m"] = M{ -// "a": 1, -// "1": map[string]float64{ -// "c": 4, -// }, -// } +// +// Data["m"] = M{ +// "a": 1, +// "1": map[string]float64{ +// "c": 4, +// }, +// } // // {{ map_get m "a" }} // return 1 // {{ map_get m 1 "c" }} // return 4 diff --git a/task/task.go b/task/task.go index 3678f1a2..870210ec 100644 --- a/task/task.go +++ b/task/task.go @@ -237,11 +237,16 @@ func TimeoutOption(timeout time.Duration) Option { // week:0-6(0 means Sunday) // SetCron some signals: -// *: any time -// ,:  separate signal +// +// *: any time +// ,:  separate signal +// //    -:duration -// /n : do as n times of time duration +// +// /n : do as n times of time duration +// // /////////////////////////////////////////////////////// +// // 0/30 * * * * * every 30s // 0 43 21 * * * 21:43 // 0 15 05 * * *    05:15 @@ -724,7 +729,8 @@ func getField(field string, r bounds) uint64 { } // getRange returns the bits indicated by the given expression: -// number | number "-" number [ "/" number ] +// +// number | number "-" number [ "/" number ] func getRange(expr string, r bounds) uint64 { var ( start, end, step uint diff --git a/test/bindata.go b/test/bindata.go index 632f5a47..414625e3 100644 --- a/test/bindata.go +++ b/test/bindata.go @@ -198,11 +198,13 @@ var _bindata = map[string]func() (*asset, error){ // directory embedded in the file by go-bindata. // For example if you run go-bindata on data/... and data contains the // following hierarchy: -// data/ -// foo.txt -// img/ -// a.png -// b.png +// +// data/ +// foo.txt +// img/ +// a.png +// b.png +// // then AssetDir("data") would return []string{"foo.txt", "img"} // AssetDir("data/img") would return []string{"a.png", "b.png"} // AssetDir("foo.txt") and AssetDir("notexist") would return an error