diff --git a/admin.go b/admin.go index 73d4f9f2..f500afe7 100644 --- a/admin.go +++ b/admin.go @@ -67,18 +67,18 @@ func init() { // AdminIndex is the default http.Handler for admin module. // it matches url pattern "/". -func adminIndex(rw http.ResponseWriter, r *http.Request) { +func adminIndex(rw http.ResponseWriter, _ *http.Request) { execTpl(rw, map[interface{}]interface{}{}, indexTpl, defaultScriptsTpl) } // QpsIndex is the http.Handler for writing qbs statistics map result info in http.ResponseWriter. // it's registered with url pattern "/qbs" in admin module. -func qpsIndex(rw http.ResponseWriter, r *http.Request) { +func qpsIndex(rw http.ResponseWriter, _ *http.Request) { data := make(map[interface{}]interface{}) data["Content"] = toolbox.StatisticsMap.GetMap() // do html escape before display path, avoid xss - if content, ok := (data["Content"]).(map[string]interface{}); ok { + if content, ok := (data["Content"]).(M); ok { if resultLists, ok := (content["Data"]).([][]string); ok { for i := range resultLists { if len(resultLists[i]) > 0 { @@ -104,7 +104,7 @@ func listConf(rw http.ResponseWriter, r *http.Request) { data := make(map[interface{}]interface{}) switch command { case "conf": - m := make(map[string]interface{}) + m := make(M) list("BConfig", BConfig, m) m["AppConfigPath"] = appConfigPath m["AppConfigProvider"] = appConfigProvider @@ -128,14 +128,14 @@ func listConf(rw http.ResponseWriter, r *http.Request) { execTpl(rw, data, routerAndFilterTpl, defaultScriptsTpl) case "filter": var ( - content = map[string]interface{}{ + content = M{ "Fields": []string{ "Router Pattern", "Filter Function", }, } filterTypes = []string{} - filterTypeData = make(map[string]interface{}) + filterTypeData = make(M) ) if BeeApp.Handlers.enableFilter { @@ -173,7 +173,7 @@ func listConf(rw http.ResponseWriter, r *http.Request) { } } -func list(root string, p interface{}, m map[string]interface{}) { +func list(root string, p interface{}, m M) { pt := reflect.TypeOf(p) pv := reflect.ValueOf(p) if pt.Kind() == reflect.Ptr { @@ -196,11 +196,11 @@ func list(root string, p interface{}, m map[string]interface{}) { } // PrintTree prints all registered routers. -func PrintTree() map[string]interface{} { +func PrintTree() M { var ( - content = map[string]interface{}{} + content = M{} methods = []string{} - methodsData = make(map[string]interface{}) + methodsData = make(M) ) for method, t := range BeeApp.Handlers.routers { @@ -291,12 +291,12 @@ func profIndex(rw http.ResponseWriter, r *http.Request) { // Healthcheck is a http.Handler calling health checking and showing the result. // it's in "/healthcheck" pattern in admin module. -func healthcheck(rw http.ResponseWriter, req *http.Request) { +func healthcheck(rw http.ResponseWriter, _ *http.Request) { var ( result []string data = make(map[interface{}]interface{}) resultList = new([][]string) - content = map[string]interface{}{ + content = M{ "Fields": []string{"Name", "Message", "Status"}, } ) @@ -344,7 +344,7 @@ func taskStatus(rw http.ResponseWriter, req *http.Request) { } // List Tasks - content := make(map[string]interface{}) + content := make(M) resultList := new([][]string) var fields = []string{ "Task Name", diff --git a/admin_test.go b/admin_test.go index 03a3c044..539837cf 100644 --- a/admin_test.go +++ b/admin_test.go @@ -6,7 +6,7 @@ import ( ) func TestList_01(t *testing.T) { - m := make(map[string]interface{}) + m := make(M) list("BConfig", BConfig, m) t.Log(m) om := oldMap() @@ -18,8 +18,8 @@ func TestList_01(t *testing.T) { } } -func oldMap() map[string]interface{} { - m := make(map[string]interface{}) +func oldMap() M { + m := make(M) m["BConfig.AppName"] = BConfig.AppName m["BConfig.RunMode"] = BConfig.RunMode m["BConfig.RouterCaseSensitive"] = BConfig.RouterCaseSensitive diff --git a/beego.go b/beego.go index 6b90c61c..78936b4f 100644 --- a/beego.go +++ b/beego.go @@ -31,7 +31,10 @@ const ( PROD = "prod" ) -//hook function to run +// Map shortcut +type M map[string]interface{} + +// Hook function to run type hookfunc func() error var ( diff --git a/config_test.go b/config_test.go index 379fe1c6..53411b01 100644 --- a/config_test.go +++ b/config_test.go @@ -48,15 +48,15 @@ func TestAssignConfig_02(t *testing.T) { _BConfig := &Config{} bs, _ := json.Marshal(newBConfig()) - jsonMap := map[string]interface{}{} + jsonMap := M{} json.Unmarshal(bs, &jsonMap) - configMap := map[string]interface{}{} + configMap := M{} for k, v := range jsonMap { if reflect.TypeOf(v).Kind() == reflect.Map { - for k1, v1 := range v.(map[string]interface{}) { + for k1, v1 := range v.(M) { if reflect.TypeOf(v1).Kind() == reflect.Map { - for k2, v2 := range v1.(map[string]interface{}) { + for k2, v2 := range v1.(M) { configMap[k2] = v2 } } else { diff --git a/context/context.go b/context/context.go index 394a4e31..452834e5 100644 --- a/context/context.go +++ b/context/context.go @@ -38,6 +38,14 @@ import ( "github.com/astaxie/beego/utils" ) +//commonly used mime-types +const ( + ApplicationJSON = "application/json" + ApplicationXML = "application/xml" + ApplicationYAML = "application/x-yaml" + TextXML = "text/xml" +) + // NewContext return the Context with Input and Output func NewContext() *Context { return &Context{ diff --git a/context/output.go b/context/output.go index 3cc6044e..df3163b9 100644 --- a/context/output.go +++ b/context/output.go @@ -260,6 +260,19 @@ func (output *BeegoOutput) XML(data interface{}, hasIndent bool) error { return output.Body(content) } +// ServeFormatted serve YAML, XML OR JSON, depending on the value of the Accept header +func (output *BeegoOutput) ServeFormatted(data interface{}, hasIndent bool, hasEncode ...bool) { + accept := output.Context.Input.Header("Accept") + switch accept { + case ApplicationYAML: + output.YAML(data) + case ApplicationXML, TextXML: + output.XML(data, hasIndent) + default: + output.JSON(data, hasIndent, len(hasEncode) > 0 && hasEncode[0]) + } +} + // Download forces response for download file. // it prepares the download response header automatically. func (output *BeegoOutput) Download(file string, filename ...string) { diff --git a/controller.go b/controller.go index 01c568f1..374b05e2 100644 --- a/controller.go +++ b/controller.go @@ -32,14 +32,6 @@ import ( "github.com/astaxie/beego/session" ) -//commonly used mime-types -const ( - applicationJSON = "application/json" - applicationXML = "application/xml" - applicationYAML = "application/x-yaml" - textXML = "text/xml" -) - var ( // ErrAbort custom error when user stop request handler manually. ErrAbort = errors.New("User stop run") @@ -281,9 +273,9 @@ func (c *Controller) Redirect(url string, code int) { func (c *Controller) SetData(data interface{}) { accept := c.Ctx.Input.Header("Accept") switch accept { - case applicationJSON: - c.Data["json"] = data - case applicationXML, textXML: + case context.ApplicationYAML: + c.Data["yaml"] = data + case context.ApplicationXML, context.TextXML: c.Data["xml"] = data default: c.Data["json"] = data @@ -332,33 +324,22 @@ func (c *Controller) URLFor(endpoint string, values ...interface{}) string { // ServeJSON sends a json response with encoding charset. func (c *Controller) ServeJSON(encoding ...bool) { var ( - hasIndent = true - hasEncoding = false + hasIndent = BConfig.RunMode != PROD + hasEncoding = len(encoding) > 0 && encoding[0] ) - if BConfig.RunMode == PROD { - hasIndent = false - } - if len(encoding) > 0 && encoding[0] { - hasEncoding = true - } + c.Ctx.Output.JSON(c.Data["json"], hasIndent, hasEncoding) } // ServeJSONP sends a jsonp response. func (c *Controller) ServeJSONP() { - hasIndent := true - if BConfig.RunMode == PROD { - hasIndent = false - } + hasIndent := BConfig.RunMode != PROD c.Ctx.Output.JSONP(c.Data["jsonp"], hasIndent) } // ServeXML sends xml response. func (c *Controller) ServeXML() { - hasIndent := true - if BConfig.RunMode == PROD { - hasIndent = false - } + hasIndent := BConfig.RunMode != PROD c.Ctx.Output.XML(c.Data["xml"], hasIndent) } @@ -367,19 +348,11 @@ func (c *Controller) ServeYAML() { c.Ctx.Output.YAML(c.Data["yaml"]) } -// ServeFormatted serve Xml OR Json, depending on the value of the Accept header -func (c *Controller) ServeFormatted() { - accept := c.Ctx.Input.Header("Accept") - switch accept { - case applicationJSON: - c.ServeJSON() - case applicationXML, textXML: - c.ServeXML() - case applicationYAML: - c.ServeYAML() - default: - c.ServeJSON() - } +// ServeFormatted serve YAML, XML OR JSON, depending on the value of the Accept header +func (c *Controller) ServeFormatted(encoding ...bool) { + hasIndent := BConfig.RunMode != PROD + hasEncoding := len(encoding) > 0 && encoding[0] + c.Ctx.Output.ServeFormatted(c.Data, hasIndent, hasEncoding) } // Input returns the input data map from POST or PUT request body and query string. diff --git a/error.go b/error.go index 7a50a5b3..727830df 100644 --- a/error.go +++ b/error.go @@ -361,7 +361,7 @@ func gatewayTimeout(rw http.ResponseWriter, r *http.Request) { func responseError(rw http.ResponseWriter, r *http.Request, errCode int, errContent string) { t, _ := template.New("beegoerrortemp").Parse(errtpl) - data := map[string]interface{}{ + data := M{ "Title": http.StatusText(errCode), "BeegoVersion": VERSION, "Content": template.HTML(errContent), diff --git a/templatefunc.go b/templatefunc.go index e4d4667a..8c1504aa 100644 --- a/templatefunc.go +++ b/templatefunc.go @@ -692,7 +692,7 @@ func ge(arg1, arg2 interface{}) (bool, error) { // MapGet getting value from map by keys // usage: -// Data["m"] = map[string]interface{} { +// Data["m"] = M{ // "a": 1, // "1": map[string]float64{ // "c": 4, diff --git a/templatefunc_test.go b/templatefunc_test.go index aa82c26f..c7b8fbd3 100644 --- a/templatefunc_test.go +++ b/templatefunc_test.go @@ -329,7 +329,7 @@ func TestMapGet(t *testing.T) { } // test 2 level map - m2 := map[string]interface{}{ + m2 := M{ "1": map[string]float64{ "2": 3.5, }, @@ -344,11 +344,11 @@ func TestMapGet(t *testing.T) { } // test 5 level map - m5 := map[string]interface{}{ - "1": map[string]interface{}{ - "2": map[string]interface{}{ - "3": map[string]interface{}{ - "4": map[string]interface{}{ + m5 := M{ + "1": M{ + "2": M{ + "3": M{ + "4": M{ "5": 1.2, }, },