mirror of
https://github.com/astaxie/beego.git
synced 2024-11-25 20:51:29 +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["SessionProviderConfig"] = SessionProviderConfig
|
||||
m["SessionCookieLifeTime"] = SessionCookieLifeTime
|
||||
m["EnabelFcgi"] = EnabelFcgi
|
||||
m["EnableFcgi"] = EnableFcgi
|
||||
m["MaxMemory"] = MaxMemory
|
||||
m["EnableGzip"] = EnableGzip
|
||||
m["DirectoryIndex"] = DirectoryIndex
|
||||
|
19
app.go
19
app.go
@ -64,7 +64,7 @@ func (app *App) Run() {
|
||||
)
|
||||
endRunning := make(chan bool, 1)
|
||||
|
||||
if EnabelFcgi {
|
||||
if EnableFcgi {
|
||||
if EnableStdIo {
|
||||
err = fcgi.Serve(nil, app.Handlers) // standard I/O
|
||||
if err == nil {
|
||||
@ -89,6 +89,7 @@ func (app *App) Run() {
|
||||
}
|
||||
} else {
|
||||
if Graceful {
|
||||
httpsAddr := addr
|
||||
app.Server.Addr = addr
|
||||
app.Server.Handler = app.Handlers
|
||||
app.Server.ReadTimeout = time.Duration(HTTPServerTimeOut) * time.Second
|
||||
@ -97,11 +98,12 @@ func (app *App) Run() {
|
||||
go func() {
|
||||
time.Sleep(20 * time.Microsecond)
|
||||
if HTTPSPort != 0 {
|
||||
addr = fmt.Sprintf("%s:%d", HTTPAddr, HTTPSPort)
|
||||
app.Server.Addr = addr
|
||||
httpsAddr = fmt.Sprintf("%s:%d", HTTPAddr, HTTPSPort)
|
||||
app.Server.Addr = httpsAddr
|
||||
}
|
||||
server := grace.NewServer(addr, app.Handlers)
|
||||
server.Server = app.Server
|
||||
server := grace.NewServer(httpsAddr, app.Handlers)
|
||||
server.Server.ReadTimeout = app.Server.ReadTimeout
|
||||
server.Server.WriteTimeout = app.Server.WriteTimeout
|
||||
err := server.ListenAndServeTLS(HTTPCertFile, HTTPKeyFile)
|
||||
if err != nil {
|
||||
BeeLogger.Critical("ListenAndServeTLS: ", err, fmt.Sprintf("%d", os.Getpid()))
|
||||
@ -113,8 +115,9 @@ func (app *App) Run() {
|
||||
if EnableHTTPListen {
|
||||
go func() {
|
||||
server := grace.NewServer(addr, app.Handlers)
|
||||
server.Server = app.Server
|
||||
if ListenTCP4 && HTTPAddr == "" {
|
||||
server.Server.ReadTimeout = app.Server.ReadTimeout
|
||||
server.Server.WriteTimeout = app.Server.WriteTimeout
|
||||
if ListenTCP4 {
|
||||
server.Network = "tcp4"
|
||||
}
|
||||
err := server.ListenAndServe()
|
||||
@ -151,7 +154,7 @@ func (app *App) Run() {
|
||||
go func() {
|
||||
app.Server.Addr = addr
|
||||
BeeLogger.Info("http server Running on %s", app.Server.Addr)
|
||||
if ListenTCP4 && HTTPAddr == "" {
|
||||
if ListenTCP4 {
|
||||
ln, err := net.Listen("tcp4", app.Server.Addr)
|
||||
if err != nil {
|
||||
BeeLogger.Critical("ListenAndServe: ", err)
|
||||
|
11
config.go
11
config.go
@ -60,15 +60,15 @@ var (
|
||||
EnableDocs bool
|
||||
// EnableErrorsShow wheather show errors in page. if true, show error and trace info in page rendered with error template.
|
||||
EnableErrorsShow bool
|
||||
// EnabelFcgi turn on the fcgi Listen, default is false
|
||||
EnabelFcgi 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 EnabelFcgi Use FCGI via standard I/O
|
||||
// EnableStdIo works with EnableFcgi Use FCGI via standard I/O
|
||||
EnableStdIo bool
|
||||
// EnableXSRF whether turn on xsrf. default is false
|
||||
EnableXSRF bool
|
||||
@ -435,8 +435,8 @@ func ParseConfig() (err error) {
|
||||
SessionCookieLifeTime = sesscookielifetime
|
||||
}
|
||||
|
||||
if enabelFcgi, err := AppConfig.Bool("EnabelFcgi"); err == nil {
|
||||
EnabelFcgi = enabelFcgi
|
||||
if enableFcgi, err := AppConfig.Bool("EnableFcgi"); err == nil {
|
||||
EnableFcgi = enableFcgi
|
||||
}
|
||||
|
||||
if enablegzip, err := AppConfig.Bool("EnableGzip"); err == nil {
|
||||
@ -529,7 +529,6 @@ func ParseConfig() (err error) {
|
||||
if ext == "" {
|
||||
continue
|
||||
}
|
||||
ext = strings.ToLower(ext)
|
||||
if !strings.HasPrefix(ext, ".") {
|
||||
ext = "." + ext
|
||||
}
|
||||
|
@ -55,7 +55,6 @@ func (ctx *Context) Redirect(status int, localurl string) {
|
||||
// Abort stops this request.
|
||||
// if beego.ErrorMaps exists, panic body.
|
||||
func (ctx *Context) Abort(status int, body string) {
|
||||
ctx.ResponseWriter.WriteHeader(status)
|
||||
panic(body)
|
||||
}
|
||||
|
||||
|
@ -103,7 +103,19 @@ func (output *BeegoOutput) Cookie(name string, value string, others ...interface
|
||||
//fix cookie not work in IE
|
||||
if len(others) > 0 {
|
||||
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 {
|
||||
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 {
|
||||
|
@ -647,8 +647,8 @@ func (c *Controller) CheckXSRFCookie() bool {
|
||||
|
||||
// XSRFFormHTML writes an input field contains xsrf token value.
|
||||
func (c *Controller) XSRFFormHTML() string {
|
||||
return "<input type=\"hidden\" name=\"_xsrf\" value=\"" +
|
||||
c._xsrfToken + "\"/>"
|
||||
return `<input type="hidden" name="_xsrf" value="` +
|
||||
c.XSRFToken() + `" />`
|
||||
}
|
||||
|
||||
// GetControllerAndAction gets the executing controller name and action name.
|
||||
|
@ -219,9 +219,9 @@ func getAcceptEncodingZip(r *http.Request) string {
|
||||
ss = strings.ToLower(ss)
|
||||
if strings.Contains(ss, "gzip") {
|
||||
return "gzip"
|
||||
}
|
||||
if strings.Contains(ss, "deflate") {
|
||||
} else if strings.Contains(ss, "deflate") {
|
||||
return "deflate"
|
||||
}
|
||||
} else {
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
@ -45,13 +45,14 @@ func getDbDropSQL(al *alias) (sqls []string) {
|
||||
func getColumnTyp(al *alias, fi *fieldInfo) (col string) {
|
||||
T := al.DbBaser.DbTypes()
|
||||
fieldType := fi.fieldType
|
||||
fieldSize := fi.size
|
||||
|
||||
checkColumn:
|
||||
switch fieldType {
|
||||
case TypeBooleanField:
|
||||
col = T["bool"]
|
||||
case TypeCharField:
|
||||
col = fmt.Sprintf(T["string"], fi.size)
|
||||
col = fmt.Sprintf(T["string"], fieldSize)
|
||||
case TypeTextField:
|
||||
col = T["string-text"]
|
||||
case TypeDateField:
|
||||
@ -89,6 +90,7 @@ checkColumn:
|
||||
}
|
||||
case RelForeignKey, RelOneToOne:
|
||||
fieldType = fi.relModelInfo.fields.pk.fieldType
|
||||
fieldSize = fi.relModelInfo.fields.pk.size
|
||||
goto checkColumn
|
||||
}
|
||||
|
||||
|
@ -488,7 +488,8 @@ func (d *dbBase) Update(q dbQuerier, mi *modelInfo, ind reflect.Value, tz *time.
|
||||
|
||||
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 0, err
|
||||
|
@ -266,7 +266,10 @@ func bootStrap() {
|
||||
if found == false {
|
||||
mForC:
|
||||
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
|
||||
|
||||
fi.reverseField = ffi.reverseFieldInfoTwo.name
|
||||
|
@ -223,6 +223,11 @@ checkType:
|
||||
break checkType
|
||||
case "many":
|
||||
fieldType = RelReverseMany
|
||||
if tv := tags["rel_table"]; tv != "" {
|
||||
fi.relTable = tv
|
||||
} else if tv := tags["rel_through"]; tv != "" {
|
||||
fi.relThrough = tv
|
||||
}
|
||||
break checkType
|
||||
default:
|
||||
err = fmt.Errorf("error")
|
||||
|
33
router.go
33
router.go
@ -15,10 +15,7 @@
|
||||
package beego
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net"
|
||||
"net/http"
|
||||
"os"
|
||||
"path"
|
||||
@ -353,7 +350,7 @@ func (p *ControllerRegister) Handler(pattern string, h http.Handler, options ...
|
||||
route.handler = h
|
||||
if len(options) > 0 {
|
||||
if _, ok := options[0].(bool); ok {
|
||||
pattern = path.Join(pattern, "?:all")
|
||||
pattern = path.Join(pattern, "?:all(.*)")
|
||||
}
|
||||
}
|
||||
for _, m := range HTTPMETHOD {
|
||||
@ -581,7 +578,7 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request)
|
||||
var runMethod string
|
||||
var routerInfo *controllerInfo
|
||||
|
||||
w := &responseWriter{writer: rw}
|
||||
w := &responseWriter{rw, false, 0}
|
||||
|
||||
if RunMode == "dev" {
|
||||
w.Header().Set("Server", BeegoServerName)
|
||||
@ -856,7 +853,7 @@ Admin:
|
||||
|
||||
// Call WriteHeader if status code has been set changed
|
||||
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
|
||||
//started set to true if response was written to then don't execute other handler
|
||||
type responseWriter struct {
|
||||
writer http.ResponseWriter
|
||||
http.ResponseWriter
|
||||
started bool
|
||||
status int
|
||||
}
|
||||
|
||||
// Header returns the header map that will be sent by WriteHeader.
|
||||
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,
|
||||
@ -910,7 +907,7 @@ func (w *responseWriter) Header() http.Header {
|
||||
// started means the response has sent out.
|
||||
func (w *responseWriter) Write(p []byte) (int, error) {
|
||||
w.started = true
|
||||
return w.writer.Write(p)
|
||||
return w.ResponseWriter.Write(p)
|
||||
}
|
||||
|
||||
// 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) {
|
||||
w.status = code
|
||||
w.started = true
|
||||
w.writer.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()
|
||||
}
|
||||
w.ResponseWriter.WriteHeader(code)
|
||||
}
|
||||
|
||||
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:
|
||||
//
|
||||
|
@ -96,9 +96,8 @@ func serverStaticRouter(ctx *context.Context) {
|
||||
}
|
||||
|
||||
isStaticFileToCompress := false
|
||||
lowerFileName := strings.ToLower(filePath)
|
||||
for _, statExtension := range StaticExtensionsToGzip {
|
||||
if strings.HasSuffix(lowerFileName, statExtension) {
|
||||
if strings.HasSuffix(strings.ToLower(filePath), strings.ToLower(statExtension)) {
|
||||
isStaticFileToCompress = true
|
||||
break
|
||||
}
|
||||
|
@ -74,6 +74,33 @@ func (r Required) IsSatisfied(obj interface{}) bool {
|
||||
if i, ok := obj.(int); ok {
|
||||
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 {
|
||||
return !t.IsZero()
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user