From 18a02d7d60639ab2dc4f82c3745ae918dd4f40a7 Mon Sep 17 00:00:00 2001 From: astaxie Date: Tue, 20 May 2014 15:30:17 +0800 Subject: [PATCH] beego:support https & http listen --- admin.go | 2 +- app.go | 33 +++++++++++++++++++++++++-------- beego.go | 2 +- config.go | 19 ++++++++++++++++--- 4 files changed, 43 insertions(+), 13 deletions(-) diff --git a/admin.go b/admin.go index d908565d..d64a51b3 100644 --- a/admin.go +++ b/admin.go @@ -88,7 +88,7 @@ func listConf(rw http.ResponseWriter, r *http.Request) { fmt.Fprintln(rw, "StaticExtensionsToGzip:", StaticExtensionsToGzip) fmt.Fprintln(rw, "HttpAddr:", HttpAddr) fmt.Fprintln(rw, "HttpPort:", HttpPort) - fmt.Fprintln(rw, "HttpTLS:", HttpTLS) + fmt.Fprintln(rw, "HttpTLS:", EnableHttpTLS) fmt.Fprintln(rw, "HttpCertFile:", HttpCertFile) fmt.Fprintln(rw, "HttpKeyFile:", HttpKeyFile) fmt.Fprintln(rw, "RecoverPanic:", RecoverPanic) diff --git a/app.go b/app.go index 058cd180..40450292 100644 --- a/app.go +++ b/app.go @@ -45,6 +45,7 @@ func (app *App) Run() { err error l net.Listener ) + endRunning := make(chan bool) if UseFcgi { if HttpPort == 0 { @@ -83,18 +84,34 @@ func (app *App) Run() { ReadTimeout: time.Duration(HttpServerTimeOut) * time.Second, WriteTimeout: time.Duration(HttpServerTimeOut) * time.Second, } - if HttpTLS { - err = s.ListenAndServeTLS(HttpCertFile, HttpKeyFile) - } else { - err = s.ListenAndServe() + if EnableHttpTLS { + go func() { + if HttpsPort != 0 { + s.Addr = fmt.Sprintf("%s:%d", HttpAddr, HttpsPort) + } + err := s.ListenAndServeTLS(HttpCertFile, HttpKeyFile) + if err != nil { + BeeLogger.Critical("ListenAndServe: ", err) + time.Sleep(100 * time.Microsecond) + endRunning <- true + } + }() + } + + if EnableHttpListen { + go func() { + err := s.ListenAndServe() + if err != nil { + BeeLogger.Critical("ListenAndServe: ", err) + time.Sleep(100 * time.Microsecond) + endRunning <- true + } + }() } } } - if err != nil { - BeeLogger.Critical("ListenAndServe: ", err) - time.Sleep(100 * time.Microsecond) - } + <-endRunning } // Router adds a url-patterned controller handler. diff --git a/beego.go b/beego.go index 49c007d9..f8916231 100644 --- a/beego.go +++ b/beego.go @@ -270,7 +270,7 @@ func initBeforeHttpRun() { sessionConfig = `{"cookieName":"` + SessionName + `",` + `"gclifetime":` + strconv.FormatInt(SessionGCMaxLifetime, 10) + `,` + `"providerConfig":"` + SessionSavePath + `",` + - `"secure":` + strconv.FormatBool(HttpTLS) + `,` + + `"secure":` + strconv.FormatBool(EnableHttpTLS) + `,` + `"sessionIDHashFunc":"` + SessionHashFunc + `",` + `"sessionIDHashKey":"` + SessionHashKey + `",` + `"enableSetCookie":` + strconv.FormatBool(SessionAutoSetCookie) + `,` + diff --git a/config.go b/config.go index 2a1589f7..0d2d019e 100644 --- a/config.go +++ b/config.go @@ -30,9 +30,11 @@ var ( StaticDir map[string]string TemplateCache map[string]*template.Template // template caching map StaticExtensionsToGzip []string // files with should be compressed with gzip (.js,.css,etc) + EnableHttpListen bool HttpAddr string HttpPort int - HttpTLS bool + EnableHttpTLS bool + HttpsPort int HttpCertFile string HttpKeyFile string RecoverPanic bool // flag of auto recover panic @@ -98,9 +100,12 @@ func init() { 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 = 443 + AppName = "beego" RunMode = "dev" //default runmod @@ -176,6 +181,10 @@ func ParseConfig() (err error) { HttpPort = v } + if v, err := AppConfig.Bool("EnableHttpListen"); err == nil { + EnableHttpListen = v + } + if maxmemory, err := AppConfig.Int64("MaxMemory"); err == nil { MaxMemory = maxmemory } @@ -281,8 +290,12 @@ func ParseConfig() (err error) { TemplateRight = tplright } - if httptls, err := AppConfig.Bool("HttpTLS"); err == nil { - HttpTLS = httptls + 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 != "" {