From 8716185de8550450d161bbc9726c01b6aadeef35 Mon Sep 17 00:00:00 2001 From: astaxie Date: Wed, 1 Oct 2014 22:10:33 +0800 Subject: [PATCH] fix #794 --- config.go | 521 +++++++++++++++++++++++++++++------------------------- 1 file changed, 281 insertions(+), 240 deletions(-) diff --git a/config.go b/config.go index 9f952735..ef201ec6 100644 --- a/config.go +++ b/config.go @@ -15,7 +15,6 @@ package beego import ( - "errors" "fmt" "html/template" "os" @@ -48,8 +47,8 @@ var ( RecoverPanic bool // flag of auto recover panic AutoRender bool // flag of render template automatically ViewsPath string - RunMode string // run mode, "dev" or "prod" - AppConfig config.ConfigContainer + AppConfig *beegoAppConfig + RunMode string // run mode, "dev" or "prod" GlobalSessions *session.Manager // global session mananger SessionOn bool // flag of starting session auto. default is false. SessionProvider string // default session provider, memory, mysql , redis ,etc. @@ -84,6 +83,107 @@ var ( RouterCaseSensitive bool // router case sensitive default is true ) +type beegoAppConfig struct { + innerConfig config.ConfigContainer +} + +func newAppConfig(AppConfigProvider, AppConfigPath string) *beegoAppConfig { + ac, err := config.NewConfig(AppConfigProvider, AppConfigPath) + if err != nil { + ac = config.NewFakeConfig() + } + rac := &beegoAppConfig{ac} + return rac +} + +func (b *beegoAppConfig) Set(key, val string) error { + return b.innerConfig.Set(key, val) +} + +func (b *beegoAppConfig) String(key string) string { + v := b.innerConfig.String(RunMode + "::" + key) + if v == "" { + return b.innerConfig.String(key) + } + return v +} + +func (b *beegoAppConfig) Strings(key string) []string { + v := b.innerConfig.Strings(RunMode + "::" + key) + if len(v) == 0 { + return b.innerConfig.Strings(key) + } + return v +} + +func (b *beegoAppConfig) Int(key string) (int, error) { + v, err := b.innerConfig.Int(RunMode + "::" + key) + if err != nil { + return b.innerConfig.Int(key) + } + return v, nil +} + +func (b *beegoAppConfig) Int64(key string) (int64, error) { + v, err := b.innerConfig.Int64(RunMode + "::" + key) + if err != nil { + return b.innerConfig.Int64(key) + } + return v, nil +} + +func (b *beegoAppConfig) Bool(key string) (bool, error) { + v, err := b.innerConfig.Bool(RunMode + "::" + key) + if err != nil { + return b.innerConfig.Bool(key) + } + return v, nil +} + +func (b *beegoAppConfig) Float(key string) (float64, error) { + v, err := b.innerConfig.Float(RunMode + "::" + key) + if err != nil { + return b.innerConfig.Float(key) + } + return v, nil +} + +func (b *beegoAppConfig) DefaultString(key string, defaultval string) string { + return b.innerConfig.DefaultString(key, defaultval) +} + +func (b *beegoAppConfig) DefaultStrings(key string, defaultval []string) []string { + return b.innerConfig.DefaultStrings(key, defaultval) +} + +func (b *beegoAppConfig) DefaultInt(key string, defaultval int) int { + return b.innerConfig.DefaultInt(key, defaultval) +} + +func (b *beegoAppConfig) DefaultInt64(key string, defaultval int64) int64 { + return b.innerConfig.DefaultInt64(key, defaultval) +} + +func (b *beegoAppConfig) DefaultBool(key string, defaultval bool) bool { + return b.innerConfig.DefaultBool(key, defaultval) +} + +func (b *beegoAppConfig) DefaultFloat(key string, defaultval float64) float64 { + return b.innerConfig.DefaultFloat(key, defaultval) +} + +func (b *beegoAppConfig) DIY(key string) (interface{}, error) { + return b.innerConfig.DIY(key) +} + +func (b *beegoAppConfig) GetSection(section string) (map[string]string, error) { + return b.innerConfig.GetSection(section) +} + +func (b *beegoAppConfig) SaveConfigFile(filename string) error { + return b.innerConfig.SaveConfigFile(filename) +} + func init() { // create beego application BeeApp = NewApp() @@ -186,255 +286,196 @@ func init() { // ParseConfig parsed default config file. // now only support ini, next will support json. func ParseConfig() (err error) { - AppConfig, err = config.NewConfig(AppConfigProvider, AppConfigPath) - if err != nil { - AppConfig = config.NewFakeConfig() - return err - } else { + AppConfig = newAppConfig(AppConfigProvider, AppConfigPath) - if v, err := GetConfig("string", "HttpAddr"); err == nil { - HttpAddr = v.(string) + // set the runmode first + if runmode := AppConfig.String("RunMode"); runmode != "" { + RunMode = runmode + } + + HttpAddr = AppConfig.String("HttpAddr") + + if v, err := AppConfig.Int("HttpPort"); err == nil { + HttpPort = v + } + + if v, err := AppConfig.Bool("EnableHttpListen"); err == nil { + EnableHttpListen = v + } + + if maxmemory, err := AppConfig.Int64("MaxMemory"); err == nil { + MaxMemory = maxmemory + } + + if appname := AppConfig.String("AppName"); appname != "" { + AppName = appname + } + + if autorender, err := AppConfig.Bool("AutoRender"); err == nil { + AutoRender = autorender + } + + if autorecover, err := AppConfig.Bool("RecoverPanic"); err == nil { + RecoverPanic = autorecover + } + + if views := AppConfig.String("ViewsPath"); views != "" { + ViewsPath = views + } + + if sessionon, err := AppConfig.Bool("SessionOn"); err == nil { + SessionOn = sessionon + } + + if sessProvider := AppConfig.String("SessionProvider"); sessProvider != "" { + SessionProvider = sessProvider + } + + if sessName := AppConfig.String("SessionName"); sessName != "" { + SessionName = sessName + } + + if sesssavepath := AppConfig.String("SessionSavePath"); sesssavepath != "" { + SessionSavePath = sesssavepath + } + + if sesshashfunc := AppConfig.String("SessionHashFunc"); sesshashfunc != "" { + SessionHashFunc = sesshashfunc + } + + if sesshashkey := AppConfig.String("SessionHashKey"); sesshashkey != "" { + SessionHashKey = sesshashkey + } + + if sessMaxLifeTime, err := AppConfig.Int64("SessionGCMaxLifetime"); err == nil && sessMaxLifeTime != 0 { + SessionGCMaxLifetime = sessMaxLifeTime + } + + if sesscookielifetime, err := AppConfig.Int("SessionCookieLifeTime"); err == nil && sesscookielifetime != 0 { + SessionCookieLifeTime = sesscookielifetime + } + + if usefcgi, err := AppConfig.Bool("UseFcgi"); err == nil { + UseFcgi = usefcgi + } + + if enablegzip, err := AppConfig.Bool("EnableGzip"); err == nil { + EnableGzip = enablegzip + } + + if directoryindex, err := AppConfig.Bool("DirectoryIndex"); err == nil { + DirectoryIndex = directoryindex + } + + if timeout, err := AppConfig.Int64("HttpServerTimeOut"); err == nil { + HttpServerTimeOut = timeout + } + + if errorsshow, err := AppConfig.Bool("ErrorsShow"); err == nil { + ErrorsShow = errorsshow + } + + if copyrequestbody, err := AppConfig.Bool("CopyRequestBody"); err == nil { + CopyRequestBody = copyrequestbody + } + + if xsrfkey := AppConfig.String("XSRFKEY"); xsrfkey != "" { + XSRFKEY = xsrfkey + } + + if enablexsrf, err := AppConfig.Bool("EnableXSRF"); err == nil { + EnableXSRF = enablexsrf + } + + if expire, err := AppConfig.Int("XSRFExpire"); err == nil { + XSRFExpire = expire + } + + if tplleft := AppConfig.String("TemplateLeft"); tplleft != "" { + TemplateLeft = tplleft + } + + if tplright := AppConfig.String("TemplateRight"); tplright != "" { + TemplateRight = tplright + } + + if httptls, err := AppConfig.Bool("EnableHttpTLS"); err == nil { + EnableHttpTLS = httptls + } + + if httpsport, err := AppConfig.Int("HttpsPort"); err == nil { + HttpsPort = httpsport + } + + if certfile := AppConfig.String("HttpCertFile"); certfile != "" { + HttpCertFile = certfile + } + + if keyfile := AppConfig.String("HttpKeyFile"); keyfile != "" { + HttpKeyFile = keyfile + } + + if serverName := AppConfig.String("BeegoServerName"); serverName != "" { + BeegoServerName = serverName + } + + if flashname := AppConfig.String("FlashName"); flashname != "" { + FlashName = flashname + } + + if flashseperator := AppConfig.String("FlashSeperator"); flashseperator != "" { + FlashSeperator = flashseperator + } + + if sd := AppConfig.String("StaticDir"); sd != "" { + for k := range StaticDir { + delete(StaticDir, k) } - - if v, err := GetConfig("int", "HttpPort"); err == nil { - HttpPort = v.(int) - } - - if v, err := GetConfig("bool", "EnableHttpListen"); err == nil { - EnableHttpListen = v.(bool) - } - - if maxmemory, err := GetConfig("int64", "MaxMemory"); err == nil { - MaxMemory = maxmemory.(int64) - } - - if appname, _ := GetConfig("string", "AppName"); appname != "" { - AppName = appname.(string) - } - - if runmode, _ := GetConfig("string", "RunMode"); runmode != "" { - RunMode = runmode.(string) - } - - if autorender, err := GetConfig("bool", "AutoRender"); err == nil { - AutoRender = autorender.(bool) - } - - if autorecover, err := GetConfig("bool", "RecoverPanic"); err == nil { - RecoverPanic = autorecover.(bool) - } - - if views, _ := GetConfig("string", "ViewsPath"); views != "" { - ViewsPath = views.(string) - } - - if sessionon, err := GetConfig("bool", "SessionOn"); err == nil { - SessionOn = sessionon.(bool) - } - - if sessProvider, _ := GetConfig("string", "SessionProvider"); sessProvider != "" { - SessionProvider = sessProvider.(string) - } - - if sessName, _ := GetConfig("string", "SessionName"); sessName != "" { - SessionName = sessName.(string) - } - - if sesssavepath, _ := GetConfig("string", "SessionSavePath"); sesssavepath != "" { - SessionSavePath = sesssavepath.(string) - } - - if sesshashfunc, _ := GetConfig("string", "SessionHashFunc"); sesshashfunc != "" { - SessionHashFunc = sesshashfunc.(string) - } - - if sesshashkey, _ := GetConfig("string", "SessionHashKey"); sesshashkey != "" { - SessionHashKey = sesshashkey.(string) - } - - if sessMaxLifeTime, err := GetConfig("int64", "SessionGCMaxLifetime"); err == nil && sessMaxLifeTime != 0 { - SessionGCMaxLifetime = sessMaxLifeTime.(int64) - } - - if sesscookielifetime, err := GetConfig("int", "SessionCookieLifeTime"); err == nil && sesscookielifetime != 0 { - SessionCookieLifeTime = sesscookielifetime.(int) - } - - if usefcgi, err := GetConfig("bool", "UseFcgi"); err == nil { - UseFcgi = usefcgi.(bool) - } - - if enablegzip, err := GetConfig("bool", "EnableGzip"); err == nil { - EnableGzip = enablegzip.(bool) - } - - if directoryindex, err := GetConfig("bool", "DirectoryIndex"); err == nil { - DirectoryIndex = directoryindex.(bool) - } - - if timeout, err := GetConfig("int64", "HttpServerTimeOut"); err == nil { - HttpServerTimeOut = timeout.(int64) - } - - if errorsshow, err := GetConfig("bool", "ErrorsShow"); err == nil { - ErrorsShow = errorsshow.(bool) - } - - if copyrequestbody, err := GetConfig("bool", "CopyRequestBody"); err == nil { - CopyRequestBody = copyrequestbody.(bool) - } - - if xsrfkey, _ := GetConfig("string", "XSRFKEY"); xsrfkey != "" { - XSRFKEY = xsrfkey.(string) - } - - if enablexsrf, err := GetConfig("bool", "EnableXSRF"); err == nil { - EnableXSRF = enablexsrf.(bool) - } - - if expire, err := GetConfig("int", "XSRFExpire"); err == nil { - XSRFExpire = expire.(int) - } - - if tplleft, _ := GetConfig("string", "TemplateLeft"); tplleft != "" { - TemplateLeft = tplleft.(string) - } - - if tplright, _ := GetConfig("string", "TemplateRight"); tplright != "" { - TemplateRight = tplright.(string) - } - - if httptls, err := GetConfig("bool", "EnableHttpTLS"); err == nil { - EnableHttpTLS = httptls.(bool) - } - - if httpsport, err := GetConfig("int", "HttpsPort"); err == nil { - HttpsPort = httpsport.(int) - } - - if certfile, _ := GetConfig("string", "HttpCertFile"); certfile != "" { - HttpCertFile = certfile.(string) - } - - if keyfile, _ := GetConfig("string", "HttpKeyFile"); keyfile != "" { - HttpKeyFile = keyfile.(string) - } - - if serverName, _ := GetConfig("string", "BeegoServerName"); serverName != "" { - BeegoServerName = serverName.(string) - } - - if flashname, _ := GetConfig("string", "FlashName"); flashname != "" { - FlashName = flashname.(string) - } - - if flashseperator, _ := GetConfig("string", "FlashSeperator"); flashseperator != "" { - FlashSeperator = flashseperator.(string) - } - - if sd, _ := GetConfig("string", "StaticDir"); sd != "" { - for k := range StaticDir { - delete(StaticDir, k) + sds := strings.Fields(sd) + for _, v := range sds { + if url2fsmap := strings.SplitN(v, ":", 2); len(url2fsmap) == 2 { + StaticDir["/"+strings.TrimRight(url2fsmap[0], "/")] = url2fsmap[1] + } else { + StaticDir["/"+strings.TrimRight(url2fsmap[0], "/")] = url2fsmap[0] } - sds := strings.Fields(sd.(string)) - for _, v := range sds { - if url2fsmap := strings.SplitN(v, ":", 2); len(url2fsmap) == 2 { - StaticDir["/"+strings.TrimRight(url2fsmap[0], "/")] = url2fsmap[1] - } else { - StaticDir["/"+strings.TrimRight(url2fsmap[0], "/")] = url2fsmap[0] + } + } + + if sgz := AppConfig.String("StaticExtensionsToGzip"); sgz != "" { + extensions := strings.Split(sgz, ",") + if len(extensions) > 0 { + StaticExtensionsToGzip = []string{} + for _, ext := range extensions { + if len(ext) == 0 { + continue } - } - } - - if sgz, _ := GetConfig("string", "StaticExtensionsToGzip"); sgz != "" { - extensions := strings.Split(sgz.(string), ",") - if len(extensions) > 0 { - StaticExtensionsToGzip = []string{} - for _, ext := range extensions { - if len(ext) == 0 { - continue - } - extWithDot := ext - if extWithDot[:1] != "." { - extWithDot = "." + extWithDot - } - StaticExtensionsToGzip = append(StaticExtensionsToGzip, extWithDot) + extWithDot := ext + if extWithDot[:1] != "." { + extWithDot = "." + extWithDot } + StaticExtensionsToGzip = append(StaticExtensionsToGzip, extWithDot) } } + } - if enableadmin, err := GetConfig("bool", "EnableAdmin"); err == nil { - EnableAdmin = enableadmin.(bool) - } + if enableadmin, err := AppConfig.Bool("EnableAdmin"); err == nil { + EnableAdmin = enableadmin + } - if adminhttpaddr, _ := GetConfig("string", "AdminHttpAddr"); adminhttpaddr != "" { - AdminHttpAddr = adminhttpaddr.(string) - } + if adminhttpaddr := AppConfig.String("AdminHttpAddr"); adminhttpaddr != "" { + AdminHttpAddr = adminhttpaddr + } - if adminhttpport, err := GetConfig("int", "AdminHttpPort"); err == nil { - AdminHttpPort = adminhttpport.(int) - } + if adminhttpport, err := AppConfig.Int("AdminHttpPort"); err == nil { + AdminHttpPort = adminhttpport + } - if enabledocs, err := GetConfig("bool", "EnableDocs"); err == nil { - EnableDocs = enabledocs.(bool) - } + if enabledocs, err := AppConfig.Bool("EnableDocs"); err == nil { + EnableDocs = enabledocs + } - if casesensitive, err := GetConfig("bool", "RouterCaseSensitive"); err == nil { - RouterCaseSensitive = casesensitive.(bool) - } + if casesensitive, err := AppConfig.Bool("RouterCaseSensitive"); err == nil { + RouterCaseSensitive = casesensitive } return nil } - -// Getconfig throw the Runmode -// [dev] -// name = astaixe -// IsEnable = false -// [prod] -// name = slene -// IsEnable = true -// -// usage: -// GetConfig("string", "name") -// GetConfig("bool", "IsEnable") -func GetConfig(typ, key string) (interface{}, error) { - switch typ { - case "string": - v := AppConfig.String(RunMode + "::" + key) - if v == "" { - v = AppConfig.String(key) - } - return v, nil - case "strings": - v := AppConfig.Strings(RunMode + "::" + key) - if len(v) == 0 { - v = AppConfig.Strings(key) - } - return v, nil - case "int": - v, err := AppConfig.Int(RunMode + "::" + key) - if err != nil || v == 0 { - return AppConfig.Int(key) - } - return v, nil - case "bool": - v, err := AppConfig.Bool(RunMode + "::" + key) - if err != nil { - return AppConfig.Bool(key) - } - return v, nil - case "int64": - v, err := AppConfig.Int64(RunMode + "::" + key) - if err != nil || v == 0 { - return AppConfig.Int64(key) - } - return v, nil - case "float": - v, err := AppConfig.Float(RunMode + "::" + key) - if err != nil || v == 0 { - return AppConfig.Float(key) - } - return v, nil - } - return "", errors.New("not support type") -}