mirror of
https://github.com/astaxie/beego.git
synced 2024-11-26 05:21:30 +00:00
Merge branch 'develop' into fargo
This commit is contained in:
commit
dc28e37606
2
admin.go
2
admin.go
@ -107,7 +107,7 @@ func listConf(rw http.ResponseWriter, r *http.Request) {
|
|||||||
m["SessionGCMaxLifetime"] = SessionGCMaxLifetime
|
m["SessionGCMaxLifetime"] = SessionGCMaxLifetime
|
||||||
m["SessionProviderConfig"] = SessionProviderConfig
|
m["SessionProviderConfig"] = SessionProviderConfig
|
||||||
m["SessionCookieLifeTime"] = SessionCookieLifeTime
|
m["SessionCookieLifeTime"] = SessionCookieLifeTime
|
||||||
m["EnabelFcgi"] = EnabelFcgi
|
m["EnableFcgi"] = EnableFcgi
|
||||||
m["MaxMemory"] = MaxMemory
|
m["MaxMemory"] = MaxMemory
|
||||||
m["EnableGzip"] = EnableGzip
|
m["EnableGzip"] = EnableGzip
|
||||||
m["DirectoryIndex"] = DirectoryIndex
|
m["DirectoryIndex"] = DirectoryIndex
|
||||||
|
19
app.go
19
app.go
@ -64,7 +64,7 @@ func (app *App) Run() {
|
|||||||
)
|
)
|
||||||
endRunning := make(chan bool, 1)
|
endRunning := make(chan bool, 1)
|
||||||
|
|
||||||
if EnabelFcgi {
|
if EnableFcgi {
|
||||||
if EnableStdIo {
|
if 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 {
|
||||||
@ -89,6 +89,7 @@ func (app *App) Run() {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if Graceful {
|
if Graceful {
|
||||||
|
httpsAddr := addr
|
||||||
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(HTTPServerTimeOut) * time.Second
|
||||||
@ -97,11 +98,12 @@ func (app *App) Run() {
|
|||||||
go func() {
|
go func() {
|
||||||
time.Sleep(20 * time.Microsecond)
|
time.Sleep(20 * time.Microsecond)
|
||||||
if HTTPSPort != 0 {
|
if HTTPSPort != 0 {
|
||||||
addr = fmt.Sprintf("%s:%d", HTTPAddr, HTTPSPort)
|
httpsAddr = fmt.Sprintf("%s:%d", HTTPAddr, HTTPSPort)
|
||||||
app.Server.Addr = addr
|
app.Server.Addr = httpsAddr
|
||||||
}
|
}
|
||||||
server := grace.NewServer(addr, app.Handlers)
|
server := grace.NewServer(httpsAddr, app.Handlers)
|
||||||
server.Server = app.Server
|
server.Server.ReadTimeout = app.Server.ReadTimeout
|
||||||
|
server.Server.WriteTimeout = app.Server.WriteTimeout
|
||||||
err := server.ListenAndServeTLS(HTTPCertFile, HTTPKeyFile)
|
err := server.ListenAndServeTLS(HTTPCertFile, HTTPKeyFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
BeeLogger.Critical("ListenAndServeTLS: ", err, fmt.Sprintf("%d", os.Getpid()))
|
BeeLogger.Critical("ListenAndServeTLS: ", err, fmt.Sprintf("%d", os.Getpid()))
|
||||||
@ -113,8 +115,9 @@ func (app *App) Run() {
|
|||||||
if EnableHTTPListen {
|
if EnableHTTPListen {
|
||||||
go func() {
|
go func() {
|
||||||
server := grace.NewServer(addr, app.Handlers)
|
server := grace.NewServer(addr, app.Handlers)
|
||||||
server.Server = app.Server
|
server.Server.ReadTimeout = app.Server.ReadTimeout
|
||||||
if ListenTCP4 && HTTPAddr == "" {
|
server.Server.WriteTimeout = app.Server.WriteTimeout
|
||||||
|
if ListenTCP4 {
|
||||||
server.Network = "tcp4"
|
server.Network = "tcp4"
|
||||||
}
|
}
|
||||||
err := server.ListenAndServe()
|
err := server.ListenAndServe()
|
||||||
@ -151,7 +154,7 @@ func (app *App) Run() {
|
|||||||
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 && HTTPAddr == "" {
|
if 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)
|
||||||
|
11
config.go
11
config.go
@ -60,15 +60,15 @@ var (
|
|||||||
EnableDocs bool
|
EnableDocs bool
|
||||||
// EnableErrorsShow wheather show errors in page. if true, show error and trace info in page rendered with error template.
|
// EnableErrorsShow wheather show errors in page. if true, show error and trace info in page rendered with error template.
|
||||||
EnableErrorsShow bool
|
EnableErrorsShow bool
|
||||||
// EnabelFcgi turn on the fcgi Listen, default is false
|
// EnableFcgi turn on the fcgi Listen, default is false
|
||||||
EnabelFcgi bool
|
EnableFcgi bool
|
||||||
// EnableGzip means gzip the response
|
// EnableGzip means gzip the response
|
||||||
EnableGzip bool
|
EnableGzip bool
|
||||||
// EnableHTTPListen represent whether turn on the HTTP, default is true
|
// EnableHTTPListen represent whether turn on the HTTP, default is true
|
||||||
EnableHTTPListen bool
|
EnableHTTPListen bool
|
||||||
// EnableHTTPTLS represent whether turn on the HTTPS, default is true
|
// EnableHTTPTLS represent whether turn on the HTTPS, default is true
|
||||||
EnableHTTPTLS bool
|
EnableHTTPTLS bool
|
||||||
// EnableStdIo works with EnabelFcgi Use FCGI via standard I/O
|
// EnableStdIo works with EnableFcgi Use FCGI via standard I/O
|
||||||
EnableStdIo bool
|
EnableStdIo bool
|
||||||
// EnableXSRF whether turn on xsrf. default is false
|
// EnableXSRF whether turn on xsrf. default is false
|
||||||
EnableXSRF bool
|
EnableXSRF bool
|
||||||
@ -435,8 +435,8 @@ func ParseConfig() (err error) {
|
|||||||
SessionCookieLifeTime = sesscookielifetime
|
SessionCookieLifeTime = sesscookielifetime
|
||||||
}
|
}
|
||||||
|
|
||||||
if enabelFcgi, err := AppConfig.Bool("EnabelFcgi"); err == nil {
|
if enableFcgi, err := AppConfig.Bool("EnableFcgi"); err == nil {
|
||||||
EnabelFcgi = enabelFcgi
|
EnableFcgi = enableFcgi
|
||||||
}
|
}
|
||||||
|
|
||||||
if enablegzip, err := AppConfig.Bool("EnableGzip"); err == nil {
|
if enablegzip, err := AppConfig.Bool("EnableGzip"); err == nil {
|
||||||
@ -529,7 +529,6 @@ func ParseConfig() (err error) {
|
|||||||
if ext == "" {
|
if ext == "" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
ext = strings.ToLower(ext)
|
|
||||||
if !strings.HasPrefix(ext, ".") {
|
if !strings.HasPrefix(ext, ".") {
|
||||||
ext = "." + ext
|
ext = "." + ext
|
||||||
}
|
}
|
||||||
|
@ -55,7 +55,6 @@ func (ctx *Context) Redirect(status int, localurl string) {
|
|||||||
// Abort stops this request.
|
// Abort stops this request.
|
||||||
// if beego.ErrorMaps exists, panic body.
|
// if beego.ErrorMaps exists, panic body.
|
||||||
func (ctx *Context) Abort(status int, body string) {
|
func (ctx *Context) Abort(status int, body string) {
|
||||||
ctx.ResponseWriter.WriteHeader(status)
|
|
||||||
panic(body)
|
panic(body)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,7 +103,19 @@ func (output *BeegoOutput) Cookie(name string, value string, others ...interface
|
|||||||
//fix cookie not work in IE
|
//fix cookie not work in IE
|
||||||
if len(others) > 0 {
|
if len(others) > 0 {
|
||||||
switch v := others[0].(type) {
|
switch v := others[0].(type) {
|
||||||
case int, int32, int64:
|
case int:
|
||||||
|
if v > 0 {
|
||||||
|
fmt.Fprintf(&b, "; Expires=%s; Max-Age=%d", time.Now().Add(time.Duration(v)*time.Second).UTC().Format(time.RFC1123), v)
|
||||||
|
} else if v <= 0 {
|
||||||
|
fmt.Fprintf(&b, "; Max-Age=0")
|
||||||
|
}
|
||||||
|
case int64:
|
||||||
|
if v > 0 {
|
||||||
|
fmt.Fprintf(&b, "; Expires=%s; Max-Age=%d", time.Now().Add(time.Duration(v)*time.Second).UTC().Format(time.RFC1123), v)
|
||||||
|
} else if v <= 0 {
|
||||||
|
fmt.Fprintf(&b, "; Max-Age=0")
|
||||||
|
}
|
||||||
|
case int32:
|
||||||
if v > 0 {
|
if v > 0 {
|
||||||
fmt.Fprintf(&b, "; Expires=%s; Max-Age=%d", time.Now().Add(time.Duration(v)*time.Second).UTC().Format(time.RFC1123), v)
|
fmt.Fprintf(&b, "; Expires=%s; Max-Age=%d", time.Now().Add(time.Duration(v)*time.Second).UTC().Format(time.RFC1123), v)
|
||||||
} else if v <= 0 {
|
} else if v <= 0 {
|
||||||
|
@ -647,8 +647,8 @@ func (c *Controller) CheckXSRFCookie() bool {
|
|||||||
|
|
||||||
// XSRFFormHTML writes an input field contains xsrf token value.
|
// XSRFFormHTML writes an input field contains xsrf token value.
|
||||||
func (c *Controller) XSRFFormHTML() string {
|
func (c *Controller) XSRFFormHTML() string {
|
||||||
return "<input type=\"hidden\" name=\"_xsrf\" value=\"" +
|
return `<input type="hidden" name="_xsrf" value="` +
|
||||||
c._xsrfToken + "\"/>"
|
c.XSRFToken() + `" />`
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetControllerAndAction gets the executing controller name and action name.
|
// GetControllerAndAction gets the executing controller name and action name.
|
||||||
|
@ -219,9 +219,9 @@ func getAcceptEncodingZip(r *http.Request) string {
|
|||||||
ss = strings.ToLower(ss)
|
ss = strings.ToLower(ss)
|
||||||
if strings.Contains(ss, "gzip") {
|
if strings.Contains(ss, "gzip") {
|
||||||
return "gzip"
|
return "gzip"
|
||||||
}
|
} else if strings.Contains(ss, "deflate") {
|
||||||
if strings.Contains(ss, "deflate") {
|
|
||||||
return "deflate"
|
return "deflate"
|
||||||
}
|
} else {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
@ -45,13 +45,14 @@ func getDbDropSQL(al *alias) (sqls []string) {
|
|||||||
func getColumnTyp(al *alias, fi *fieldInfo) (col string) {
|
func getColumnTyp(al *alias, fi *fieldInfo) (col string) {
|
||||||
T := al.DbBaser.DbTypes()
|
T := al.DbBaser.DbTypes()
|
||||||
fieldType := fi.fieldType
|
fieldType := fi.fieldType
|
||||||
|
fieldSize := fi.size
|
||||||
|
|
||||||
checkColumn:
|
checkColumn:
|
||||||
switch fieldType {
|
switch fieldType {
|
||||||
case TypeBooleanField:
|
case TypeBooleanField:
|
||||||
col = T["bool"]
|
col = T["bool"]
|
||||||
case TypeCharField:
|
case TypeCharField:
|
||||||
col = fmt.Sprintf(T["string"], fi.size)
|
col = fmt.Sprintf(T["string"], fieldSize)
|
||||||
case TypeTextField:
|
case TypeTextField:
|
||||||
col = T["string-text"]
|
col = T["string-text"]
|
||||||
case TypeDateField:
|
case TypeDateField:
|
||||||
@ -89,6 +90,7 @@ checkColumn:
|
|||||||
}
|
}
|
||||||
case RelForeignKey, RelOneToOne:
|
case RelForeignKey, RelOneToOne:
|
||||||
fieldType = fi.relModelInfo.fields.pk.fieldType
|
fieldType = fi.relModelInfo.fields.pk.fieldType
|
||||||
|
fieldSize = fi.relModelInfo.fields.pk.size
|
||||||
goto checkColumn
|
goto checkColumn
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -488,7 +488,8 @@ func (d *dbBase) Update(q dbQuerier, mi *modelInfo, ind reflect.Value, tz *time.
|
|||||||
|
|
||||||
d.ins.ReplaceMarks(&query)
|
d.ins.ReplaceMarks(&query)
|
||||||
|
|
||||||
if res, err := q.Exec(query, setValues...); err == nil {
|
res, err := q.Exec(query, setValues...)
|
||||||
|
if err == nil {
|
||||||
return res.RowsAffected()
|
return res.RowsAffected()
|
||||||
}
|
}
|
||||||
return 0, err
|
return 0, err
|
||||||
|
@ -266,7 +266,10 @@ func bootStrap() {
|
|||||||
if found == false {
|
if found == false {
|
||||||
mForC:
|
mForC:
|
||||||
for _, ffi := range fi.relModelInfo.fields.fieldsByType[RelManyToMany] {
|
for _, ffi := range fi.relModelInfo.fields.fieldsByType[RelManyToMany] {
|
||||||
if ffi.relModelInfo == mi {
|
conditions := fi.relThrough != "" && fi.relThrough == ffi.relThrough ||
|
||||||
|
fi.relTable != "" && fi.relTable == ffi.relTable ||
|
||||||
|
fi.relThrough == "" && fi.relTable == ""
|
||||||
|
if ffi.relModelInfo == mi && conditions {
|
||||||
found = true
|
found = true
|
||||||
|
|
||||||
fi.reverseField = ffi.reverseFieldInfoTwo.name
|
fi.reverseField = ffi.reverseFieldInfoTwo.name
|
||||||
|
@ -223,6 +223,11 @@ checkType:
|
|||||||
break checkType
|
break checkType
|
||||||
case "many":
|
case "many":
|
||||||
fieldType = RelReverseMany
|
fieldType = RelReverseMany
|
||||||
|
if tv := tags["rel_table"]; tv != "" {
|
||||||
|
fi.relTable = tv
|
||||||
|
} else if tv := tags["rel_through"]; tv != "" {
|
||||||
|
fi.relThrough = tv
|
||||||
|
}
|
||||||
break checkType
|
break checkType
|
||||||
default:
|
default:
|
||||||
err = fmt.Errorf("error")
|
err = fmt.Errorf("error")
|
||||||
|
33
router.go
33
router.go
@ -15,10 +15,7 @@
|
|||||||
package beego
|
package beego
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
@ -353,7 +350,7 @@ func (p *ControllerRegister) Handler(pattern string, h http.Handler, options ...
|
|||||||
route.handler = h
|
route.handler = h
|
||||||
if len(options) > 0 {
|
if len(options) > 0 {
|
||||||
if _, ok := options[0].(bool); ok {
|
if _, ok := options[0].(bool); ok {
|
||||||
pattern = path.Join(pattern, "?:all")
|
pattern = path.Join(pattern, "?:all(.*)")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, m := range HTTPMETHOD {
|
for _, m := range HTTPMETHOD {
|
||||||
@ -581,7 +578,7 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request)
|
|||||||
var runMethod string
|
var runMethod string
|
||||||
var routerInfo *controllerInfo
|
var routerInfo *controllerInfo
|
||||||
|
|
||||||
w := &responseWriter{writer: rw}
|
w := &responseWriter{rw, false, 0}
|
||||||
|
|
||||||
if RunMode == "dev" {
|
if RunMode == "dev" {
|
||||||
w.Header().Set("Server", BeegoServerName)
|
w.Header().Set("Server", BeegoServerName)
|
||||||
@ -856,7 +853,7 @@ Admin:
|
|||||||
|
|
||||||
// Call WriteHeader if status code has been set changed
|
// Call WriteHeader if status code has been set changed
|
||||||
if context.Output.Status != 0 {
|
if context.Output.Status != 0 {
|
||||||
w.writer.WriteHeader(context.Output.Status)
|
w.WriteHeader(context.Output.Status)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -895,14 +892,14 @@ func (p *ControllerRegister) recoverPanic(context *beecontext.Context) {
|
|||||||
//responseWriter is a wrapper for the http.ResponseWriter
|
//responseWriter is a wrapper for the http.ResponseWriter
|
||||||
//started set to true if response was written to then don't execute other handler
|
//started set to true if response was written to then don't execute other handler
|
||||||
type responseWriter struct {
|
type responseWriter struct {
|
||||||
writer http.ResponseWriter
|
http.ResponseWriter
|
||||||
started bool
|
started bool
|
||||||
status int
|
status int
|
||||||
}
|
}
|
||||||
|
|
||||||
// Header returns the header map that will be sent by WriteHeader.
|
// Header returns the header map that will be sent by WriteHeader.
|
||||||
func (w *responseWriter) Header() http.Header {
|
func (w *responseWriter) Header() http.Header {
|
||||||
return w.writer.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,
|
||||||
@ -910,7 +907,7 @@ func (w *responseWriter) Header() http.Header {
|
|||||||
// started means the response has sent out.
|
// started means the response has sent out.
|
||||||
func (w *responseWriter) Write(p []byte) (int, error) {
|
func (w *responseWriter) Write(p []byte) (int, error) {
|
||||||
w.started = true
|
w.started = true
|
||||||
return w.writer.Write(p)
|
return w.ResponseWriter.Write(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
// WriteHeader sends an HTTP response header with status code,
|
// WriteHeader sends an HTTP response header with status code,
|
||||||
@ -918,23 +915,7 @@ func (w *responseWriter) Write(p []byte) (int, error) {
|
|||||||
func (w *responseWriter) WriteHeader(code int) {
|
func (w *responseWriter) WriteHeader(code int) {
|
||||||
w.status = code
|
w.status = code
|
||||||
w.started = true
|
w.started = true
|
||||||
w.writer.WriteHeader(code)
|
w.ResponseWriter.WriteHeader(code)
|
||||||
}
|
|
||||||
|
|
||||||
// hijacker for http
|
|
||||||
func (w *responseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
|
|
||||||
hj, ok := w.writer.(http.Hijacker)
|
|
||||||
if !ok {
|
|
||||||
return nil, nil, errors.New("webserver doesn't support hijacking")
|
|
||||||
}
|
|
||||||
return hj.Hijack()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *responseWriter) Flush() {
|
|
||||||
f, ok := w.writer.(http.Flusher)
|
|
||||||
if ok {
|
|
||||||
f.Flush()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func tourl(params map[string]string) string {
|
func tourl(params map[string]string) string {
|
||||||
|
@ -333,6 +333,18 @@ func TestRouterHandler(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRouterHandlerAll(t *testing.T) {
|
||||||
|
r, _ := http.NewRequest("POST", "/sayhi/a/b/c", nil)
|
||||||
|
w := httptest.NewRecorder()
|
||||||
|
|
||||||
|
handler := NewControllerRegister()
|
||||||
|
handler.Handler("/sayhi", http.HandlerFunc(sayhello), true)
|
||||||
|
handler.ServeHTTP(w, r)
|
||||||
|
if w.Body.String() != "sayhello" {
|
||||||
|
t.Errorf("TestRouterHandler can't run")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Benchmarks NewApp:
|
// Benchmarks NewApp:
|
||||||
//
|
//
|
||||||
|
@ -96,9 +96,8 @@ func serverStaticRouter(ctx *context.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
isStaticFileToCompress := false
|
isStaticFileToCompress := false
|
||||||
lowerFileName := strings.ToLower(filePath)
|
|
||||||
for _, statExtension := range StaticExtensionsToGzip {
|
for _, statExtension := range StaticExtensionsToGzip {
|
||||||
if strings.HasSuffix(lowerFileName, statExtension) {
|
if strings.HasSuffix(strings.ToLower(filePath), strings.ToLower(statExtension)) {
|
||||||
isStaticFileToCompress = true
|
isStaticFileToCompress = true
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -74,6 +74,33 @@ func (r Required) IsSatisfied(obj interface{}) bool {
|
|||||||
if i, ok := obj.(int); ok {
|
if i, ok := obj.(int); ok {
|
||||||
return i != 0
|
return i != 0
|
||||||
}
|
}
|
||||||
|
if i, ok := obj.(uint); ok {
|
||||||
|
return i != 0
|
||||||
|
}
|
||||||
|
if i, ok := obj.(int8); ok {
|
||||||
|
return i != 0
|
||||||
|
}
|
||||||
|
if i, ok := obj.(uint8); ok {
|
||||||
|
return i != 0
|
||||||
|
}
|
||||||
|
if i, ok := obj.(int16); ok {
|
||||||
|
return i != 0
|
||||||
|
}
|
||||||
|
if i, ok := obj.(uint16); ok {
|
||||||
|
return i != 0
|
||||||
|
}
|
||||||
|
if i, ok := obj.(uint32); ok {
|
||||||
|
return i != 0
|
||||||
|
}
|
||||||
|
if i, ok := obj.(int32); ok {
|
||||||
|
return i != 0
|
||||||
|
}
|
||||||
|
if i, ok := obj.(int64); ok {
|
||||||
|
return i != 0
|
||||||
|
}
|
||||||
|
if i, ok := obj.(uint64); ok {
|
||||||
|
return i != 0
|
||||||
|
}
|
||||||
if t, ok := obj.(time.Time); ok {
|
if t, ok := obj.(time.Time); ok {
|
||||||
return !t.IsZero()
|
return !t.IsZero()
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user