1
0
mirror of https://github.com/astaxie/beego.git synced 2024-11-22 13:00:54 +00:00

Merge pull request #1455 from nkbai/develop

windows下静态文件映射找不到问题以及 grace init延后
This commit is contained in:
astaxie 2015-12-09 23:44:45 +08:00
commit be60f47488
4 changed files with 42 additions and 67 deletions

View File

@ -413,91 +413,68 @@ func (c *Controller) GetStrings(key string, def ...[]string) []string {
// GetInt returns input as an int or the default value while it's present and input is blank // GetInt returns input as an int or the default value while it's present and input is blank
func (c *Controller) GetInt(key string, def ...int) (int, error) { func (c *Controller) GetInt(key string, def ...int) (int, error) {
if strv := c.Ctx.Input.Query(key); strv != "" { strv := c.Ctx.Input.Query(key)
return strconv.Atoi(strv) if len(strv) == 0 && len(def) > 0 {
} else if len(def) > 0 {
return def[0], nil return def[0], nil
} else {
return strconv.Atoi(strv)
} }
return strconv.Atoi(strv)
} }
// GetInt8 return input as an int8 or the default value while it's present and input is blank // GetInt8 return input as an int8 or the default value while it's present and input is blank
func (c *Controller) GetInt8(key string, def ...int8) (int8, error) { func (c *Controller) GetInt8(key string, def ...int8) (int8, error) {
if strv := c.Ctx.Input.Query(key); strv != "" { strv := c.Ctx.Input.Query(key)
i64, err := strconv.ParseInt(strv, 10, 8) if len(strv) == 0 && len(def) > 0 {
i8 := int8(i64)
return i8, err
} else if len(def) > 0 {
return def[0], nil return def[0], nil
} else {
i64, err := strconv.ParseInt(strv, 10, 8)
i8 := int8(i64)
return i8, err
} }
i64, err := strconv.ParseInt(strv, 10, 8)
return int8(i64), err
} }
// GetInt16 returns input as an int16 or the default value while it's present and input is blank // GetInt16 returns input as an int16 or the default value while it's present and input is blank
func (c *Controller) GetInt16(key string, def ...int16) (int16, error) { func (c *Controller) GetInt16(key string, def ...int16) (int16, error) {
if strv := c.Ctx.Input.Query(key); strv != "" { strv := c.Ctx.Input.Query(key)
i64, err := strconv.ParseInt(strv, 10, 16) if len(strv) == 0 && len(def) > 0 {
i16 := int16(i64)
return i16, err
} else if len(def) > 0 {
return def[0], nil return def[0], nil
} else {
i64, err := strconv.ParseInt(strv, 10, 16)
i16 := int16(i64)
return i16, err
} }
i64, err := strconv.ParseInt(strv, 10, 16)
return int16(i64), err
} }
// GetInt32 returns input as an int32 or the default value while it's present and input is blank // GetInt32 returns input as an int32 or the default value while it's present and input is blank
func (c *Controller) GetInt32(key string, def ...int32) (int32, error) { func (c *Controller) GetInt32(key string, def ...int32) (int32, error) {
if strv := c.Ctx.Input.Query(key); strv != "" { strv := c.Ctx.Input.Query(key)
i64, err := strconv.ParseInt(c.Ctx.Input.Query(key), 10, 32) if len(strv) == 0 && len(def) > 0 {
i32 := int32(i64)
return i32, err
} else if len(def) > 0 {
return def[0], nil return def[0], nil
} else {
i64, err := strconv.ParseInt(c.Ctx.Input.Query(key), 10, 32)
i32 := int32(i64)
return i32, err
} }
i64, err := strconv.ParseInt(strv, 10, 32)
return int32(i64), err
} }
// GetInt64 returns input value as int64 or the default value while it's present and input is blank. // GetInt64 returns input value as int64 or the default value while it's present and input is blank.
func (c *Controller) GetInt64(key string, def ...int64) (int64, error) { func (c *Controller) GetInt64(key string, def ...int64) (int64, error) {
if strv := c.Ctx.Input.Query(key); strv != "" { strv := c.Ctx.Input.Query(key)
return strconv.ParseInt(strv, 10, 64) if len(strv) == 0 && len(def) > 0 {
} else if len(def) > 0 {
return def[0], nil return def[0], nil
} else {
return strconv.ParseInt(strv, 10, 64)
} }
return strconv.ParseInt(strv, 10, 64)
} }
// GetBool returns input value as bool or the default value while it's present and input is blank. // GetBool returns input value as bool or the default value while it's present and input is blank.
func (c *Controller) GetBool(key string, def ...bool) (bool, error) { func (c *Controller) GetBool(key string, def ...bool) (bool, error) {
if strv := c.Ctx.Input.Query(key); strv != "" { strv := c.Ctx.Input.Query(key)
return strconv.ParseBool(strv) if len(strv) == 0 && len(def) > 0 {
} else if len(def) > 0 {
return def[0], nil return def[0], nil
} else {
return strconv.ParseBool(strv)
} }
return strconv.ParseBool(strv)
} }
// GetFloat returns input value as float64 or the default value while it's present and input is blank. // GetFloat returns input value as float64 or the default value while it's present and input is blank.
func (c *Controller) GetFloat(key string, def ...float64) (float64, error) { func (c *Controller) GetFloat(key string, def ...float64) (float64, error) {
if strv := c.Ctx.Input.Query(key); strv != "" { strv := c.Ctx.Input.Query(key)
return strconv.ParseFloat(strv, 64) if len(strv) == 0 && len(def) > 0 {
} else if len(def) > 0 {
return def[0], nil return def[0], nil
} else {
return strconv.ParseFloat(strv, 64)
} }
return strconv.ParseFloat(strv, 64)
} }
// GetFile returns the file data in file upload field named as key. // GetFile returns the file data in file upload field named as key.

View File

@ -53,18 +53,18 @@ import (
) )
const ( const (
// PreSignal is the position to add filter before signal // PreSignal is the position to add filter before signal
PreSignal = iota PreSignal = iota
// PostSignal is the position to add filter after signal // PostSignal is the position to add filter after signal
PostSignal PostSignal
// StateInit represent the application inited // StateInit represent the application inited
StateInit StateInit
// StateRunning represent the application is running // StateRunning represent the application is running
StateRunning StateRunning
// StateShuttingDown represent the application is shutting down // StateShuttingDown represent the application is shutting down
StateShuttingDown StateShuttingDown
// StateTerminate represent the application is killed // StateTerminate represent the application is killed
StateTerminate StateTerminate
) )
@ -75,34 +75,36 @@ var (
socketPtrOffsetMap map[string]uint socketPtrOffsetMap map[string]uint
runningServersForked bool runningServersForked bool
// DefaultReadTimeOut is the HTTP read timeout // DefaultReadTimeOut is the HTTP read timeout
DefaultReadTimeOut time.Duration DefaultReadTimeOut time.Duration
// DefaultWriteTimeOut is the HTTP Write timeout // DefaultWriteTimeOut is the HTTP Write timeout
DefaultWriteTimeOut time.Duration DefaultWriteTimeOut time.Duration
// DefaultMaxHeaderBytes is the Max HTTP Herder size, default is 0, no limit // DefaultMaxHeaderBytes is the Max HTTP Herder size, default is 0, no limit
DefaultMaxHeaderBytes int DefaultMaxHeaderBytes int
// DefaultTimeout is the shutdown server's timeout. default is 60s // DefaultTimeout is the shutdown server's timeout. default is 60s
DefaultTimeout time.Duration DefaultTimeout time.Duration
isChild bool isChild bool
socketOrder string socketOrder string
once sync.Once
) )
func init() { func init() {
DefaultMaxHeaderBytes = 0
DefaultTimeout = 60 * time.Second
}
func onceInit() {
regLock = &sync.Mutex{} regLock = &sync.Mutex{}
flag.BoolVar(&isChild, "graceful", false, "listen on open fd (after forking)") flag.BoolVar(&isChild, "graceful", false, "listen on open fd (after forking)")
flag.StringVar(&socketOrder, "socketorder", "", "previous initialization order - used when more than one listener was started") flag.StringVar(&socketOrder, "socketorder", "", "previous initialization order - used when more than one listener was started")
runningServers = make(map[string]*Server) runningServers = make(map[string]*Server)
runningServersOrder = []string{} runningServersOrder = []string{}
socketPtrOffsetMap = make(map[string]uint) socketPtrOffsetMap = make(map[string]uint)
DefaultMaxHeaderBytes = 0
DefaultTimeout = 60 * time.Second
} }
// NewServer returns a new graceServer. // NewServer returns a new graceServer.
func NewServer(addr string, handler http.Handler) (srv *Server) { func NewServer(addr string, handler http.Handler) (srv *Server) {
once.Do(onceInit)
regLock.Lock() regLock.Lock()
defer regLock.Unlock() defer regLock.Unlock()
if !flag.Parsed() { if !flag.Parsed() {

View File

@ -897,10 +897,6 @@ type responseWriter struct {
status int status int
} }
// Header returns the header map that will be sent by WriteHeader.
func (w *responseWriter) Header() http.Header {
return w.ResponseWriter.Header()
}
// Write writes the data to the connection as part of an HTTP reply, // Write writes the data to the connection as part of an HTTP reply,
// and sets `started` to true. // and sets `started` to true.

View File

@ -144,7 +144,7 @@ func isStaticCompress(filePath string) bool {
// searchFile search the file by url path // searchFile search the file by url path
// if none the static file prefix matches ,return notStaticRequestErr // if none the static file prefix matches ,return notStaticRequestErr
func searchFile(ctx *context.Context) (string, os.FileInfo, error) { func searchFile(ctx *context.Context) (string, os.FileInfo, error) {
requestPath := filepath.Clean(ctx.Input.Request.URL.Path) requestPath := filepath.ToSlash(filepath.Clean(ctx.Input.Request.URL.Path))
// special processing : favicon.ico/robots.txt can be in any static dir // special processing : favicon.ico/robots.txt can be in any static dir
if requestPath == "/favicon.ico" || requestPath == "/robots.txt" { if requestPath == "/favicon.ico" || requestPath == "/robots.txt" {
file := path.Join(".", requestPath) file := path.Join(".", requestPath)