mirror of
https://github.com/astaxie/beego.git
synced 2024-11-22 13:10:54 +00:00
refact beego config
This commit is contained in:
parent
3d4ad560f8
commit
d1bba02958
49
admin.go
49
admin.go
@ -85,50 +85,11 @@ func listConf(rw http.ResponseWriter, r *http.Request) {
|
|||||||
data := make(map[interface{}]interface{})
|
data := make(map[interface{}]interface{})
|
||||||
switch command {
|
switch command {
|
||||||
case "conf":
|
case "conf":
|
||||||
m := make(map[string]interface{})
|
|
||||||
|
|
||||||
m["AppName"] = AppName
|
|
||||||
m["AppPath"] = AppPath
|
|
||||||
m["AppConfigPath"] = AppConfigPath
|
|
||||||
m["StaticDir"] = StaticDir
|
|
||||||
m["StaticExtensionsToGzip"] = StaticExtensionsToGzip
|
|
||||||
m["HTTPAddr"] = HTTPAddr
|
|
||||||
m["HTTPPort"] = HTTPPort
|
|
||||||
m["HTTPTLS"] = EnableHTTPTLS
|
|
||||||
m["HTTPCertFile"] = HTTPCertFile
|
|
||||||
m["HTTPKeyFile"] = HTTPKeyFile
|
|
||||||
m["RecoverPanic"] = RecoverPanic
|
|
||||||
m["AutoRender"] = AutoRender
|
|
||||||
m["ViewsPath"] = ViewsPath
|
|
||||||
m["RunMode"] = RunMode
|
|
||||||
m["SessionOn"] = SessionOn
|
|
||||||
m["SessionProvider"] = SessionProvider
|
|
||||||
m["SessionName"] = SessionName
|
|
||||||
m["SessionGCMaxLifetime"] = SessionGCMaxLifetime
|
|
||||||
m["SessionProviderConfig"] = SessionProviderConfig
|
|
||||||
m["SessionCookieLifeTime"] = SessionCookieLifeTime
|
|
||||||
m["EnableFcgi"] = EnableFcgi
|
|
||||||
m["MaxMemory"] = MaxMemory
|
|
||||||
m["EnableGzip"] = EnableGzip
|
|
||||||
m["DirectoryIndex"] = DirectoryIndex
|
|
||||||
m["HTTPServerTimeOut"] = HTTPServerTimeOut
|
|
||||||
m["EnableErrorsShow"] = EnableErrorsShow
|
|
||||||
m["XSRFKEY"] = XSRFKEY
|
|
||||||
m["EnableXSRF"] = EnableXSRF
|
|
||||||
m["XSRFExpire"] = XSRFExpire
|
|
||||||
m["CopyRequestBody"] = CopyRequestBody
|
|
||||||
m["TemplateLeft"] = TemplateLeft
|
|
||||||
m["TemplateRight"] = TemplateRight
|
|
||||||
m["BeegoServerName"] = BeegoServerName
|
|
||||||
m["EnableAdmin"] = EnableAdmin
|
|
||||||
m["AdminHTTPAddr"] = AdminHTTPAddr
|
|
||||||
m["AdminHTTPPort"] = AdminHTTPPort
|
|
||||||
|
|
||||||
tmpl := template.Must(template.New("dashboard").Parse(dashboardTpl))
|
tmpl := template.Must(template.New("dashboard").Parse(dashboardTpl))
|
||||||
tmpl = template.Must(tmpl.Parse(configTpl))
|
tmpl = template.Must(tmpl.Parse(configTpl))
|
||||||
tmpl = template.Must(tmpl.Parse(defaultScriptsTpl))
|
tmpl = template.Must(tmpl.Parse(defaultScriptsTpl))
|
||||||
|
|
||||||
data["Content"] = m
|
data["Content"] = BConfig
|
||||||
|
|
||||||
tmpl.Execute(rw, data)
|
tmpl.Execute(rw, data)
|
||||||
|
|
||||||
@ -391,10 +352,10 @@ func (admin *adminApp) Run() {
|
|||||||
if len(toolbox.AdminTaskList) > 0 {
|
if len(toolbox.AdminTaskList) > 0 {
|
||||||
toolbox.StartTask()
|
toolbox.StartTask()
|
||||||
}
|
}
|
||||||
addr := AdminHTTPAddr
|
addr := BConfig.Listen.AdminAddr
|
||||||
|
|
||||||
if AdminHTTPPort != 0 {
|
if BConfig.Listen.AdminPort != 0 {
|
||||||
addr = fmt.Sprintf("%s:%d", AdminHTTPAddr, AdminHTTPPort)
|
addr = fmt.Sprintf("%s:%d", BConfig.Listen.AdminAddr, BConfig.Listen.AdminPort)
|
||||||
}
|
}
|
||||||
for p, f := range admin.routers {
|
for p, f := range admin.routers {
|
||||||
http.Handle(p, f)
|
http.Handle(p, f)
|
||||||
@ -402,7 +363,7 @@ func (admin *adminApp) Run() {
|
|||||||
BeeLogger.Info("Admin server Running on %s", addr)
|
BeeLogger.Info("Admin server Running on %s", addr)
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
if Graceful {
|
if BConfig.Listen.Graceful {
|
||||||
err = grace.ListenAndServe(addr, nil)
|
err = grace.ListenAndServe(addr, nil)
|
||||||
} else {
|
} else {
|
||||||
err = http.ListenAndServe(addr, nil)
|
err = http.ListenAndServe(addr, nil)
|
||||||
|
50
app.go
50
app.go
@ -52,10 +52,10 @@ func NewApp() *App {
|
|||||||
|
|
||||||
// Run beego application.
|
// Run beego application.
|
||||||
func (app *App) Run() {
|
func (app *App) Run() {
|
||||||
addr := HTTPAddr
|
addr := BConfig.Listen.HTTPAddr
|
||||||
|
|
||||||
if HTTPPort != 0 {
|
if BConfig.Listen.HTTPPort != 0 {
|
||||||
addr = fmt.Sprintf("%s:%d", HTTPAddr, HTTPPort)
|
addr = fmt.Sprintf("%s:%d", BConfig.Listen.HTTPAddr, BConfig.Listen.HTTPPort)
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -64,8 +64,8 @@ func (app *App) Run() {
|
|||||||
)
|
)
|
||||||
endRunning := make(chan bool, 1)
|
endRunning := make(chan bool, 1)
|
||||||
|
|
||||||
if EnableFcgi {
|
if BConfig.Listen.EnableFcgi {
|
||||||
if EnableStdIo {
|
if BConfig.Listen.EnableStdIo {
|
||||||
err = fcgi.Serve(nil, app.Handlers) // standard I/O
|
err = fcgi.Serve(nil, app.Handlers) // standard I/O
|
||||||
if err == nil {
|
if err == nil {
|
||||||
BeeLogger.Info("Use FCGI via standard I/O")
|
BeeLogger.Info("Use FCGI via standard I/O")
|
||||||
@ -73,7 +73,7 @@ func (app *App) Run() {
|
|||||||
BeeLogger.Info("Cannot use FCGI via standard I/O", err)
|
BeeLogger.Info("Cannot use FCGI via standard I/O", err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if HTTPPort == 0 {
|
if BConfig.Listen.HTTPPort == 0 {
|
||||||
// remove the Socket file before start
|
// remove the Socket file before start
|
||||||
if utils.FileExists(addr) {
|
if utils.FileExists(addr) {
|
||||||
os.Remove(addr)
|
os.Remove(addr)
|
||||||
@ -88,23 +88,23 @@ func (app *App) Run() {
|
|||||||
err = fcgi.Serve(l, app.Handlers)
|
err = fcgi.Serve(l, app.Handlers)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if Graceful {
|
if BConfig.Listen.Graceful {
|
||||||
httpsAddr := addr
|
httpsAddr := BConfig.Listen.HTTPSAddr
|
||||||
app.Server.Addr = addr
|
app.Server.Addr = httpsAddr
|
||||||
app.Server.Handler = app.Handlers
|
app.Server.Handler = app.Handlers
|
||||||
app.Server.ReadTimeout = time.Duration(HTTPServerTimeOut) * time.Second
|
app.Server.ReadTimeout = time.Duration(BConfig.Listen.ServerTimeOut) * time.Second
|
||||||
app.Server.WriteTimeout = time.Duration(HTTPServerTimeOut) * time.Second
|
app.Server.WriteTimeout = time.Duration(BConfig.Listen.ServerTimeOut) * time.Second
|
||||||
if EnableHTTPTLS {
|
if BConfig.Listen.HTTPSEnable {
|
||||||
go func() {
|
go func() {
|
||||||
time.Sleep(20 * time.Microsecond)
|
time.Sleep(20 * time.Microsecond)
|
||||||
if HTTPSPort != 0 {
|
if BConfig.Listen.HTTPSPort != 0 {
|
||||||
httpsAddr = fmt.Sprintf("%s:%d", HTTPAddr, HTTPSPort)
|
httpsAddr = fmt.Sprintf("%s:%d", BConfig.Listen.HTTPSAddr, BConfig.Listen.HTTPSPort)
|
||||||
app.Server.Addr = httpsAddr
|
app.Server.Addr = httpsAddr
|
||||||
}
|
}
|
||||||
server := grace.NewServer(httpsAddr, app.Handlers)
|
server := grace.NewServer(httpsAddr, app.Handlers)
|
||||||
server.Server.ReadTimeout = app.Server.ReadTimeout
|
server.Server.ReadTimeout = app.Server.ReadTimeout
|
||||||
server.Server.WriteTimeout = app.Server.WriteTimeout
|
server.Server.WriteTimeout = app.Server.WriteTimeout
|
||||||
err := server.ListenAndServeTLS(HTTPCertFile, HTTPKeyFile)
|
err := server.ListenAndServeTLS(BConfig.Listen.HTTPSCertFile, BConfig.Listen.HTTPSKeyFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
BeeLogger.Critical("ListenAndServeTLS: ", err, fmt.Sprintf("%d", os.Getpid()))
|
BeeLogger.Critical("ListenAndServeTLS: ", err, fmt.Sprintf("%d", os.Getpid()))
|
||||||
time.Sleep(100 * time.Microsecond)
|
time.Sleep(100 * time.Microsecond)
|
||||||
@ -112,12 +112,12 @@ func (app *App) Run() {
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
if EnableHTTPListen {
|
if BConfig.Listen.HTTPEnable {
|
||||||
go func() {
|
go func() {
|
||||||
server := grace.NewServer(addr, app.Handlers)
|
server := grace.NewServer(addr, app.Handlers)
|
||||||
server.Server.ReadTimeout = app.Server.ReadTimeout
|
server.Server.ReadTimeout = app.Server.ReadTimeout
|
||||||
server.Server.WriteTimeout = app.Server.WriteTimeout
|
server.Server.WriteTimeout = app.Server.WriteTimeout
|
||||||
if ListenTCP4 {
|
if BConfig.Listen.ListenTCP4 {
|
||||||
server.Network = "tcp4"
|
server.Network = "tcp4"
|
||||||
}
|
}
|
||||||
err := server.ListenAndServe()
|
err := server.ListenAndServe()
|
||||||
@ -131,17 +131,17 @@ func (app *App) Run() {
|
|||||||
} else {
|
} else {
|
||||||
app.Server.Addr = addr
|
app.Server.Addr = addr
|
||||||
app.Server.Handler = app.Handlers
|
app.Server.Handler = app.Handlers
|
||||||
app.Server.ReadTimeout = time.Duration(HTTPServerTimeOut) * time.Second
|
app.Server.ReadTimeout = time.Duration(BConfig.Listen.ServerTimeOut) * time.Second
|
||||||
app.Server.WriteTimeout = time.Duration(HTTPServerTimeOut) * time.Second
|
app.Server.WriteTimeout = time.Duration(BConfig.Listen.ServerTimeOut) * time.Second
|
||||||
|
|
||||||
if EnableHTTPTLS {
|
if BConfig.Listen.HTTPSEnable {
|
||||||
go func() {
|
go func() {
|
||||||
time.Sleep(20 * time.Microsecond)
|
time.Sleep(20 * time.Microsecond)
|
||||||
if HTTPSPort != 0 {
|
if BConfig.Listen.HTTPSPort != 0 {
|
||||||
app.Server.Addr = fmt.Sprintf("%s:%d", HTTPAddr, HTTPSPort)
|
app.Server.Addr = fmt.Sprintf("%s:%d", BConfig.Listen.HTTPSAddr, BConfig.Listen.HTTPSPort)
|
||||||
}
|
}
|
||||||
BeeLogger.Info("https server Running on %s", app.Server.Addr)
|
BeeLogger.Info("https server Running on %s", app.Server.Addr)
|
||||||
err := app.Server.ListenAndServeTLS(HTTPCertFile, HTTPKeyFile)
|
err := app.Server.ListenAndServeTLS(BConfig.Listen.HTTPSCertFile, BConfig.Listen.HTTPSKeyFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
BeeLogger.Critical("ListenAndServeTLS: ", err)
|
BeeLogger.Critical("ListenAndServeTLS: ", err)
|
||||||
time.Sleep(100 * time.Microsecond)
|
time.Sleep(100 * time.Microsecond)
|
||||||
@ -150,11 +150,11 @@ func (app *App) Run() {
|
|||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
if EnableHTTPListen {
|
if BConfig.Listen.HTTPEnable {
|
||||||
go func() {
|
go func() {
|
||||||
app.Server.Addr = addr
|
app.Server.Addr = addr
|
||||||
BeeLogger.Info("http server Running on %s", app.Server.Addr)
|
BeeLogger.Info("http server Running on %s", app.Server.Addr)
|
||||||
if ListenTCP4 {
|
if BConfig.Listen.ListenTCP4 {
|
||||||
ln, err := net.Listen("tcp4", app.Server.Addr)
|
ln, err := net.Listen("tcp4", app.Server.Addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
BeeLogger.Critical("ListenAndServe: ", err)
|
BeeLogger.Critical("ListenAndServe: ", err)
|
||||||
|
34
beego.go
34
beego.go
@ -15,10 +15,13 @@
|
|||||||
package beego
|
package beego
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/astaxie/beego/logs"
|
||||||
)
|
)
|
||||||
|
|
||||||
// beego web framework version.
|
// beego web framework version.
|
||||||
@ -49,10 +52,10 @@ func Run(params ...string) {
|
|||||||
if len(params) > 0 && params[0] != "" {
|
if len(params) > 0 && params[0] != "" {
|
||||||
strs := strings.Split(params[0], ":")
|
strs := strings.Split(params[0], ":")
|
||||||
if len(strs) > 0 && strs[0] != "" {
|
if len(strs) > 0 && strs[0] != "" {
|
||||||
HTTPAddr = strs[0]
|
BConfig.Listen.HTTPAddr = strs[0]
|
||||||
}
|
}
|
||||||
if len(strs) > 1 && strs[1] != "" {
|
if len(strs) > 1 && strs[1] != "" {
|
||||||
HTTPPort, _ = strconv.Atoi(strs[1])
|
BConfig.Listen.HTTPPort, _ = strconv.Atoi(strs[1])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,14 +63,21 @@ func Run(params ...string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func initBeforeHTTPRun() {
|
func initBeforeHTTPRun() {
|
||||||
// if AppConfigPath not In the conf/app.conf reParse config
|
// if AppConfigPath is setted or conf/app.conf exist
|
||||||
if AppConfigPath != filepath.Join(AppPath, "conf", "app.conf") {
|
|
||||||
err := ParseConfig()
|
err := ParseConfig()
|
||||||
if err != nil && AppConfigPath != filepath.Join(workPath, "conf", "app.conf") {
|
if err != nil {
|
||||||
// configuration is critical to app, panic here if parse failed
|
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
//init log
|
||||||
|
BeeLogger = logs.NewLogger(10000)
|
||||||
|
for adaptor, config := range BConfig.Log.Output {
|
||||||
|
err = BeeLogger.SetLogger(adaptor, config)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("%s with the config `%s` got err:%s\n", adaptor, config, err)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SetLogFuncCall(BConfig.Log.FileLineNum)
|
||||||
|
|
||||||
//init hooks
|
//init hooks
|
||||||
AddAPPStartHook(registerMime)
|
AddAPPStartHook(registerMime)
|
||||||
@ -85,15 +95,9 @@ func initBeforeHTTPRun() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TestBeegoInit is for test package init
|
// TestBeegoInit is for test package init
|
||||||
func TestBeegoInit(apppath string) {
|
func TestBeegoInit(ap string) {
|
||||||
AppPath = apppath
|
|
||||||
os.Setenv("BEEGO_RUNMODE", "test")
|
os.Setenv("BEEGO_RUNMODE", "test")
|
||||||
AppConfigPath = filepath.Join(AppPath, "conf", "app.conf")
|
AppConfigPath = filepath.Join(ap, "conf", "app.conf")
|
||||||
err := ParseConfig()
|
os.Chdir(ap)
|
||||||
if err != nil && !os.IsNotExist(err) {
|
|
||||||
// for init if doesn't have app.conf will not panic
|
|
||||||
Info(err)
|
|
||||||
}
|
|
||||||
os.Chdir(AppPath)
|
|
||||||
initBeforeHTTPRun()
|
initBeforeHTTPRun()
|
||||||
}
|
}
|
||||||
|
762
config.go
762
config.go
@ -15,131 +15,372 @@
|
|||||||
package beego
|
package beego
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"html/template"
|
"html/template"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/astaxie/beego/config"
|
"github.com/astaxie/beego/config"
|
||||||
"github.com/astaxie/beego/logs"
|
|
||||||
"github.com/astaxie/beego/session"
|
"github.com/astaxie/beego/session"
|
||||||
"github.com/astaxie/beego/utils"
|
"github.com/astaxie/beego/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
type BeegoConfig struct {
|
||||||
// AccessLogs represent whether output the access logs, default is false
|
AppName string //Application name
|
||||||
|
RunMode string //Running Mode: dev | prod
|
||||||
|
RouterCaseSensitive bool
|
||||||
|
ServerName string
|
||||||
|
RecoverPanic bool
|
||||||
|
CopyRequestBody bool
|
||||||
|
EnableGzip bool
|
||||||
|
MaxMemory int64
|
||||||
|
EnableErrorsShow bool
|
||||||
|
Listen Listen
|
||||||
|
WebConfig WebConfig
|
||||||
|
Log LogConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
type Listen struct {
|
||||||
|
Graceful bool // Graceful means use graceful module to start the server
|
||||||
|
ServerTimeOut int64
|
||||||
|
ListenTCP4 bool
|
||||||
|
HTTPEnable bool
|
||||||
|
HTTPAddr string
|
||||||
|
HTTPPort int
|
||||||
|
HTTPSEnable bool
|
||||||
|
HTTPSAddr string
|
||||||
|
HTTPSPort int
|
||||||
|
HTTPSCertFile string
|
||||||
|
HTTPSKeyFile string
|
||||||
|
AdminEnable bool
|
||||||
|
AdminAddr string
|
||||||
|
AdminPort int
|
||||||
|
EnableFcgi bool
|
||||||
|
EnableStdIo bool // EnableStdIo works with EnableFcgi Use FCGI via standard I/O
|
||||||
|
}
|
||||||
|
|
||||||
|
type WebConfig struct {
|
||||||
|
AutoRender bool
|
||||||
|
EnableDocs bool
|
||||||
|
FlashName string
|
||||||
|
FlashSeperator string
|
||||||
|
DirectoryIndex bool
|
||||||
|
StaticDir map[string]string
|
||||||
|
StaticExtensionsToGzip []string
|
||||||
|
TemplateLeft string
|
||||||
|
TemplateRight string
|
||||||
|
ViewsPath string
|
||||||
|
EnableXSRF bool
|
||||||
|
XSRFKEY string
|
||||||
|
XSRFExpire int
|
||||||
|
Session SessionConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
type SessionConfig struct {
|
||||||
|
SessionOn bool
|
||||||
|
SessionProvider string
|
||||||
|
SessionName string
|
||||||
|
SessionGCMaxLifetime int64
|
||||||
|
SessionProviderConfig string
|
||||||
|
SessionCookieLifeTime int
|
||||||
|
SessionAutoSetCookie bool
|
||||||
|
SessionDomain string
|
||||||
|
}
|
||||||
|
|
||||||
|
type LogConfig struct {
|
||||||
AccessLogs bool
|
AccessLogs bool
|
||||||
// AdminHTTPAddr is address for admin
|
FileLineNum bool
|
||||||
AdminHTTPAddr string
|
Output map[string]string // Store Adaptor : config
|
||||||
// AdminHTTPPort is listens port for admin
|
}
|
||||||
AdminHTTPPort int
|
|
||||||
|
var (
|
||||||
|
// BConfig is the default config for Application
|
||||||
|
BConfig *BeegoConfig
|
||||||
// AppConfig is the instance of Config, store the config information from file
|
// AppConfig is the instance of Config, store the config information from file
|
||||||
AppConfig *beegoAppConfig
|
AppConfig *beegoAppConfig
|
||||||
// AppName represent Application name, always the project folder name
|
|
||||||
AppName string
|
|
||||||
// AppPath is the path to the application
|
|
||||||
AppPath string
|
|
||||||
// AppConfigPath is the path to the config files
|
// AppConfigPath is the path to the config files
|
||||||
AppConfigPath string
|
AppConfigPath string
|
||||||
// AppConfigProvider is the provider for the config, default is ini
|
// AppConfigProvider is the provider for the config, default is ini
|
||||||
AppConfigProvider string
|
AppConfigProvider = "ini"
|
||||||
// AutoRender is a flag of render template automatically. It's always turn off in API application
|
// TemplateCache stores template caching
|
||||||
// default is true
|
TemplateCache map[string]*template.Template
|
||||||
AutoRender bool
|
|
||||||
// BeegoServerName exported in response header.
|
|
||||||
BeegoServerName string
|
|
||||||
// CopyRequestBody is just useful for raw request body in context. default is false
|
|
||||||
CopyRequestBody bool
|
|
||||||
// DirectoryIndex wheather display directory index. default is false.
|
|
||||||
DirectoryIndex bool
|
|
||||||
// EnableAdmin means turn on admin module to log every request info.
|
|
||||||
EnableAdmin bool
|
|
||||||
// EnableDocs enable generate docs & server docs API Swagger
|
|
||||||
EnableDocs bool
|
|
||||||
// EnableErrorsShow wheather show errors in page. if true, show error and trace info in page rendered with error template.
|
|
||||||
EnableErrorsShow bool
|
|
||||||
// EnableFcgi turn on the fcgi Listen, default is false
|
|
||||||
EnableFcgi bool
|
|
||||||
// EnableGzip means gzip the response
|
|
||||||
EnableGzip bool
|
|
||||||
// EnableHTTPListen represent whether turn on the HTTP, default is true
|
|
||||||
EnableHTTPListen bool
|
|
||||||
// EnableHTTPTLS represent whether turn on the HTTPS, default is true
|
|
||||||
EnableHTTPTLS bool
|
|
||||||
// EnableStdIo works with EnableFcgi Use FCGI via standard I/O
|
|
||||||
EnableStdIo bool
|
|
||||||
// EnableXSRF whether turn on xsrf. default is false
|
|
||||||
EnableXSRF bool
|
|
||||||
// FlashName is the name of the flash variable found in response header and cookie
|
|
||||||
FlashName string
|
|
||||||
// FlashSeperator used to seperate flash key:value, default is BEEGOFLASH
|
|
||||||
FlashSeperator string
|
|
||||||
// GlobalSessions is the instance for the session manager
|
// GlobalSessions is the instance for the session manager
|
||||||
GlobalSessions *session.Manager
|
GlobalSessions *session.Manager
|
||||||
// Graceful means use graceful module to start the server
|
|
||||||
Graceful bool
|
|
||||||
// workPath is always the same as AppPath, but sometime when it started with other
|
|
||||||
// program, like supervisor
|
|
||||||
workPath string
|
|
||||||
// ListenTCP4 represent only Listen in TCP4, default is false
|
|
||||||
ListenTCP4 bool
|
|
||||||
// MaxMemory The whole request body is parsed and up to a total of maxMemory
|
|
||||||
// bytes of its file parts are stored in memory, with the remainder stored on disk in temporary files
|
|
||||||
MaxMemory int64
|
|
||||||
// HTTPAddr is the TCP network address addr for HTTP
|
|
||||||
HTTPAddr string
|
|
||||||
// HTTPPort is listens port for HTTP
|
|
||||||
HTTPPort int
|
|
||||||
// HTTPSPort is listens port for HTTPS
|
|
||||||
HTTPSPort int
|
|
||||||
// HTTPCertFile is the path to certificate file
|
|
||||||
HTTPCertFile string
|
|
||||||
// HTTPKeyFile is the path to private key file
|
|
||||||
HTTPKeyFile string
|
|
||||||
// HTTPServerTimeOut HTTP server timeout. default is 0, no timeout
|
|
||||||
HTTPServerTimeOut int64
|
|
||||||
// RecoverPanic is a flag for auto recover panic, default is true
|
|
||||||
RecoverPanic bool
|
|
||||||
// RouterCaseSensitive means whether router case sensitive, default is true
|
|
||||||
RouterCaseSensitive bool
|
|
||||||
// RunMode represent the staging, "dev" or "prod"
|
|
||||||
RunMode string
|
|
||||||
// SessionOn means whether turn on the session auto when application started. default is false.
|
|
||||||
SessionOn bool
|
|
||||||
// SessionProvider means session provider, e.q memory, mysql, redis,etc.
|
|
||||||
SessionProvider string
|
|
||||||
// SessionName is the cookie name when saving session id into cookie.
|
|
||||||
SessionName string
|
|
||||||
// SessionGCMaxLifetime for auto cleaning expired session.
|
|
||||||
SessionGCMaxLifetime int64
|
|
||||||
// SessionProviderConfig is for the provider config, define save path or connection info.
|
|
||||||
SessionProviderConfig string
|
|
||||||
// SessionCookieLifeTime means the life time of session id in cookie.
|
|
||||||
SessionCookieLifeTime int
|
|
||||||
// SessionAutoSetCookie auto setcookie
|
|
||||||
SessionAutoSetCookie bool
|
|
||||||
// SessionDomain means the cookie domain default is empty
|
|
||||||
SessionDomain string
|
|
||||||
// StaticDir store the static path, key is path, value is the folder
|
|
||||||
StaticDir map[string]string
|
|
||||||
// StaticExtensionsToGzip stores the extensions which need to gzip(.js,.css,etc)
|
|
||||||
StaticExtensionsToGzip []string
|
|
||||||
// TemplateCache store the caching template
|
|
||||||
TemplateCache map[string]*template.Template
|
|
||||||
// TemplateLeft left delimiter
|
|
||||||
TemplateLeft string
|
|
||||||
// TemplateRight right delimiter
|
|
||||||
TemplateRight string
|
|
||||||
// ViewsPath means the template folder
|
|
||||||
ViewsPath string
|
|
||||||
// XSRFKEY xsrf hash salt string.
|
|
||||||
XSRFKEY string
|
|
||||||
// XSRFExpire is the expiry of xsrf value.
|
|
||||||
XSRFExpire int
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
BConfig = &BeegoConfig{
|
||||||
|
AppName: "beego",
|
||||||
|
RunMode: "dev",
|
||||||
|
RouterCaseSensitive: true,
|
||||||
|
ServerName: "beegoServer:" + VERSION,
|
||||||
|
RecoverPanic: true,
|
||||||
|
CopyRequestBody: false,
|
||||||
|
EnableGzip: false,
|
||||||
|
MaxMemory: 1 << 26, //64MB
|
||||||
|
EnableErrorsShow: true,
|
||||||
|
Listen: Listen{
|
||||||
|
Graceful: false,
|
||||||
|
ServerTimeOut: 0,
|
||||||
|
ListenTCP4: false,
|
||||||
|
HTTPEnable: true,
|
||||||
|
HTTPAddr: "",
|
||||||
|
HTTPPort: 8080,
|
||||||
|
HTTPSEnable: false,
|
||||||
|
HTTPSAddr: "",
|
||||||
|
HTTPSPort: 10443,
|
||||||
|
HTTPSCertFile: "",
|
||||||
|
HTTPSKeyFile: "",
|
||||||
|
AdminEnable: false,
|
||||||
|
AdminAddr: "",
|
||||||
|
AdminPort: 8088,
|
||||||
|
EnableFcgi: false,
|
||||||
|
EnableStdIo: false,
|
||||||
|
},
|
||||||
|
WebConfig: WebConfig{
|
||||||
|
AutoRender: true,
|
||||||
|
EnableDocs: false,
|
||||||
|
FlashName: "BEEGO_FLASH",
|
||||||
|
FlashSeperator: "BEEGOFLASH",
|
||||||
|
DirectoryIndex: false,
|
||||||
|
StaticDir: map[string]string{"/static": "static"},
|
||||||
|
StaticExtensionsToGzip: []string{".css", ".js"},
|
||||||
|
TemplateLeft: "{{",
|
||||||
|
TemplateRight: "}}",
|
||||||
|
ViewsPath: "views",
|
||||||
|
EnableXSRF: false,
|
||||||
|
XSRFKEY: "beegoxsrf",
|
||||||
|
XSRFExpire: 0,
|
||||||
|
Session: SessionConfig{
|
||||||
|
SessionOn: false,
|
||||||
|
SessionProvider: "memory",
|
||||||
|
SessionName: "beegosessionID",
|
||||||
|
SessionGCMaxLifetime: 3600,
|
||||||
|
SessionProviderConfig: "",
|
||||||
|
SessionCookieLifeTime: 0, //set cookie default is the brower life
|
||||||
|
SessionAutoSetCookie: true,
|
||||||
|
SessionDomain: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Log: LogConfig{
|
||||||
|
AccessLogs: false,
|
||||||
|
FileLineNum: true,
|
||||||
|
Output: map[string]string{"console": ""},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ParseConfig parsed default config file.
|
||||||
|
// now only support ini, next will support json.
|
||||||
|
func ParseConfig() (err error) {
|
||||||
|
if AppConfigPath == "" {
|
||||||
|
if utils.FileExists(filepath.Join("conf", "app.conf")) {
|
||||||
|
AppConfigPath = filepath.Join("conf", "app.conf")
|
||||||
|
} else {
|
||||||
|
ac := config.NewFakeConfig()
|
||||||
|
AppConfig = &beegoAppConfig{ac}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
AppConfig, err = newAppConfig(AppConfigProvider, AppConfigPath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
envRunMode := os.Getenv("BEEGO_RUNMODE")
|
||||||
|
// set the runmode first
|
||||||
|
if envRunMode != "" {
|
||||||
|
BConfig.RunMode = envRunMode
|
||||||
|
} else if runmode := AppConfig.String("RunMode"); runmode != "" {
|
||||||
|
BConfig.RunMode = runmode
|
||||||
|
}
|
||||||
|
|
||||||
|
BConfig.Listen.HTTPAddr = AppConfig.String("HTTPAddr")
|
||||||
|
|
||||||
|
if v, err := AppConfig.Int("HTTPPort"); err == nil {
|
||||||
|
BConfig.Listen.HTTPPort = v
|
||||||
|
}
|
||||||
|
|
||||||
|
if v, err := AppConfig.Bool("ListenTCP4"); err == nil {
|
||||||
|
BConfig.Listen.ListenTCP4 = v
|
||||||
|
}
|
||||||
|
|
||||||
|
if v, err := AppConfig.Bool("EnableHTTPListen"); err == nil {
|
||||||
|
BConfig.Listen.HTTPEnable = v
|
||||||
|
}
|
||||||
|
|
||||||
|
if maxmemory, err := AppConfig.Int64("MaxMemory"); err == nil {
|
||||||
|
BConfig.MaxMemory = maxmemory
|
||||||
|
}
|
||||||
|
|
||||||
|
if appname := AppConfig.String("AppName"); appname != "" {
|
||||||
|
BConfig.AppName = appname
|
||||||
|
}
|
||||||
|
|
||||||
|
if autorender, err := AppConfig.Bool("AutoRender"); err == nil {
|
||||||
|
BConfig.WebConfig.AutoRender = autorender
|
||||||
|
}
|
||||||
|
|
||||||
|
if autorecover, err := AppConfig.Bool("RecoverPanic"); err == nil {
|
||||||
|
BConfig.RecoverPanic = autorecover
|
||||||
|
}
|
||||||
|
|
||||||
|
if views := AppConfig.String("ViewsPath"); views != "" {
|
||||||
|
BConfig.WebConfig.ViewsPath = views
|
||||||
|
}
|
||||||
|
|
||||||
|
if sessionon, err := AppConfig.Bool("SessionOn"); err == nil {
|
||||||
|
BConfig.WebConfig.Session.SessionOn = sessionon
|
||||||
|
}
|
||||||
|
|
||||||
|
if sessProvider := AppConfig.String("SessionProvider"); sessProvider != "" {
|
||||||
|
BConfig.WebConfig.Session.SessionProvider = sessProvider
|
||||||
|
}
|
||||||
|
|
||||||
|
if sessName := AppConfig.String("SessionName"); sessName != "" {
|
||||||
|
BConfig.WebConfig.Session.SessionName = sessName
|
||||||
|
}
|
||||||
|
|
||||||
|
if sessProvConfig := AppConfig.String("SessionProviderConfig"); sessProvConfig != "" {
|
||||||
|
BConfig.WebConfig.Session.SessionProviderConfig = sessProvConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
if sessMaxLifeTime, err := AppConfig.Int64("SessionGCMaxLifetime"); err == nil && sessMaxLifeTime != 0 {
|
||||||
|
BConfig.WebConfig.Session.SessionGCMaxLifetime = sessMaxLifeTime
|
||||||
|
}
|
||||||
|
|
||||||
|
if sesscookielifetime, err := AppConfig.Int("SessionCookieLifeTime"); err == nil && sesscookielifetime != 0 {
|
||||||
|
BConfig.WebConfig.Session.SessionCookieLifeTime = sesscookielifetime
|
||||||
|
}
|
||||||
|
|
||||||
|
if enableFcgi, err := AppConfig.Bool("EnableFcgi"); err == nil {
|
||||||
|
BConfig.Listen.EnableFcgi = enableFcgi
|
||||||
|
}
|
||||||
|
|
||||||
|
if enablegzip, err := AppConfig.Bool("EnableGzip"); err == nil {
|
||||||
|
BConfig.EnableGzip = enablegzip
|
||||||
|
}
|
||||||
|
|
||||||
|
if directoryindex, err := AppConfig.Bool("DirectoryIndex"); err == nil {
|
||||||
|
BConfig.WebConfig.DirectoryIndex = directoryindex
|
||||||
|
}
|
||||||
|
|
||||||
|
if timeout, err := AppConfig.Int64("HTTPServerTimeOut"); err == nil {
|
||||||
|
BConfig.Listen.ServerTimeOut = timeout
|
||||||
|
}
|
||||||
|
|
||||||
|
if errorsshow, err := AppConfig.Bool("EnableErrorsShow"); err == nil {
|
||||||
|
BConfig.EnableErrorsShow = errorsshow
|
||||||
|
}
|
||||||
|
|
||||||
|
if copyrequestbody, err := AppConfig.Bool("CopyRequestBody"); err == nil {
|
||||||
|
BConfig.CopyRequestBody = copyrequestbody
|
||||||
|
}
|
||||||
|
|
||||||
|
if xsrfkey := AppConfig.String("XSRFKEY"); xsrfkey != "" {
|
||||||
|
BConfig.WebConfig.XSRFKEY = xsrfkey
|
||||||
|
}
|
||||||
|
|
||||||
|
if enablexsrf, err := AppConfig.Bool("EnableXSRF"); err == nil {
|
||||||
|
BConfig.WebConfig.EnableXSRF = enablexsrf
|
||||||
|
}
|
||||||
|
|
||||||
|
if expire, err := AppConfig.Int("XSRFExpire"); err == nil {
|
||||||
|
BConfig.WebConfig.XSRFExpire = expire
|
||||||
|
}
|
||||||
|
|
||||||
|
if tplleft := AppConfig.String("TemplateLeft"); tplleft != "" {
|
||||||
|
BConfig.WebConfig.TemplateLeft = tplleft
|
||||||
|
}
|
||||||
|
|
||||||
|
if tplright := AppConfig.String("TemplateRight"); tplright != "" {
|
||||||
|
BConfig.WebConfig.TemplateRight = tplright
|
||||||
|
}
|
||||||
|
|
||||||
|
if httptls, err := AppConfig.Bool("EnableHTTPTLS"); err == nil {
|
||||||
|
BConfig.Listen.HTTPSEnable = httptls
|
||||||
|
}
|
||||||
|
|
||||||
|
if httpsport, err := AppConfig.Int("HTTPSPort"); err == nil {
|
||||||
|
BConfig.Listen.HTTPSPort = httpsport
|
||||||
|
}
|
||||||
|
|
||||||
|
if certfile := AppConfig.String("HTTPCertFile"); certfile != "" {
|
||||||
|
BConfig.Listen.HTTPSCertFile = certfile
|
||||||
|
}
|
||||||
|
|
||||||
|
if keyfile := AppConfig.String("HTTPKeyFile"); keyfile != "" {
|
||||||
|
BConfig.Listen.HTTPSKeyFile = keyfile
|
||||||
|
}
|
||||||
|
|
||||||
|
if serverName := AppConfig.String("BeegoServerName"); serverName != "" {
|
||||||
|
BConfig.ServerName = serverName
|
||||||
|
}
|
||||||
|
|
||||||
|
if flashname := AppConfig.String("FlashName"); flashname != "" {
|
||||||
|
BConfig.WebConfig.FlashName = flashname
|
||||||
|
}
|
||||||
|
|
||||||
|
if flashseperator := AppConfig.String("FlashSeperator"); flashseperator != "" {
|
||||||
|
BConfig.WebConfig.FlashSeperator = flashseperator
|
||||||
|
}
|
||||||
|
|
||||||
|
if sd := AppConfig.String("StaticDir"); sd != "" {
|
||||||
|
for k := range BConfig.WebConfig.StaticDir {
|
||||||
|
delete(BConfig.WebConfig.StaticDir, k)
|
||||||
|
}
|
||||||
|
sds := strings.Fields(sd)
|
||||||
|
for _, v := range sds {
|
||||||
|
if url2fsmap := strings.SplitN(v, ":", 2); len(url2fsmap) == 2 {
|
||||||
|
BConfig.WebConfig.StaticDir["/"+strings.TrimRight(url2fsmap[0], "/")] = url2fsmap[1]
|
||||||
|
} else {
|
||||||
|
BConfig.WebConfig.StaticDir["/"+strings.TrimRight(url2fsmap[0], "/")] = url2fsmap[0]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if sgz := AppConfig.String("StaticExtensionsToGzip"); sgz != "" {
|
||||||
|
extensions := strings.Split(sgz, ",")
|
||||||
|
fileExts := []string{}
|
||||||
|
for _, ext := range extensions {
|
||||||
|
ext = strings.TrimSpace(ext)
|
||||||
|
if ext == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if !strings.HasPrefix(ext, ".") {
|
||||||
|
ext = "." + ext
|
||||||
|
}
|
||||||
|
fileExts = append(fileExts, ext)
|
||||||
|
}
|
||||||
|
if len(fileExts) > 0 {
|
||||||
|
BConfig.WebConfig.StaticExtensionsToGzip = fileExts
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if enableadmin, err := AppConfig.Bool("EnableAdmin"); err == nil {
|
||||||
|
BConfig.Listen.AdminEnable = enableadmin
|
||||||
|
}
|
||||||
|
|
||||||
|
if adminhttpaddr := AppConfig.String("AdminHTTPAddr"); adminhttpaddr != "" {
|
||||||
|
BConfig.Listen.AdminAddr = adminhttpaddr
|
||||||
|
}
|
||||||
|
|
||||||
|
if adminhttpport, err := AppConfig.Int("AdminHTTPPort"); err == nil {
|
||||||
|
BConfig.Listen.AdminPort = adminhttpport
|
||||||
|
}
|
||||||
|
|
||||||
|
if enabledocs, err := AppConfig.Bool("EnableDocs"); err == nil {
|
||||||
|
BConfig.WebConfig.EnableDocs = enabledocs
|
||||||
|
}
|
||||||
|
|
||||||
|
if casesensitive, err := AppConfig.Bool("RouterCaseSensitive"); err == nil {
|
||||||
|
BConfig.RouterCaseSensitive = casesensitive
|
||||||
|
}
|
||||||
|
if graceful, err := AppConfig.Bool("Graceful"); err == nil {
|
||||||
|
BConfig.Listen.Graceful = graceful
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
type beegoAppConfig struct {
|
type beegoAppConfig struct {
|
||||||
innerConfig config.Configer
|
innerConfig config.Configer
|
||||||
}
|
}
|
||||||
@ -154,7 +395,7 @@ func newAppConfig(AppConfigProvider, AppConfigPath string) (*beegoAppConfig, err
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (b *beegoAppConfig) Set(key, val string) error {
|
func (b *beegoAppConfig) Set(key, val string) error {
|
||||||
err := b.innerConfig.Set(RunMode+"::"+key, val)
|
err := b.innerConfig.Set(BConfig.RunMode+"::"+key, val)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -162,7 +403,7 @@ func (b *beegoAppConfig) Set(key, val string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (b *beegoAppConfig) String(key string) string {
|
func (b *beegoAppConfig) String(key string) string {
|
||||||
v := b.innerConfig.String(RunMode + "::" + key)
|
v := b.innerConfig.String(BConfig.RunMode + "::" + key)
|
||||||
if v == "" {
|
if v == "" {
|
||||||
return b.innerConfig.String(key)
|
return b.innerConfig.String(key)
|
||||||
}
|
}
|
||||||
@ -170,7 +411,7 @@ func (b *beegoAppConfig) String(key string) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (b *beegoAppConfig) Strings(key string) []string {
|
func (b *beegoAppConfig) Strings(key string) []string {
|
||||||
v := b.innerConfig.Strings(RunMode + "::" + key)
|
v := b.innerConfig.Strings(BConfig.RunMode + "::" + key)
|
||||||
if v[0] == "" {
|
if v[0] == "" {
|
||||||
return b.innerConfig.Strings(key)
|
return b.innerConfig.Strings(key)
|
||||||
}
|
}
|
||||||
@ -178,7 +419,7 @@ func (b *beegoAppConfig) Strings(key string) []string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (b *beegoAppConfig) Int(key string) (int, error) {
|
func (b *beegoAppConfig) Int(key string) (int, error) {
|
||||||
v, err := b.innerConfig.Int(RunMode + "::" + key)
|
v, err := b.innerConfig.Int(BConfig.RunMode + "::" + key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return b.innerConfig.Int(key)
|
return b.innerConfig.Int(key)
|
||||||
}
|
}
|
||||||
@ -186,7 +427,7 @@ func (b *beegoAppConfig) Int(key string) (int, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (b *beegoAppConfig) Int64(key string) (int64, error) {
|
func (b *beegoAppConfig) Int64(key string) (int64, error) {
|
||||||
v, err := b.innerConfig.Int64(RunMode + "::" + key)
|
v, err := b.innerConfig.Int64(BConfig.RunMode + "::" + key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return b.innerConfig.Int64(key)
|
return b.innerConfig.Int64(key)
|
||||||
}
|
}
|
||||||
@ -194,7 +435,7 @@ func (b *beegoAppConfig) Int64(key string) (int64, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (b *beegoAppConfig) Bool(key string) (bool, error) {
|
func (b *beegoAppConfig) Bool(key string) (bool, error) {
|
||||||
v, err := b.innerConfig.Bool(RunMode + "::" + key)
|
v, err := b.innerConfig.Bool(BConfig.RunMode + "::" + key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return b.innerConfig.Bool(key)
|
return b.innerConfig.Bool(key)
|
||||||
}
|
}
|
||||||
@ -202,7 +443,7 @@ func (b *beegoAppConfig) Bool(key string) (bool, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (b *beegoAppConfig) Float(key string) (float64, error) {
|
func (b *beegoAppConfig) Float(key string) (float64, error) {
|
||||||
v, err := b.innerConfig.Float(RunMode + "::" + key)
|
v, err := b.innerConfig.Float(BConfig.RunMode + "::" + key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return b.innerConfig.Float(key)
|
return b.innerConfig.Float(key)
|
||||||
}
|
}
|
||||||
@ -268,300 +509,3 @@ func (b *beegoAppConfig) GetSection(section string) (map[string]string, error) {
|
|||||||
func (b *beegoAppConfig) SaveConfigFile(filename string) error {
|
func (b *beegoAppConfig) SaveConfigFile(filename string) error {
|
||||||
return b.innerConfig.SaveConfigFile(filename)
|
return b.innerConfig.SaveConfigFile(filename)
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
|
||||||
workPath, _ = os.Getwd()
|
|
||||||
workPath, _ = filepath.Abs(workPath)
|
|
||||||
// initialize default configurations
|
|
||||||
AppPath, _ = filepath.Abs(filepath.Dir(os.Args[0]))
|
|
||||||
|
|
||||||
AppConfigPath = filepath.Join(AppPath, "conf", "app.conf")
|
|
||||||
|
|
||||||
if workPath != AppPath {
|
|
||||||
if utils.FileExists(AppConfigPath) {
|
|
||||||
os.Chdir(AppPath)
|
|
||||||
} else {
|
|
||||||
AppConfigPath = filepath.Join(workPath, "conf", "app.conf")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AppConfigProvider = "ini"
|
|
||||||
|
|
||||||
StaticDir = make(map[string]string)
|
|
||||||
StaticDir["/static"] = "static"
|
|
||||||
|
|
||||||
StaticExtensionsToGzip = []string{".css", ".js"}
|
|
||||||
|
|
||||||
TemplateCache = make(map[string]*template.Template)
|
|
||||||
|
|
||||||
// set this to 0.0.0.0 to make this app available to externally
|
|
||||||
EnableHTTPListen = true //default enable http Listen
|
|
||||||
|
|
||||||
HTTPAddr = ""
|
|
||||||
HTTPPort = 8080
|
|
||||||
|
|
||||||
HTTPSPort = 10443
|
|
||||||
|
|
||||||
AppName = "beego"
|
|
||||||
|
|
||||||
RunMode = "dev" //default runmod
|
|
||||||
|
|
||||||
AutoRender = true
|
|
||||||
|
|
||||||
RecoverPanic = true
|
|
||||||
|
|
||||||
ViewsPath = "views"
|
|
||||||
|
|
||||||
SessionOn = false
|
|
||||||
SessionProvider = "memory"
|
|
||||||
SessionName = "beegosessionID"
|
|
||||||
SessionGCMaxLifetime = 3600
|
|
||||||
SessionProviderConfig = ""
|
|
||||||
SessionCookieLifeTime = 0 //set cookie default is the brower life
|
|
||||||
SessionAutoSetCookie = true
|
|
||||||
|
|
||||||
MaxMemory = 1 << 26 //64MB
|
|
||||||
|
|
||||||
HTTPServerTimeOut = 0
|
|
||||||
|
|
||||||
EnableErrorsShow = true
|
|
||||||
|
|
||||||
XSRFKEY = "beegoxsrf"
|
|
||||||
XSRFExpire = 0
|
|
||||||
|
|
||||||
TemplateLeft = "{{"
|
|
||||||
TemplateRight = "}}"
|
|
||||||
|
|
||||||
BeegoServerName = "beegoServer:" + VERSION
|
|
||||||
|
|
||||||
EnableAdmin = false
|
|
||||||
AdminHTTPAddr = "127.0.0.1"
|
|
||||||
AdminHTTPPort = 8088
|
|
||||||
|
|
||||||
FlashName = "BEEGO_FLASH"
|
|
||||||
FlashSeperator = "BEEGOFLASH"
|
|
||||||
|
|
||||||
RouterCaseSensitive = true
|
|
||||||
|
|
||||||
runtime.GOMAXPROCS(runtime.NumCPU())
|
|
||||||
|
|
||||||
// init BeeLogger
|
|
||||||
BeeLogger = logs.NewLogger(10000)
|
|
||||||
err := BeeLogger.SetLogger("console", "")
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println("init console log error:", err)
|
|
||||||
}
|
|
||||||
SetLogFuncCall(true)
|
|
||||||
|
|
||||||
err = ParseConfig()
|
|
||||||
if err != nil {
|
|
||||||
if os.IsNotExist(err) {
|
|
||||||
// for init if doesn't have app.conf will not panic
|
|
||||||
ac := config.NewFakeConfig()
|
|
||||||
AppConfig = &beegoAppConfig{ac}
|
|
||||||
}
|
|
||||||
Warning(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ParseConfig parsed default config file.
|
|
||||||
// now only support ini, next will support json.
|
|
||||||
func ParseConfig() (err error) {
|
|
||||||
AppConfig, err = newAppConfig(AppConfigProvider, AppConfigPath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
envRunMode := os.Getenv("BEEGO_RUNMODE")
|
|
||||||
// set the runmode first
|
|
||||||
if envRunMode != "" {
|
|
||||||
RunMode = envRunMode
|
|
||||||
} else 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("ListenTCP4"); err == nil {
|
|
||||||
ListenTCP4 = 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 sessProvConfig := AppConfig.String("SessionProviderConfig"); sessProvConfig != "" {
|
|
||||||
SessionProviderConfig = sessProvConfig
|
|
||||||
}
|
|
||||||
|
|
||||||
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 enableFcgi, err := AppConfig.Bool("EnableFcgi"); err == nil {
|
|
||||||
EnableFcgi = enableFcgi
|
|
||||||
}
|
|
||||||
|
|
||||||
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("EnableErrorsShow"); err == nil {
|
|
||||||
EnableErrorsShow = 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)
|
|
||||||
}
|
|
||||||
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]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if sgz := AppConfig.String("StaticExtensionsToGzip"); sgz != "" {
|
|
||||||
extensions := strings.Split(sgz, ",")
|
|
||||||
fileExts := []string{}
|
|
||||||
for _, ext := range extensions {
|
|
||||||
ext = strings.TrimSpace(ext)
|
|
||||||
if ext == "" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if !strings.HasPrefix(ext, ".") {
|
|
||||||
ext = "." + ext
|
|
||||||
}
|
|
||||||
fileExts = append(fileExts, ext)
|
|
||||||
}
|
|
||||||
if len(fileExts) > 0 {
|
|
||||||
StaticExtensionsToGzip = fileExts
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if enableadmin, err := AppConfig.Bool("EnableAdmin"); err == nil {
|
|
||||||
EnableAdmin = enableadmin
|
|
||||||
}
|
|
||||||
|
|
||||||
if adminhttpaddr := AppConfig.String("AdminHTTPAddr"); adminhttpaddr != "" {
|
|
||||||
AdminHTTPAddr = adminhttpaddr
|
|
||||||
}
|
|
||||||
|
|
||||||
if adminhttpport, err := AppConfig.Int("AdminHTTPPort"); err == nil {
|
|
||||||
AdminHTTPPort = adminhttpport
|
|
||||||
}
|
|
||||||
|
|
||||||
if enabledocs, err := AppConfig.Bool("EnableDocs"); err == nil {
|
|
||||||
EnableDocs = enabledocs
|
|
||||||
}
|
|
||||||
|
|
||||||
if casesensitive, err := AppConfig.Bool("RouterCaseSensitive"); err == nil {
|
|
||||||
RouterCaseSensitive = casesensitive
|
|
||||||
}
|
|
||||||
if graceful, err := AppConfig.Bool("Graceful"); err == nil {
|
|
||||||
Graceful = graceful
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
@ -19,11 +19,11 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestDefaults(t *testing.T) {
|
func TestDefaults(t *testing.T) {
|
||||||
if FlashName != "BEEGO_FLASH" {
|
if BConfig.WebConfig.FlashName != "BEEGO_FLASH" {
|
||||||
t.Errorf("FlashName was not set to default.")
|
t.Errorf("FlashName was not set to default.")
|
||||||
}
|
}
|
||||||
|
|
||||||
if FlashSeperator != "BEEGOFLASH" {
|
if BConfig.WebConfig.FlashSeperator != "BEEGOFLASH" {
|
||||||
t.Errorf("FlashName was not set to default.")
|
t.Errorf("FlashName was not set to default.")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -200,7 +200,7 @@ func (c *Controller) RenderBytes() ([]byte, error) {
|
|||||||
c.TplNames = strings.ToLower(c.controllerName) + "/" + strings.ToLower(c.actionName) + "." + c.TplExt
|
c.TplNames = strings.ToLower(c.controllerName) + "/" + strings.ToLower(c.actionName) + "." + c.TplExt
|
||||||
}
|
}
|
||||||
|
|
||||||
if RunMode == "dev" {
|
if BConfig.RunMode == "dev" {
|
||||||
buildFiles := make([]string, 1)
|
buildFiles := make([]string, 1)
|
||||||
buildFiles = append(buildFiles, c.TplNames)
|
buildFiles = append(buildFiles, c.TplNames)
|
||||||
if c.LayoutSections != nil {
|
if c.LayoutSections != nil {
|
||||||
@ -211,7 +211,7 @@ func (c *Controller) RenderBytes() ([]byte, error) {
|
|||||||
buildFiles = append(buildFiles, sectionTpl)
|
buildFiles = append(buildFiles, sectionTpl)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
BuildTemplate(ViewsPath, buildFiles...)
|
BuildTemplate(BConfig.WebConfig.ViewsPath, buildFiles...)
|
||||||
}
|
}
|
||||||
newbytes := bytes.NewBufferString("")
|
newbytes := bytes.NewBufferString("")
|
||||||
if _, ok := BeeTemplates[c.TplNames]; !ok {
|
if _, ok := BeeTemplates[c.TplNames]; !ok {
|
||||||
@ -256,8 +256,8 @@ func (c *Controller) RenderBytes() ([]byte, error) {
|
|||||||
if c.TplNames == "" {
|
if c.TplNames == "" {
|
||||||
c.TplNames = strings.ToLower(c.controllerName) + "/" + strings.ToLower(c.actionName) + "." + c.TplExt
|
c.TplNames = strings.ToLower(c.controllerName) + "/" + strings.ToLower(c.actionName) + "." + c.TplExt
|
||||||
}
|
}
|
||||||
if RunMode == "dev" {
|
if BConfig.RunMode == "dev" {
|
||||||
BuildTemplate(ViewsPath, c.TplNames)
|
BuildTemplate(BConfig.WebConfig.ViewsPath, c.TplNames)
|
||||||
}
|
}
|
||||||
ibytes := bytes.NewBufferString("")
|
ibytes := bytes.NewBufferString("")
|
||||||
if _, ok := BeeTemplates[c.TplNames]; !ok {
|
if _, ok := BeeTemplates[c.TplNames]; !ok {
|
||||||
@ -319,7 +319,7 @@ func (c *Controller) URLFor(endpoint string, values ...interface{}) string {
|
|||||||
func (c *Controller) ServeJSON(encoding ...bool) {
|
func (c *Controller) ServeJSON(encoding ...bool) {
|
||||||
var hasIndent bool
|
var hasIndent bool
|
||||||
var hasencoding bool
|
var hasencoding bool
|
||||||
if RunMode == "prod" {
|
if BConfig.RunMode == "prod" {
|
||||||
hasIndent = false
|
hasIndent = false
|
||||||
} else {
|
} else {
|
||||||
hasIndent = true
|
hasIndent = true
|
||||||
@ -333,7 +333,7 @@ func (c *Controller) ServeJSON(encoding ...bool) {
|
|||||||
// ServeJSONP sends a jsonp response.
|
// ServeJSONP sends a jsonp response.
|
||||||
func (c *Controller) ServeJSONP() {
|
func (c *Controller) ServeJSONP() {
|
||||||
var hasIndent bool
|
var hasIndent bool
|
||||||
if RunMode == "prod" {
|
if BConfig.RunMode == "prod" {
|
||||||
hasIndent = false
|
hasIndent = false
|
||||||
} else {
|
} else {
|
||||||
hasIndent = true
|
hasIndent = true
|
||||||
@ -344,7 +344,7 @@ func (c *Controller) ServeJSONP() {
|
|||||||
// ServeXML sends xml response.
|
// ServeXML sends xml response.
|
||||||
func (c *Controller) ServeXML() {
|
func (c *Controller) ServeXML() {
|
||||||
var hasIndent bool
|
var hasIndent bool
|
||||||
if RunMode == "prod" {
|
if BConfig.RunMode == "prod" {
|
||||||
hasIndent = false
|
hasIndent = false
|
||||||
} else {
|
} else {
|
||||||
hasIndent = true
|
hasIndent = true
|
||||||
@ -628,9 +628,9 @@ func (c *Controller) XSRFToken() string {
|
|||||||
if c.XSRFExpire > 0 {
|
if c.XSRFExpire > 0 {
|
||||||
expire = int64(c.XSRFExpire)
|
expire = int64(c.XSRFExpire)
|
||||||
} else {
|
} else {
|
||||||
expire = int64(XSRFExpire)
|
expire = int64(BConfig.WebConfig.XSRFExpire)
|
||||||
}
|
}
|
||||||
c._xsrfToken = c.Ctx.XSRFToken(XSRFKEY, expire)
|
c._xsrfToken = c.Ctx.XSRFToken(BConfig.WebConfig.XSRFKEY, expire)
|
||||||
}
|
}
|
||||||
return c._xsrfToken
|
return c._xsrfToken
|
||||||
}
|
}
|
||||||
|
@ -15,30 +15,25 @@
|
|||||||
package beego
|
package beego
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"github.com/astaxie/beego/context"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/astaxie/beego/context"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetInt(t *testing.T) {
|
func TestGetInt(t *testing.T) {
|
||||||
|
|
||||||
i := &context.BeegoInput{Params: map[string]string{"age": "40"}}
|
i := &context.BeegoInput{Params: map[string]string{"age": "40"}}
|
||||||
ctx := &context.Context{Input: i}
|
ctx := &context.Context{Input: i}
|
||||||
ctrlr := Controller{Ctx: ctx}
|
ctrlr := Controller{Ctx: ctx}
|
||||||
|
|
||||||
val, _ := ctrlr.GetInt("age")
|
val, _ := ctrlr.GetInt("age")
|
||||||
|
if val != 40 {
|
||||||
if (val != 40) {
|
|
||||||
t.Errorf("TestGetInt expect 40,get %T,%v", val, val)
|
t.Errorf("TestGetInt expect 40,get %T,%v", val, val)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGetInt8(t *testing.T) {
|
func TestGetInt8(t *testing.T) {
|
||||||
|
|
||||||
i := &context.BeegoInput{Params: map[string]string{"age": "40"}}
|
i := &context.BeegoInput{Params: map[string]string{"age": "40"}}
|
||||||
ctx := &context.Context{Input: i}
|
ctx := &context.Context{Input: i}
|
||||||
ctrlr := Controller{Ctx: ctx}
|
ctrlr := Controller{Ctx: ctx}
|
||||||
|
|
||||||
val, _ := ctrlr.GetInt8("age")
|
val, _ := ctrlr.GetInt8("age")
|
||||||
if val != 40 {
|
if val != 40 {
|
||||||
t.Errorf("TestGetInt8 expect 40,get %T,%v", val, val)
|
t.Errorf("TestGetInt8 expect 40,get %T,%v", val, val)
|
||||||
@ -47,11 +42,9 @@ func TestGetInt8(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestGetInt16(t *testing.T) {
|
func TestGetInt16(t *testing.T) {
|
||||||
|
|
||||||
i := &context.BeegoInput{Params: map[string]string{"age": "40"}}
|
i := &context.BeegoInput{Params: map[string]string{"age": "40"}}
|
||||||
ctx := &context.Context{Input: i}
|
ctx := &context.Context{Input: i}
|
||||||
ctrlr := Controller{Ctx: ctx}
|
ctrlr := Controller{Ctx: ctx}
|
||||||
|
|
||||||
val, _ := ctrlr.GetInt16("age")
|
val, _ := ctrlr.GetInt16("age")
|
||||||
if val != 40 {
|
if val != 40 {
|
||||||
t.Errorf("TestGetInt16 expect 40,get %T,%v", val, val)
|
t.Errorf("TestGetInt16 expect 40,get %T,%v", val, val)
|
||||||
@ -59,24 +52,19 @@ func TestGetInt16(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestGetInt32(t *testing.T) {
|
func TestGetInt32(t *testing.T) {
|
||||||
|
|
||||||
i := &context.BeegoInput{Params: map[string]string{"age": "40"}}
|
i := &context.BeegoInput{Params: map[string]string{"age": "40"}}
|
||||||
ctx := &context.Context{Input: i}
|
ctx := &context.Context{Input: i}
|
||||||
ctrlr := Controller{Ctx: ctx}
|
ctrlr := Controller{Ctx: ctx}
|
||||||
|
|
||||||
val, _ := ctrlr.GetInt32("age")
|
val, _ := ctrlr.GetInt32("age")
|
||||||
fmt.Printf("%T", val)
|
|
||||||
if val != 40 {
|
if val != 40 {
|
||||||
t.Errorf("TestGetInt32 expect 40,get %T,%v", val, val)
|
t.Errorf("TestGetInt32 expect 40,get %T,%v", val, val)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGetInt64(t *testing.T) {
|
func TestGetInt64(t *testing.T) {
|
||||||
|
|
||||||
i := &context.BeegoInput{Params: map[string]string{"age": "40"}}
|
i := &context.BeegoInput{Params: map[string]string{"age": "40"}}
|
||||||
ctx := &context.Context{Input: i}
|
ctx := &context.Context{Input: i}
|
||||||
ctrlr := Controller{Ctx: ctx}
|
ctrlr := Controller{Ctx: ctx}
|
||||||
|
|
||||||
val, _ := ctrlr.GetInt64("age")
|
val, _ := ctrlr.GetInt64("age")
|
||||||
if val != 40 {
|
if val != 40 {
|
||||||
t.Errorf("TestGeetInt64 expect 40,get %T,%v", val, val)
|
t.Errorf("TestGeetInt64 expect 40,get %T,%v", val, val)
|
||||||
|
2
docs.go
2
docs.go
@ -24,7 +24,7 @@ import (
|
|||||||
var GlobalDocAPI map[string]interface{}
|
var GlobalDocAPI map[string]interface{}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
if EnableDocs {
|
if BConfig.WebConfig.EnableDocs {
|
||||||
GlobalDocAPI = make(map[string]interface{})
|
GlobalDocAPI = make(map[string]interface{})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
4
error.go
4
error.go
@ -85,7 +85,7 @@ var tpl = `
|
|||||||
func showErr(err interface{}, ctx *context.Context, Stack string) {
|
func showErr(err interface{}, ctx *context.Context, Stack string) {
|
||||||
t, _ := template.New("beegoerrortemp").Parse(tpl)
|
t, _ := template.New("beegoerrortemp").Parse(tpl)
|
||||||
data := make(map[string]string)
|
data := make(map[string]string)
|
||||||
data["AppError"] = AppName + ":" + fmt.Sprint(err)
|
data["AppError"] = BConfig.AppName + ":" + fmt.Sprint(err)
|
||||||
data["RequestMethod"] = ctx.Input.Method()
|
data["RequestMethod"] = ctx.Input.Method()
|
||||||
data["RequestURL"] = ctx.Input.URI()
|
data["RequestURL"] = ctx.Input.URI()
|
||||||
data["RemoteAddr"] = ctx.Input.IP()
|
data["RemoteAddr"] = ctx.Input.IP()
|
||||||
@ -437,7 +437,7 @@ func executeError(err *errorInfo, ctx *context.Context, code int) {
|
|||||||
method.Call(in)
|
method.Call(in)
|
||||||
|
|
||||||
//render template
|
//render template
|
||||||
if AutoRender {
|
if BConfig.WebConfig.AutoRender {
|
||||||
if err := execController.Render(); err != nil {
|
if err := execController.Render(); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
@ -20,8 +20,14 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/astaxie/beego/context"
|
"github.com/astaxie/beego/context"
|
||||||
|
"github.com/astaxie/beego/logs"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
BeeLogger = logs.NewLogger(10000)
|
||||||
|
BeeLogger.SetLogger("console", "")
|
||||||
|
}
|
||||||
|
|
||||||
var FilterUser = func(ctx *context.Context) {
|
var FilterUser = func(ctx *context.Context) {
|
||||||
ctx.Output.Body([]byte("i am " + ctx.Input.Params[":last"] + ctx.Input.Params[":first"]))
|
ctx.Output.Body([]byte("i am " + ctx.Input.Params[":last"] + ctx.Input.Params[":first"]))
|
||||||
}
|
}
|
||||||
|
10
flash.go
10
flash.go
@ -83,27 +83,27 @@ func (fd *FlashData) Store(c *Controller) {
|
|||||||
c.Data["flash"] = fd.Data
|
c.Data["flash"] = fd.Data
|
||||||
var flashValue string
|
var flashValue string
|
||||||
for key, value := range fd.Data {
|
for key, value := range fd.Data {
|
||||||
flashValue += "\x00" + key + "\x23" + FlashSeperator + "\x23" + value + "\x00"
|
flashValue += "\x00" + key + "\x23" + BConfig.WebConfig.FlashSeperator + "\x23" + value + "\x00"
|
||||||
}
|
}
|
||||||
c.Ctx.SetCookie(FlashName, url.QueryEscape(flashValue), 0, "/")
|
c.Ctx.SetCookie(BConfig.WebConfig.FlashName, url.QueryEscape(flashValue), 0, "/")
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReadFromRequest parsed flash data from encoded values in cookie.
|
// ReadFromRequest parsed flash data from encoded values in cookie.
|
||||||
func ReadFromRequest(c *Controller) *FlashData {
|
func ReadFromRequest(c *Controller) *FlashData {
|
||||||
flash := NewFlash()
|
flash := NewFlash()
|
||||||
if cookie, err := c.Ctx.Request.Cookie(FlashName); err == nil {
|
if cookie, err := c.Ctx.Request.Cookie(BConfig.WebConfig.FlashName); err == nil {
|
||||||
v, _ := url.QueryUnescape(cookie.Value)
|
v, _ := url.QueryUnescape(cookie.Value)
|
||||||
vals := strings.Split(v, "\x00")
|
vals := strings.Split(v, "\x00")
|
||||||
for _, v := range vals {
|
for _, v := range vals {
|
||||||
if len(v) > 0 {
|
if len(v) > 0 {
|
||||||
kv := strings.Split(v, "\x23"+FlashSeperator+"\x23")
|
kv := strings.Split(v, "\x23"+BConfig.WebConfig.FlashSeperator+"\x23")
|
||||||
if len(kv) == 2 {
|
if len(kv) == 2 {
|
||||||
flash.Data[kv[0]] = kv[1]
|
flash.Data[kv[0]] = kv[1]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//read one time then delete it
|
//read one time then delete it
|
||||||
c.Ctx.SetCookie(FlashName, "", -1, "/")
|
c.Ctx.SetCookie(BConfig.WebConfig.FlashName, "", -1, "/")
|
||||||
}
|
}
|
||||||
c.Data["flash"] = flash.Data
|
c.Data["flash"] = flash.Data
|
||||||
return flash
|
return flash
|
||||||
|
28
hooks.go
28
hooks.go
@ -41,19 +41,19 @@ func registerDefaultErrorHandler() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func registerSession() error {
|
func registerSession() error {
|
||||||
if SessionOn {
|
if BConfig.WebConfig.Session.SessionOn {
|
||||||
var err error
|
var err error
|
||||||
sessionConfig := AppConfig.String("sessionConfig")
|
sessionConfig := AppConfig.String("sessionConfig")
|
||||||
if sessionConfig == "" {
|
if sessionConfig == "" {
|
||||||
sessionConfig = `{"cookieName":"` + SessionName + `",` +
|
sessionConfig = `{"cookieName":"` + BConfig.WebConfig.Session.SessionName + `",` +
|
||||||
`"gclifetime":` + strconv.FormatInt(SessionGCMaxLifetime, 10) + `,` +
|
`"gclifetime":` + strconv.FormatInt(BConfig.WebConfig.Session.SessionGCMaxLifetime, 10) + `,` +
|
||||||
`"providerConfig":"` + filepath.ToSlash(SessionProviderConfig) + `",` +
|
`"providerConfig":"` + filepath.ToSlash(BConfig.WebConfig.Session.SessionProviderConfig) + `",` +
|
||||||
`"secure":` + strconv.FormatBool(EnableHTTPTLS) + `,` +
|
`"secure":` + strconv.FormatBool(BConfig.Listen.HTTPSEnable) + `,` +
|
||||||
`"enableSetCookie":` + strconv.FormatBool(SessionAutoSetCookie) + `,` +
|
`"enableSetCookie":` + strconv.FormatBool(BConfig.WebConfig.Session.SessionAutoSetCookie) + `,` +
|
||||||
`"domain":"` + SessionDomain + `",` +
|
`"domain":"` + BConfig.WebConfig.Session.SessionDomain + `",` +
|
||||||
`"cookieLifeTime":` + strconv.Itoa(SessionCookieLifeTime) + `}`
|
`"cookieLifeTime":` + strconv.Itoa(BConfig.WebConfig.Session.SessionCookieLifeTime) + `}`
|
||||||
}
|
}
|
||||||
GlobalSessions, err = session.NewManager(SessionProvider, sessionConfig)
|
GlobalSessions, err = session.NewManager(BConfig.WebConfig.Session.SessionProvider, sessionConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -63,9 +63,9 @@ func registerSession() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func registerTemplate() error {
|
func registerTemplate() error {
|
||||||
if AutoRender {
|
if BConfig.WebConfig.AutoRender {
|
||||||
err := BuildTemplate(ViewsPath)
|
err := BuildTemplate(BConfig.WebConfig.ViewsPath)
|
||||||
if err != nil && RunMode == "dev" {
|
if err != nil && BConfig.RunMode == "dev" {
|
||||||
Warn(err)
|
Warn(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -73,7 +73,7 @@ func registerTemplate() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func registerDocs() error {
|
func registerDocs() error {
|
||||||
if EnableDocs {
|
if BConfig.WebConfig.EnableDocs {
|
||||||
Get("/docs", serverDocs)
|
Get("/docs", serverDocs)
|
||||||
Get("/docs/*", serverDocs)
|
Get("/docs/*", serverDocs)
|
||||||
}
|
}
|
||||||
@ -81,7 +81,7 @@ func registerDocs() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func registerAdmin() error {
|
func registerAdmin() error {
|
||||||
if EnableAdmin {
|
if BConfig.Listen.AdminEnable {
|
||||||
go beeAdminApp.Run()
|
go beeAdminApp.Run()
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
12
parser.go
12
parser.go
@ -130,7 +130,7 @@ func parserComments(comments *ast.CommentGroup, funcName, controllerName, pkgpat
|
|||||||
}
|
}
|
||||||
|
|
||||||
func genRouterCode() {
|
func genRouterCode() {
|
||||||
os.Mkdir(path.Join(workPath, "routers"), 0755)
|
os.Mkdir("routers", 0755)
|
||||||
Info("generate router from comments")
|
Info("generate router from comments")
|
||||||
var (
|
var (
|
||||||
globalinfo string
|
globalinfo string
|
||||||
@ -172,7 +172,7 @@ func genRouterCode() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if globalinfo != "" {
|
if globalinfo != "" {
|
||||||
f, err := os.Create(path.Join(workPath, "routers", commentFilename))
|
f, err := os.Create(path.Join("routers", commentFilename))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
@ -182,11 +182,11 @@ func genRouterCode() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func compareFile(pkgRealpath string) bool {
|
func compareFile(pkgRealpath string) bool {
|
||||||
if !utils.FileExists(path.Join(workPath, "routers", commentFilename)) {
|
if !utils.FileExists(path.Join("routers", commentFilename)) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
if utils.FileExists(path.Join(workPath, lastupdateFilename)) {
|
if utils.FileExists(lastupdateFilename) {
|
||||||
content, err := ioutil.ReadFile(path.Join(workPath, lastupdateFilename))
|
content, err := ioutil.ReadFile(lastupdateFilename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -214,7 +214,7 @@ func savetoFile(pkgRealpath string) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
ioutil.WriteFile(path.Join(workPath, lastupdateFilename), d, os.ModePerm)
|
ioutil.WriteFile(lastupdateFilename, d, os.ModePerm)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getpathTime(pkgRealpath string) (lastupdate int64, err error) {
|
func getpathTime(pkgRealpath string) (lastupdate int64, err error) {
|
||||||
|
@ -220,7 +220,7 @@ func Test_Preflight(t *testing.T) {
|
|||||||
func Benchmark_WithoutCORS(b *testing.B) {
|
func Benchmark_WithoutCORS(b *testing.B) {
|
||||||
recorder := httptest.NewRecorder()
|
recorder := httptest.NewRecorder()
|
||||||
handler := beego.NewControllerRegister()
|
handler := beego.NewControllerRegister()
|
||||||
beego.RunMode = "prod"
|
beego.BConfig.RunMode = "prod"
|
||||||
handler.Any("/foo", func(ctx *context.Context) {
|
handler.Any("/foo", func(ctx *context.Context) {
|
||||||
ctx.Output.SetStatus(500)
|
ctx.Output.SetStatus(500)
|
||||||
})
|
})
|
||||||
@ -234,7 +234,7 @@ func Benchmark_WithoutCORS(b *testing.B) {
|
|||||||
func Benchmark_WithCORS(b *testing.B) {
|
func Benchmark_WithCORS(b *testing.B) {
|
||||||
recorder := httptest.NewRecorder()
|
recorder := httptest.NewRecorder()
|
||||||
handler := beego.NewControllerRegister()
|
handler := beego.NewControllerRegister()
|
||||||
beego.RunMode = "prod"
|
beego.BConfig.RunMode = "prod"
|
||||||
handler.InsertFilter("*", beego.BeforeRouter, Allow(&Options{
|
handler.InsertFilter("*", beego.BeforeRouter, Allow(&Options{
|
||||||
AllowAllOrigins: true,
|
AllowAllOrigins: true,
|
||||||
AllowCredentials: true,
|
AllowCredentials: true,
|
||||||
|
@ -1,140 +0,0 @@
|
|||||||
// Copyright 2014 beego Author. All Rights Reserved.
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// 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
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
// Package jwt provides JWT (Json Web Token) authentication
|
|
||||||
//
|
|
||||||
// Usage
|
|
||||||
// In file main.go
|
|
||||||
//
|
|
||||||
// import (
|
|
||||||
// "github.com/astaxie/beego"
|
|
||||||
// "github.com/astaxie/beego/plugins/jwt"
|
|
||||||
// )
|
|
||||||
//
|
|
||||||
// func main() {
|
|
||||||
// // JWT for Url matching /v1/*
|
|
||||||
// // PrivateKeyPath: The path for the private RSA key used by JWT
|
|
||||||
// // PublicKeyPath: The path for the public RSA key used by JWT
|
|
||||||
// // The list of Urls should be excluded from the JWT Auth
|
|
||||||
// beego.InsertFilter("/v1/*", beego.BeforeRouter, jwt.AuthRequest(&jwt.Options{
|
|
||||||
// PrivateKeyPath: "conf/beeblog.rsa",
|
|
||||||
// PublicKeyPath: "conf/beeblog.rsa.pub",
|
|
||||||
// WhiteList: []string{"/v1/jwt/issue-token", "/docs"},
|
|
||||||
// }))
|
|
||||||
// beego.Run()
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// In file routers/router.go
|
|
||||||
//
|
|
||||||
// import (
|
|
||||||
// "github.com/astaxie/beego"
|
|
||||||
// "github.com/astaxie/beego/plugins/jwt"
|
|
||||||
// )
|
|
||||||
// func init() {
|
|
||||||
// ns := beego.NSNamespace("/jwt",
|
|
||||||
// beego.NSInclude(
|
|
||||||
// &jwt.JwtController{},
|
|
||||||
// ),
|
|
||||||
// )
|
|
||||||
// beego.AddNamespace(ns)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
package jwt
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/astaxie/beego"
|
|
||||||
"github.com/astaxie/beego/context"
|
|
||||||
"github.com/astaxie/beego/logs"
|
|
||||||
goJwt "github.com/dgrijalva/jwt-go"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Options for the JWT Auth
|
|
||||||
type Options struct {
|
|
||||||
PrivateKeyPath string
|
|
||||||
PublicKeyPath string
|
|
||||||
WhiteList []string
|
|
||||||
}
|
|
||||||
|
|
||||||
// RSAKeys store PrivateKey and PublicKey
|
|
||||||
var RSAKeys struct {
|
|
||||||
PrivateKey []byte
|
|
||||||
PublicKey []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
// AuthRequest retunn FilterFunc
|
|
||||||
func AuthRequest(o *Options) beego.FilterFunc {
|
|
||||||
RSAKeys.PrivateKey, _ = ioutil.ReadFile(o.PrivateKeyPath)
|
|
||||||
RSAKeys.PublicKey, _ = ioutil.ReadFile(o.PublicKeyPath)
|
|
||||||
|
|
||||||
return func(ctx *context.Context) {
|
|
||||||
// :TODO the url patterns should be considered here.
|
|
||||||
// Shouldn't only use the string equal
|
|
||||||
for _, method := range o.WhiteList {
|
|
||||||
if method == ctx.Request.URL.Path {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
parsedToken, err := goJwt.ParseFromRequest(ctx.Request, func(t *goJwt.Token) (interface{}, error) {
|
|
||||||
return RSAKeys.PublicKey, nil
|
|
||||||
})
|
|
||||||
|
|
||||||
if err == nil && parsedToken.Valid {
|
|
||||||
ctx.Output.SetStatus(http.StatusOK)
|
|
||||||
} else {
|
|
||||||
ctx.Output.SetStatus(http.StatusUnauthorized)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Controller oprations for Jwt
|
|
||||||
type Controller struct {
|
|
||||||
beego.Controller
|
|
||||||
}
|
|
||||||
|
|
||||||
// URLMapping is used to mapping the string to method
|
|
||||||
func (c *Controller) URLMapping() {
|
|
||||||
c.Mapping("IssueToken", c.IssueToken)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IssueToken function
|
|
||||||
// @Title IssueToken
|
|
||||||
// @Description Issue a Json Web Token
|
|
||||||
// @Success 200 string
|
|
||||||
// @Failure 403 no privilege to access
|
|
||||||
// @Failure 500 server inner error
|
|
||||||
// @router /issue-token [get]
|
|
||||||
func (c *Controller) IssueToken() {
|
|
||||||
c.Data["json"] = CreateToken()
|
|
||||||
c.ServeJSON()
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateToken return the token
|
|
||||||
func CreateToken() map[string]string {
|
|
||||||
log := logs.NewLogger(10000)
|
|
||||||
log.SetLogger("console", "")
|
|
||||||
|
|
||||||
token := goJwt.New(goJwt.GetSigningMethod("RS256")) // Create a Token that will be signed with RSA 256.
|
|
||||||
token.Claims["ID"] = "This is my super fake ID"
|
|
||||||
token.Claims["exp"] = time.Now().Unix() + 36000
|
|
||||||
// The claims object allows you to store information in the actual token.
|
|
||||||
tokenString, _ := token.SignedString(RSAKeys.PrivateKey)
|
|
||||||
// tokenString Contains the actual token you should share with your client.
|
|
||||||
return map[string]string{"token": tokenString}
|
|
||||||
}
|
|
@ -1,88 +0,0 @@
|
|||||||
package jwt
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/astaxie/beego"
|
|
||||||
"net/http"
|
|
||||||
"net/http/httptest"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func testRequest(method, path string) (*httptest.ResponseRecorder, *http.Request) {
|
|
||||||
request, _ := http.NewRequest(method, path, nil)
|
|
||||||
recorder := httptest.NewRecorder()
|
|
||||||
|
|
||||||
return recorder, request
|
|
||||||
}
|
|
||||||
|
|
||||||
func Test_IssueTokenAction(t *testing.T) {
|
|
||||||
url := "/v1/jwt/issue-token"
|
|
||||||
|
|
||||||
mux := beego.NewControllerRegister()
|
|
||||||
|
|
||||||
mux.InsertFilter("*", beego.BeforeRouter, AuthRequest(&Options{
|
|
||||||
PrivateKeyPath: "test/jwt.rsa",
|
|
||||||
PublicKeyPath: "test/jwt.rsa.pub",
|
|
||||||
WhiteList: []string{"/v1/jwt/issue-token", "/docs"},
|
|
||||||
}))
|
|
||||||
|
|
||||||
mux.Add("/v1/jwt/issue-token", &JwtController{}, "get:IssueToken")
|
|
||||||
|
|
||||||
rw, r := testRequest("GET", url)
|
|
||||||
mux.ServeHTTP(rw, r)
|
|
||||||
|
|
||||||
if rw.Code != http.StatusOK {
|
|
||||||
t.Errorf("Shoud return 200")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (tc *JwtController) Foo() {
|
|
||||||
tc.Ctx.Output.Body([]byte("ok"))
|
|
||||||
}
|
|
||||||
|
|
||||||
func Test_AuthRequestWithAuthorizationHeader(t *testing.T) {
|
|
||||||
|
|
||||||
url := "/foo"
|
|
||||||
|
|
||||||
mux := beego.NewControllerRegister()
|
|
||||||
|
|
||||||
mux.InsertFilter("*", beego.BeforeRouter, AuthRequest(&Options{
|
|
||||||
PrivateKeyPath: "test/jwt.rsa",
|
|
||||||
PublicKeyPath: "test/jwt.rsa.pub",
|
|
||||||
WhiteList: []string{"/v1/jwt/issue-token", "/docs"},
|
|
||||||
}))
|
|
||||||
|
|
||||||
mux.Add("/foo", &JwtController{}, "get:Foo")
|
|
||||||
newToken := CreateToken()
|
|
||||||
|
|
||||||
rw, r := testRequest("GET", url)
|
|
||||||
r.Header.Add("Authorization", "Bearer "+newToken["token"])
|
|
||||||
mux.ServeHTTP(rw, r)
|
|
||||||
|
|
||||||
if rw.Code != http.StatusOK {
|
|
||||||
t.Errorf("Shoud return 200")
|
|
||||||
}
|
|
||||||
if rw.Body.String() != "ok" {
|
|
||||||
t.Errorf("Should output ok")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func Test_AuthRequestWithoutAuthorizationHeader(t *testing.T) {
|
|
||||||
url := "/foo"
|
|
||||||
|
|
||||||
mux := beego.NewControllerRegister()
|
|
||||||
|
|
||||||
mux.InsertFilter("*", beego.BeforeRouter, AuthRequest(&Options{
|
|
||||||
PrivateKeyPath: "test/jwt.rsa",
|
|
||||||
PublicKeyPath: "test/jwt.rsa.pub",
|
|
||||||
WhiteList: []string{"/v1/jwt/issue-token", "/docs"},
|
|
||||||
}))
|
|
||||||
|
|
||||||
mux.Add("/foo", &JwtController{}, "get:Foo")
|
|
||||||
|
|
||||||
rw, r := testRequest("GET", url)
|
|
||||||
mux.ServeHTTP(rw, r)
|
|
||||||
|
|
||||||
if rw.Code != http.StatusUnauthorized {
|
|
||||||
t.Errorf("Shoud return 401")
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
-----BEGIN RSA PRIVATE KEY-----
|
|
||||||
MIICWwIBAAKBgQCdu+23Y/0J/FTQKnIPnxupoOo9/OYCv90DPXN/KLLRAMjYzgcC
|
|
||||||
DsBST2xVR5jlimI/gyfCpVB62dwpSzzr0cA3MoDhbaGWuTdQUX9zmiLoQ4I7X6h0
|
|
||||||
dwyiihOz+CzOMlAg5+qBhiTGcKvIFlfEc1FUcn/tB3PVRG9j6B1Ibz5CnQIDAQAB
|
|
||||||
AoGAFGg+/i4ai9MwqeoD7c95Bb5C8BgrLgnir0uhCL+cOvwuABbPw01jRoLuEi58
|
|
||||||
Mp5vzaXLXByFSA+ts03/qMbvZkDGac5g5kLli5TjHIONMxVBrdfGQ1+OApnaPayN
|
|
||||||
N+HYjZKs6xao6J5iFqfA0FqzDR9kQhUoeosdQoo1GlxDckECQQDO/0LJrFiLzYWe
|
|
||||||
qS/DxfAnFu2BlClKZjxRJ3vIkRRaON6HPl8BeJW901bFKG5+WSfO+OwQ9egWaf3X
|
|
||||||
fFm/oEHRAkEAwxMor4fOkBZbL4KPW7sen169vwnXuYusqj0t3dIeiIVrCigkOMT4
|
|
||||||
OvX/63u4CTdXh1D5u/4Z/1HTYH92VCP7DQJAJPxbNKnE0IYSf/z++d4eQP3JxkNw
|
|
||||||
9Ug7Msz5QycZGd3bdRLh6uNe7iIa+PN2esD3afX0SDuIEqkxoBUp/CFoYQJAUmi3
|
|
||||||
mV+/7bLkFrALK+9iwmTdt+TKk4HkEY8C32CysW3biFDo7GqZix79XFfJqWsNuQaG
|
|
||||||
WdrA1NGWgH+YV3dTyQJAIWEZGAuUXRkQB20LfjGzpsKgQFbqjTisMS0qe3JjnDwu
|
|
||||||
0JR8sYXapgeEEEisH+OtkZKIfyeFOwoUyNC83bcvgw==
|
|
||||||
-----END RSA PRIVATE KEY-----
|
|
@ -1,6 +0,0 @@
|
|||||||
-----BEGIN PUBLIC KEY-----
|
|
||||||
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCdu+23Y/0J/FTQKnIPnxupoOo9
|
|
||||||
/OYCv90DPXN/KLLRAMjYzgcCDsBST2xVR5jlimI/gyfCpVB62dwpSzzr0cA3MoDh
|
|
||||||
baGWuTdQUX9zmiLoQ4I7X6h0dwyiihOz+CzOMlAg5+qBhiTGcKvIFlfEc1FUcn/t
|
|
||||||
B3PVRG9j6B1Ibz5CnQIDAQAB
|
|
||||||
-----END PUBLIC KEY-----
|
|
36
router.go
36
router.go
@ -87,7 +87,7 @@ func (l *logFilter) Filter(ctx *beecontext.Context) bool {
|
|||||||
if requestPath == "/favicon.ico" || requestPath == "/robots.txt" {
|
if requestPath == "/favicon.ico" || requestPath == "/robots.txt" {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
for prefix := range StaticDir {
|
for prefix := range BConfig.WebConfig.StaticDir {
|
||||||
if strings.HasPrefix(requestPath, prefix) {
|
if strings.HasPrefix(requestPath, prefix) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -183,7 +183,7 @@ func (p *ControllerRegister) Add(pattern string, c ControllerInterface, mappingM
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (p *ControllerRegister) addToRouter(method, pattern string, r *controllerInfo) {
|
func (p *ControllerRegister) addToRouter(method, pattern string, r *controllerInfo) {
|
||||||
if !RouterCaseSensitive {
|
if !BConfig.RouterCaseSensitive {
|
||||||
pattern = strings.ToLower(pattern)
|
pattern = strings.ToLower(pattern)
|
||||||
}
|
}
|
||||||
if t, ok := p.routers[method]; ok {
|
if t, ok := p.routers[method]; ok {
|
||||||
@ -198,7 +198,7 @@ func (p *ControllerRegister) addToRouter(method, pattern string, r *controllerIn
|
|||||||
// Include only when the Runmode is dev will generate router file in the router/auto.go from the controller
|
// Include only when the Runmode is dev will generate router file in the router/auto.go from the controller
|
||||||
// Include(&BankAccount{}, &OrderController{},&RefundController{},&ReceiptController{})
|
// Include(&BankAccount{}, &OrderController{},&RefundController{},&ReceiptController{})
|
||||||
func (p *ControllerRegister) Include(cList ...ControllerInterface) {
|
func (p *ControllerRegister) Include(cList ...ControllerInterface) {
|
||||||
if RunMode == "dev" {
|
if BConfig.RunMode == "dev" {
|
||||||
skip := make(map[string]bool, 10)
|
skip := make(map[string]bool, 10)
|
||||||
for _, c := range cList {
|
for _, c := range cList {
|
||||||
reflectVal := reflect.ValueOf(c)
|
reflectVal := reflect.ValueOf(c)
|
||||||
@ -406,7 +406,7 @@ func (p *ControllerRegister) InsertFilter(pattern string, pos int, filter Filter
|
|||||||
mr.tree = NewTree()
|
mr.tree = NewTree()
|
||||||
mr.pattern = pattern
|
mr.pattern = pattern
|
||||||
mr.filterFunc = filter
|
mr.filterFunc = filter
|
||||||
if !RouterCaseSensitive {
|
if !BConfig.RouterCaseSensitive {
|
||||||
pattern = strings.ToLower(pattern)
|
pattern = strings.ToLower(pattern)
|
||||||
}
|
}
|
||||||
if len(params) == 0 {
|
if len(params) == 0 {
|
||||||
@ -580,8 +580,8 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request)
|
|||||||
|
|
||||||
w := &responseWriter{rw, false, 0}
|
w := &responseWriter{rw, false, 0}
|
||||||
|
|
||||||
if RunMode == "dev" {
|
if BConfig.RunMode == "dev" {
|
||||||
w.Header().Set("Server", BeegoServerName)
|
w.Header().Set("Server", BConfig.ServerName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// init context
|
// init context
|
||||||
@ -592,12 +592,12 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request)
|
|||||||
Output: beecontext.NewOutput(),
|
Output: beecontext.NewOutput(),
|
||||||
}
|
}
|
||||||
context.Output.Context = context
|
context.Output.Context = context
|
||||||
context.Output.EnableGzip = EnableGzip
|
context.Output.EnableGzip = BConfig.EnableGzip
|
||||||
|
|
||||||
defer p.recoverPanic(context)
|
defer p.recoverPanic(context)
|
||||||
|
|
||||||
var urlPath string
|
var urlPath string
|
||||||
if !RouterCaseSensitive {
|
if !BConfig.RouterCaseSensitive {
|
||||||
urlPath = strings.ToLower(r.URL.Path)
|
urlPath = strings.ToLower(r.URL.Path)
|
||||||
} else {
|
} else {
|
||||||
urlPath = r.URL.Path
|
urlPath = r.URL.Path
|
||||||
@ -646,7 +646,7 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// session init
|
// session init
|
||||||
if SessionOn {
|
if BConfig.WebConfig.Session.SessionOn {
|
||||||
var err error
|
var err error
|
||||||
context.Input.CruSession, err = GlobalSessions.SessionStart(w, r)
|
context.Input.CruSession, err = GlobalSessions.SessionStart(w, r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -660,10 +660,10 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if r.Method != "GET" && r.Method != "HEAD" {
|
if r.Method != "GET" && r.Method != "HEAD" {
|
||||||
if CopyRequestBody && !context.Input.IsUpload() {
|
if BConfig.CopyRequestBody && !context.Input.IsUpload() {
|
||||||
context.Input.CopyBody()
|
context.Input.CopyBody()
|
||||||
}
|
}
|
||||||
context.Input.ParseFormOrMulitForm(MaxMemory)
|
context.Input.ParseFormOrMulitForm(BConfig.MaxMemory)
|
||||||
}
|
}
|
||||||
|
|
||||||
if doFilter(BeforeRouter) {
|
if doFilter(BeforeRouter) {
|
||||||
@ -765,7 +765,7 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request)
|
|||||||
execController.Prepare()
|
execController.Prepare()
|
||||||
|
|
||||||
//if XSRF is Enable then check cookie where there has any cookie in the request's cookie _csrf
|
//if XSRF is Enable then check cookie where there has any cookie in the request's cookie _csrf
|
||||||
if EnableXSRF {
|
if BConfig.WebConfig.EnableXSRF {
|
||||||
execController.XSRFToken()
|
execController.XSRFToken()
|
||||||
if r.Method == "POST" || r.Method == "DELETE" || r.Method == "PUT" ||
|
if r.Method == "POST" || r.Method == "DELETE" || r.Method == "PUT" ||
|
||||||
(r.Method == "POST" && (context.Input.Query("_method") == "DELETE" || context.Input.Query("_method") == "PUT")) {
|
(r.Method == "POST" && (context.Input.Query("_method") == "DELETE" || context.Input.Query("_method") == "PUT")) {
|
||||||
@ -802,7 +802,7 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request)
|
|||||||
|
|
||||||
//render template
|
//render template
|
||||||
if !w.started && context.Output.Status == 0 {
|
if !w.started && context.Output.Status == 0 {
|
||||||
if AutoRender {
|
if BConfig.WebConfig.AutoRender {
|
||||||
if err := execController.Render(); err != nil {
|
if err := execController.Render(); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
@ -825,7 +825,7 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request)
|
|||||||
Admin:
|
Admin:
|
||||||
timeend := time.Since(starttime)
|
timeend := time.Since(starttime)
|
||||||
//admin module record QPS
|
//admin module record QPS
|
||||||
if EnableAdmin {
|
if BConfig.Listen.AdminEnable {
|
||||||
if FilterMonitorFunc(r.Method, r.URL.Path, timeend) {
|
if FilterMonitorFunc(r.Method, r.URL.Path, timeend) {
|
||||||
if runrouter != nil {
|
if runrouter != nil {
|
||||||
go toolbox.StatisticsMap.AddStatistics(r.Method, r.URL.Path, runrouter.Name(), timeend)
|
go toolbox.StatisticsMap.AddStatistics(r.Method, r.URL.Path, runrouter.Name(), timeend)
|
||||||
@ -835,7 +835,7 @@ Admin:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if RunMode == "dev" || AccessLogs {
|
if BConfig.RunMode == "dev" || BConfig.Log.AccessLogs {
|
||||||
var devinfo string
|
var devinfo string
|
||||||
if findrouter {
|
if findrouter {
|
||||||
if routerInfo != nil {
|
if routerInfo != nil {
|
||||||
@ -862,10 +862,10 @@ func (p *ControllerRegister) recoverPanic(context *beecontext.Context) {
|
|||||||
if err == ErrAbort {
|
if err == ErrAbort {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if !RecoverPanic {
|
if !BConfig.RecoverPanic {
|
||||||
panic(err)
|
panic(err)
|
||||||
} else {
|
} else {
|
||||||
if EnableErrorsShow {
|
if BConfig.EnableErrorsShow {
|
||||||
if _, ok := ErrorMaps[fmt.Sprint(err)]; ok {
|
if _, ok := ErrorMaps[fmt.Sprint(err)]; ok {
|
||||||
exception(fmt.Sprint(err), context)
|
exception(fmt.Sprint(err), context)
|
||||||
return
|
return
|
||||||
@ -882,7 +882,7 @@ func (p *ControllerRegister) recoverPanic(context *beecontext.Context) {
|
|||||||
Critical(fmt.Sprintf("%s:%d", file, line))
|
Critical(fmt.Sprintf("%s:%d", file, line))
|
||||||
stack = stack + fmt.Sprintln(fmt.Sprintf("%s:%d", file, line))
|
stack = stack + fmt.Sprintln(fmt.Sprintf("%s:%d", file, line))
|
||||||
}
|
}
|
||||||
if RunMode == "dev" {
|
if BConfig.RunMode == "dev" {
|
||||||
showErr(err, context, stack)
|
showErr(err, context, stack)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,7 @@ func serverStaticRouter(ctx *context.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if filePath == "" || fileInfo == nil {
|
if filePath == "" || fileInfo == nil {
|
||||||
if RunMode == "dev" {
|
if BConfig.RunMode == "dev" {
|
||||||
Warn("Can't find/open the file:", filePath, err)
|
Warn("Can't find/open the file:", filePath, err)
|
||||||
}
|
}
|
||||||
http.NotFound(ctx.ResponseWriter, ctx.Request)
|
http.NotFound(ctx.ResponseWriter, ctx.Request)
|
||||||
@ -61,14 +61,14 @@ func serverStaticRouter(ctx *context.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var enableCompress = EnableGzip && isStaticCompress(filePath)
|
var enableCompress = BConfig.EnableGzip && isStaticCompress(filePath)
|
||||||
var acceptEncoding string
|
var acceptEncoding string
|
||||||
if enableCompress {
|
if enableCompress {
|
||||||
acceptEncoding = context.ParseEncoding(ctx.Request)
|
acceptEncoding = context.ParseEncoding(ctx.Request)
|
||||||
}
|
}
|
||||||
b, n, sch, err := openFile(filePath, fileInfo, acceptEncoding)
|
b, n, sch, err := openFile(filePath, fileInfo, acceptEncoding)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if RunMode == "dev" {
|
if BConfig.RunMode == "dev" {
|
||||||
Warn("Can't compress the file:", filePath, err)
|
Warn("Can't compress the file:", filePath, err)
|
||||||
}
|
}
|
||||||
http.NotFound(ctx.ResponseWriter, ctx.Request)
|
http.NotFound(ctx.ResponseWriter, ctx.Request)
|
||||||
@ -133,7 +133,7 @@ func isOk(s *serveContentHolder, fi os.FileInfo) bool {
|
|||||||
|
|
||||||
// isStaticCompress detect static files
|
// isStaticCompress detect static files
|
||||||
func isStaticCompress(filePath string) bool {
|
func isStaticCompress(filePath string) bool {
|
||||||
for _, statExtension := range StaticExtensionsToGzip {
|
for _, statExtension := range BConfig.WebConfig.StaticExtensionsToGzip {
|
||||||
if strings.HasSuffix(strings.ToLower(filePath), strings.ToLower(statExtension)) {
|
if strings.HasSuffix(strings.ToLower(filePath), strings.ToLower(statExtension)) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -151,7 +151,7 @@ func searchFile(ctx *context.Context) (string, os.FileInfo, error) {
|
|||||||
if fi, _ := os.Stat(file); fi != nil {
|
if fi, _ := os.Stat(file); fi != nil {
|
||||||
return file, fi, nil
|
return file, fi, nil
|
||||||
}
|
}
|
||||||
for _, staticDir := range StaticDir {
|
for _, staticDir := range BConfig.WebConfig.StaticDir {
|
||||||
filePath := path.Join(staticDir, requestPath)
|
filePath := path.Join(staticDir, requestPath)
|
||||||
if fi, _ := os.Stat(filePath); fi != nil {
|
if fi, _ := os.Stat(filePath); fi != nil {
|
||||||
return filePath, fi, nil
|
return filePath, fi, nil
|
||||||
@ -160,7 +160,7 @@ func searchFile(ctx *context.Context) (string, os.FileInfo, error) {
|
|||||||
return "", nil, errors.New(requestPath + " file not find")
|
return "", nil, errors.New(requestPath + " file not find")
|
||||||
}
|
}
|
||||||
|
|
||||||
for prefix, staticDir := range StaticDir {
|
for prefix, staticDir := range BConfig.WebConfig.StaticDir {
|
||||||
if len(prefix) == 0 {
|
if len(prefix) == 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -193,5 +193,5 @@ func lookupFile(ctx *context.Context) (bool, string, os.FileInfo, error) {
|
|||||||
if ifi, _ := os.Stat(ifp); ifi != nil && ifi.Mode().IsRegular() {
|
if ifi, _ := os.Stat(ifp); ifi != nil && ifi.Mode().IsRegular() {
|
||||||
return false, ifp, ifi, err
|
return false, ifp, ifi, err
|
||||||
}
|
}
|
||||||
return !DirectoryIndex, fp, fi, err
|
return !BConfig.WebConfig.DirectoryIndex, fp, fi, err
|
||||||
}
|
}
|
||||||
|
12
template.go
12
template.go
@ -176,7 +176,7 @@ func getTplDeep(root, file, parent string, t *template.Template) (*template.Temp
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, [][]string{}, err
|
return nil, [][]string{}, err
|
||||||
}
|
}
|
||||||
reg := regexp.MustCompile(TemplateLeft + "[ ]*template[ ]+\"([^\"]+)\"")
|
reg := regexp.MustCompile(BConfig.WebConfig.TemplateLeft + "[ ]*template[ ]+\"([^\"]+)\"")
|
||||||
allsub := reg.FindAllStringSubmatch(string(data), -1)
|
allsub := reg.FindAllStringSubmatch(string(data), -1)
|
||||||
for _, m := range allsub {
|
for _, m := range allsub {
|
||||||
if len(m) == 2 {
|
if len(m) == 2 {
|
||||||
@ -197,7 +197,7 @@ func getTplDeep(root, file, parent string, t *template.Template) (*template.Temp
|
|||||||
}
|
}
|
||||||
|
|
||||||
func getTemplate(root, file string, others ...string) (t *template.Template, err error) {
|
func getTemplate(root, file string, others ...string) (t *template.Template, err error) {
|
||||||
t = template.New(file).Delims(TemplateLeft, TemplateRight).Funcs(beegoTplFuncMap)
|
t = template.New(file).Delims(BConfig.WebConfig.TemplateLeft, BConfig.WebConfig.TemplateRight).Funcs(beegoTplFuncMap)
|
||||||
var submods [][]string
|
var submods [][]string
|
||||||
t, submods, err = getTplDeep(root, file, "", t)
|
t, submods, err = getTplDeep(root, file, "", t)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -239,7 +239,7 @@ func _getTemplate(t0 *template.Template, root string, submods [][]string, others
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
reg := regexp.MustCompile(TemplateLeft + "[ ]*define[ ]+\"([^\"]+)\"")
|
reg := regexp.MustCompile(BConfig.WebConfig.TemplateLeft + "[ ]*define[ ]+\"([^\"]+)\"")
|
||||||
allsub := reg.FindAllStringSubmatch(string(data), -1)
|
allsub := reg.FindAllStringSubmatch(string(data), -1)
|
||||||
for _, sub := range allsub {
|
for _, sub := range allsub {
|
||||||
if len(sub) == 2 && sub[1] == m[1] {
|
if len(sub) == 2 && sub[1] == m[1] {
|
||||||
@ -262,7 +262,7 @@ func _getTemplate(t0 *template.Template, root string, submods [][]string, others
|
|||||||
|
|
||||||
// SetViewsPath sets view directory path in beego application.
|
// SetViewsPath sets view directory path in beego application.
|
||||||
func SetViewsPath(path string) *App {
|
func SetViewsPath(path string) *App {
|
||||||
ViewsPath = path
|
BConfig.WebConfig.ViewsPath = path
|
||||||
return BeeApp
|
return BeeApp
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -273,7 +273,7 @@ func SetStaticPath(url string, path string) *App {
|
|||||||
url = "/" + url
|
url = "/" + url
|
||||||
}
|
}
|
||||||
url = strings.TrimRight(url, "/")
|
url = strings.TrimRight(url, "/")
|
||||||
StaticDir[url] = path
|
BConfig.WebConfig.StaticDir[url] = path
|
||||||
return BeeApp
|
return BeeApp
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -283,6 +283,6 @@ func DelStaticPath(url string) *App {
|
|||||||
url = "/" + url
|
url = "/" + url
|
||||||
}
|
}
|
||||||
url = strings.TrimRight(url, "/")
|
url = strings.TrimRight(url, "/")
|
||||||
delete(StaticDir, url)
|
delete(BConfig.WebConfig.StaticDir, url)
|
||||||
return BeeApp
|
return BeeApp
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user