Initial commit
This commit is contained in:
@@ -0,0 +1,123 @@
|
||||
package web_iris
|
||||
|
||||
import (
|
||||
stdContext "context"
|
||||
"errors"
|
||||
"github.com/go-playground/validator/v10"
|
||||
"github.com/kataras/iris/v12"
|
||||
"github.com/kataras/iris/v12/context"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/kataras/iris/v12/middleware/recover"
|
||||
"pet-house.com/core/helper/arr"
|
||||
"pet-house.com/core/helper/str"
|
||||
"pet-house.com/core/server/web"
|
||||
"pet-house.com/core/server/web/web_iris/middleware"
|
||||
)
|
||||
|
||||
var ErrAuthDriverEmpty = errors.New("auth driver initialize fail")
|
||||
|
||||
// WebServer
|
||||
// - app iris application
|
||||
// - idleConnsClosed
|
||||
// - addr
|
||||
// - timeFormat
|
||||
// - staticPrefix
|
||||
|
||||
type WebServer struct {
|
||||
app *iris.Application
|
||||
idleConnsClosed chan struct{}
|
||||
parties []Party
|
||||
addr string
|
||||
timeFormat string
|
||||
}
|
||||
|
||||
// Party
|
||||
// - perfix
|
||||
// - partyFunc
|
||||
type Party struct {
|
||||
Perfix string
|
||||
PartyFunc func(index iris.Party)
|
||||
}
|
||||
|
||||
func Init() *WebServer {
|
||||
app := iris.New()
|
||||
if web.CONFIG.System.Tls {
|
||||
app.Use(middleware.LoadTls())
|
||||
}
|
||||
app.Use(recover.New())
|
||||
app.Validator = validator.New()
|
||||
app.Logger().SetLevel(web.CONFIG.System.Level)
|
||||
idleConnsClosed := make(chan struct{})
|
||||
iris.RegisterOnInterrupt(func() {
|
||||
timeout := 10 * time.Second
|
||||
ctx, cancel := stdContext.WithTimeout(stdContext.Background(), timeout)
|
||||
defer cancel()
|
||||
app.Shutdown(ctx) // close all hosts
|
||||
close(idleConnsClosed)
|
||||
})
|
||||
// 自定义应用程序配置
|
||||
_ = iris.Configuration{
|
||||
DisablePathCorrection: true,
|
||||
DisableBodyConsumptionOnUnmarshal: true,
|
||||
Charset: "UTF-8",
|
||||
}
|
||||
app.Configure(iris.WithCharset("UTF-8"), iris.WithOptimizations)
|
||||
web.SetDefaultAddrAndTimeFormat()
|
||||
|
||||
return &WebServer{
|
||||
app: app,
|
||||
addr: web.CONFIG.System.Addr,
|
||||
timeFormat: web.CONFIG.System.TimeFormat,
|
||||
idleConnsClosed: idleConnsClosed,
|
||||
}
|
||||
}
|
||||
|
||||
func (ws *WebServer) GetEngine() *iris.Application {
|
||||
return ws.app
|
||||
}
|
||||
|
||||
func (ws *WebServer) AddModule(parties ...Party) {
|
||||
ws.parties = append(ws.parties, parties...)
|
||||
}
|
||||
|
||||
func (ws *WebServer) AddFrontFunc(f func(ctx *context.Context)) {
|
||||
ws.app.Use(f)
|
||||
}
|
||||
|
||||
func (ws *WebServer) AddWebStatic(staticAbsPath, webPrefix string, paths ...string) {
|
||||
webPrefixs := strings.Split(web.CONFIG.System.WebPrefix, ",")
|
||||
wp := arr.NewCheckArrayType(2)
|
||||
for _, webPrefix := range webPrefixs {
|
||||
wp.Add(webPrefix)
|
||||
}
|
||||
if wp.Check(webPrefix) {
|
||||
return
|
||||
}
|
||||
|
||||
fsOrDir := iris.Dir(staticAbsPath)
|
||||
opt := iris.DirOptions{
|
||||
IndexName: "index.html",
|
||||
SPA: true,
|
||||
}
|
||||
ws.app.HandleDir(webPrefix, fsOrDir, opt)
|
||||
web.CONFIG.System.WebPrefix = str.Join(web.CONFIG.System.WebPrefix, ",", webPrefix)
|
||||
}
|
||||
|
||||
func (ws *WebServer) AddUploadStatic(webPrefix, staticAbsPath string) {
|
||||
fsOrDir := iris.Dir(staticAbsPath)
|
||||
ws.app.HandleDir(webPrefix, fsOrDir)
|
||||
web.CONFIG.System.StaticPrefix = webPrefix
|
||||
}
|
||||
|
||||
func (ws *WebServer) Run() {
|
||||
ws.app.Listen(
|
||||
ws.addr,
|
||||
iris.WithoutInterruptHandler,
|
||||
iris.WithoutServerError(iris.ErrServerClosed),
|
||||
iris.WithOptimizations,
|
||||
iris.WithTimeFormat(ws.timeFormat),
|
||||
)
|
||||
<-ws.idleConnsClosed
|
||||
}
|
||||
Reference in New Issue
Block a user