Files
origin/network/httpserver.go
2019-04-11 10:19:16 +08:00

99 lines
2.2 KiB
Go

package network
import (
"crypto/tls"
"fmt"
"net/http"
"os"
"time"
"github.com/duanhf2012/origin/service"
"github.com/duanhf2012/origin/sysmodule"
)
type CA struct {
certfile string
keyfile string
}
type HttpServer struct {
port uint16
handler http.Handler
readtimeout time.Duration
writetimeout time.Duration
httpserver *http.Server
caList []CA
ishttps bool
}
func (slf *HttpServer) Init(port uint16, handler http.Handler, readtimeout time.Duration, writetimeout time.Duration) {
slf.port = port
slf.handler = handler
slf.readtimeout = readtimeout
slf.writetimeout = writetimeout
}
func (slf *HttpServer) HandleFunc(pattern string, handler func(http.ResponseWriter, *http.Request)) {
http.HandleFunc(pattern, handler)
}
func (slf *HttpServer) Start() {
go slf.startListen()
}
func (slf *HttpServer) startListen() error {
listenPort := fmt.Sprintf(":%d", slf.port)
var tlscatList []tls.Certificate
var tlsConfig *tls.Config
for _, cadata := range slf.caList {
cer, err := tls.LoadX509KeyPair(cadata.certfile, cadata.keyfile)
if err != nil {
service.GetLogger().Printf(sysmodule.LEVER_FATAL, "load CA [%s]-[%s] file is error :%s", cadata.certfile, cadata.keyfile, err.Error())
os.Exit(1)
return nil
}
tlscatList = append(tlscatList, cer)
}
if len(tlscatList) > 0 {
tlsConfig = &tls.Config{Certificates: tlscatList}
}
slf.httpserver = &http.Server{
Addr: listenPort,
Handler: slf.handler,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
TLSConfig: tlsConfig,
}
var err error
if slf.ishttps == true {
err = slf.httpserver.ListenAndServeTLS("", "")
} else {
err = slf.httpserver.ListenAndServe()
}
if err != nil {
service.GetLogger().Printf(sysmodule.LEVER_FATAL, "http.ListenAndServe(%d, nil) error:%v\n", listenPort, err)
fmt.Printf("http.ListenAndServe(%d, %v) error\n", slf.port, err)
os.Exit(1)
}
return nil
}
func (slf *HttpServer) SetHttps(certfile string, keyfile string) bool {
if certfile == "" || keyfile == "" {
return false
}
slf.caList = append(slf.caList, CA{certfile, keyfile})
slf.ishttps = true
return true
}