// new context func newContext(server *LeafveinServer, rw http.ResponseWriter, req *http.Request, respWirteCompress bool) *HttpContext { var outWrite io.Writer var err error acceptEncoding := SFStringsUtil.ToLower(req.Header.Get("Accept-Encoding")) encoding := "none" if respWirteCompress && 0 <= strings.Index(acceptEncoding, "gzip") { encoding = "gzip" outWrite, err = gzip.NewWriterLevel(rw, gzip.BestSpeed) } else if respWirteCompress && 0 <= strings.Index(acceptEncoding, "deflate") { encoding = "deflate" outWrite, err = flate.NewWriter(rw, flate.BestSpeed) } else { outWrite = rw } if nil != err { encoding = "none" outWrite = rw } context := new(HttpContext) context.lvServer = server context.RespWrite = rw context.Request = req context.reqBody = nil context.session = nil context.contentEncoding = encoding context.comperssWriter = outWrite context.isCloseWriter = false context.isParseForm = false context.formparamErr = nil context.formparams = nil // TODO 有待修改,看如何获取scheme if nil != req.TLS { context.reqScheme = URI_SCHEME_HTTPS } else { context.reqScheme = URI_SCHEME_HTTP } return context }
/** * start leafvein server * * @param startName "DevelStart" or "Start" * @param goroutine */ func (lv *LeafveinServer) start(startName string, goroutine bool) { if lv.IsStart() { return } var runFunc func() = nil var defaultServer *http.Server = nil // start info logInfo := fmt.Sprintf("(%v)Leafvein %v...\n", lv.AppName(), startName) if !lv.parseRouter(&logInfo, startName) { return } if 0 >= lv.port { lv.port = 8080 } addr := fmt.Sprintf("%s:%d", lv.addr, lv.port) // 由于addr设置为127.0.0.1的时候就只能允许内网进行http://localhost:(port)/进行访问,本机IP访问不了。 // 为了友好的显示,如果addr设置为空的时候允许IP或localhost进行访问做了特别的显示除了(http://0.0.0.0:8080) logAddr := "" logTLSAddr := "" if strings.Index(addr, ":") == 0 { logAddr = "http://0.0.0.0" + addr logTLSAddr = "https://0.0.0.0" } else { logAddr = "http://" + addr logTLSAddr = "https://" + lv.addr } if 0 == len(lv.tlsCertPath) || 0 == len(lv.tlsKeyPath) || !lv.tlsAloneRun { // default server and listen defaultServer = &http.Server{ Addr: addr, Handler: lv, ReadTimeout: time.Duration(lv.serverTimeout) * time.Second, WriteTimeout: time.Duration(lv.serverTimeout) * time.Second, } netListen, err := net.Listen("tcp", addr) if err != nil { lv.log.Fatal("(%v) %v Listen: %v \n", lv.appName, startName, err) return } lv.listener = &leafveinListener{netListen.(*net.TCPListener), DEFAULT_KEEP_ALIVE_PERIOD, nil} } // handle tls if 0 != len(lv.tlsCertPath) && 0 != len(lv.tlsKeyPath) { // see http://golang.org/src/pkg/net/http/server.go?#L1823 certFullpath := lv.tlsCertPath if !filepath.IsAbs(certFullpath) { certFullpath = filepath.Join(SFFileManager.GetExecDir(), lv.tlsCertPath) } keyFullpath := lv.tlsKeyPath if !filepath.IsAbs(keyFullpath) { keyFullpath = filepath.Join(SFFileManager.GetExecDir(), lv.tlsKeyPath) } certPEMBlock, err := ioutil.ReadFile(certFullpath) if nil != err { lv.log.Fatal("(%v) %v Serve Read SSL cert file: %v \n", lv.appName, startName, err) return } keyPEMBlock, err := ioutil.ReadFile(keyFullpath) if nil != err { lv.log.Fatal("(%v) %v Serve Read SSL key file: %v \n", lv.appName, startName, err) return } if 0 == lv.tlsPort { lv.tlsPort = lv.port + 1 } tlsServer := &http.Server{ Addr: fmt.Sprintf("%s:%d", lv.addr, lv.tlsPort), Handler: lv, ReadTimeout: time.Duration(lv.serverTimeout) * time.Second, WriteTimeout: time.Duration(lv.serverTimeout) * time.Second, } tlsServer.TLSConfig = new(tls.Config) tlsServer.TLSConfig.NextProtos = []string{"http/1.1"} tlsServer.TLSConfig.Certificates = make([]tls.Certificate, 1) tlsServer.TLSConfig.Certificates[0], err = tls.X509KeyPair(certPEMBlock, keyPEMBlock) if nil != err { lv.log.Fatal("(%v) %v TLS Serve: %v \n", lv.appName, startName, err) return } tlsListen, err := net.Listen("tcp", tlsServer.Addr) if err != nil { lv.log.Fatal("(%v) %v TLS Listen: %v \n", lv.appName, startName, err) return } // http start if nil != lv.listener && nil != defaultServer { logInfo += fmt.Sprintf("(%v) %v to Listen on %v. Go to %v \n", lv.appName, startName, lv.port, logAddr) go func() { err = defaultServer.Serve(lv.listener) if err != nil { lv.log.Fatal("(%v) %v Serve: %v \n", lv.appName, startName, err) } }() } // tls start lv.tlsListener = &leafveinListener{tlsListen.(*net.TCPListener), DEFAULT_KEEP_ALIVE_PERIOD, tlsServer.TLSConfig} logInfo += fmt.Sprintf("(%v) %v to TLS Listen on %v. Go to %v:%v \n", lv.appName, startName, lv.tlsPort, logTLSAddr, lv.tlsPort) lv.log.Info(logInfo) runFunc = func() { err = tlsServer.Serve(lv.tlsListener) if err != nil { lv.log.Fatal("(%v) %v TLS Serve: %v \n", lv.appName, startName, err) } lv.isStart = false if nil != _serverWaitGroup { _serverWaitGroup.Done() } } } else { if nil == defaultServer || nil == lv.listener { lv.log.Fatal("default server or default listener init nil. port is configured correctly?") return } logInfo += fmt.Sprintf("(%v) %v to Listen on %v. Go to %v \n", lv.appName, startName, lv.port, logAddr) lv.log.Info(logInfo) runFunc = func() { err := defaultServer.Serve(lv.listener) if err != nil { lv.log.Fatal("(%v) %v Serve: %v \n", lv.appName, startName, err) } lv.isStart = false if nil != _serverWaitGroup { _serverWaitGroup.Done() } } } // start server lv.isStart = true if nil != _serverWaitGroup { _serverWaitGroup.Add(1) } if goroutine { go runFunc() } else { runFunc() } }