Skip to content

Commit 6b488e7

Browse files
authored
Merge pull request devfeel#107 from devfeel/develop
Version 1.4.7 - 修复Middleware特定场景下无效问题
2 parents 73a14f5 + 54a72a1 commit 6b488e7

File tree

8 files changed

+87
-17
lines changed

8 files changed

+87
-17
lines changed

const/const.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package _const
2+
3+
//dotweb const
4+
const (
5+
Version = "1.4.7"
6+
)

consts.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
package dotweb
22

3-
//dotweb const
4-
const (
5-
Version = "1.4.5.1"
6-
)
7-
83
//Log define
94
const (
105
LogTarget_Default = "dotweb_default"

core/state.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"sync"
99
"sync/atomic"
1010
"time"
11+
"github.com/devfeel/dotweb/const"
1112
)
1213

1314
var GlobalState *ServerStateInfo
@@ -116,6 +117,8 @@ type ServerStateInfo struct {
116117
//ShowHtmlData show server state data html-string format
117118
func (state *ServerStateInfo) ShowHtmlData() string {
118119
data := "<html><body><div>"
120+
data += "ServerVersion : " + _const.Version
121+
data += "<br>"
119122
data += "ServerStartTime : " + state.ServerStartTime.Format(dateTimeLayout)
120123
data += "<br>"
121124
data += "TotalRequestCount : " + strconv.FormatUint(state.TotalRequestCount, 10)

dotweb.go

Lines changed: 53 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ func (app *DotWeb) ListenAndServe(addr string) error {
275275
app.initBindMiddleware()
276276

277277
if app.StartMode == StartMode_Classic {
278-
app.UseDotwebRouter()
278+
app.IncludeDotwebGroup()
279279
}
280280

281281
if app.HttpServer.ServerConfig().EnabledTLS {
@@ -402,21 +402,67 @@ func (app *DotWeb) initRegisterConfigGroup() {
402402
// init bind app's middleware to router node
403403
func (app *DotWeb) initBindMiddleware() {
404404
router := app.HttpServer.Router().(*router)
405-
for path, node := range router.allNodeMap {
405+
//bind app middlewares
406+
for fullExpress, _ := range router.allRouterExpress {
407+
expresses := strings.Split(fullExpress, "_")
408+
if len(expresses) < 2{
409+
continue
410+
}
411+
node := router.getNode(expresses[0], expresses[1])
412+
if node == nil{
413+
continue
414+
}
415+
406416
node.appMiddlewares = app.Middlewares
407417
for _, m := range node.appMiddlewares {
408418
if m.HasExclude() && m.ExistsExcludeRouter(node.fullPath) {
409-
logger.Logger().Debug("DotWeb initBindMiddleware "+path+" "+reflect.TypeOf(m).String()+" exclude", LogTarget_HttpServer)
419+
logger.Logger().Debug("DotWeb initBindMiddleware [app] "+fullExpress+" "+reflect.TypeOf(m).String()+" exclude", LogTarget_HttpServer)
410420
node.hasExcludeMiddleware = true
411421
} else {
412-
logger.Logger().Debug("DotWeb initBindMiddleware "+path+" "+reflect.TypeOf(m).String()+" match", LogTarget_HttpServer)
422+
logger.Logger().Debug("DotWeb initBindMiddleware [app] "+fullExpress+" "+reflect.TypeOf(m).String()+" match", LogTarget_HttpServer)
423+
}
424+
}
425+
if len(node.middlewares) > 0{
426+
firstMiddleware := &xMiddleware{}
427+
firstMiddleware.SetNext(node.middlewares[0])
428+
node.middlewares = append([]Middleware{firstMiddleware}, node.middlewares...)
429+
}
430+
}
431+
432+
//bind group middlewares
433+
for _, g := range app.HttpServer.groups {
434+
xg := g.(*xGroup)
435+
if len(xg.middlewares) <= 0 {
436+
continue
437+
}else{
438+
firstMiddleware := &xMiddleware{}
439+
firstMiddleware.SetNext(xg.middlewares[0])
440+
xg.middlewares = append([]Middleware{firstMiddleware}, xg.middlewares...)
441+
}
442+
for fullExpress, _ := range xg.allRouterExpress {
443+
expresses := strings.Split(fullExpress, "_")
444+
if len(expresses) < 2 {
445+
continue
446+
}
447+
node := router.getNode(expresses[0], expresses[1])
448+
if node == nil {
449+
continue
450+
}
451+
node.groupMiddlewares = xg.middlewares
452+
for _, m := range node.groupMiddlewares {
453+
if m.HasExclude() && m.ExistsExcludeRouter(node.fullPath) {
454+
logger.Logger().Debug("DotWeb initBindMiddleware [group] "+fullExpress+" "+reflect.TypeOf(m).String()+" exclude", LogTarget_HttpServer)
455+
node.hasExcludeMiddleware = true
456+
} else {
457+
logger.Logger().Debug("DotWeb initBindMiddleware [group] "+fullExpress+" "+reflect.TypeOf(m).String()+" match", LogTarget_HttpServer)
458+
}
413459
}
414460
}
415461
}
416462
}
417463

418-
// init inner routers
419-
func (app *DotWeb) UseDotwebRouter() {
464+
// IncludeDotwebGroup init inner routers
465+
func (app *DotWeb) IncludeDotwebGroup() {
420466
//默认支持pprof信息查看
421467
gInner := app.HttpServer.Group("/dotweb")
422468
gInner.GET("/debug/pprof/:key", initPProf)
@@ -548,7 +594,7 @@ func showIntervalData(ctx Context) error {
548594

549595
//显示服务器状态信息
550596
func showServerState(ctx Context) error {
551-
ctx.WriteString(core.GlobalState.ShowHtmlData())
597+
ctx.WriteHtml(core.GlobalState.ShowHtmlData())
552598
return nil
553599
}
554600

group.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package dotweb
22

3-
import "github.com/devfeel/dotweb/logger"
3+
import (
4+
"github.com/devfeel/dotweb/logger"
5+
)
46

57
type (
68
Group interface {
@@ -18,12 +20,14 @@ type (
1820
xGroup struct {
1921
prefix string
2022
middlewares []Middleware
23+
allRouterExpress map[string]struct{}
2124
server *HttpServer
2225
}
2326
)
2427

2528
func NewGroup(prefix string, server *HttpServer) Group {
26-
g := &xGroup{prefix: prefix, server: server}
29+
g := &xGroup{prefix: prefix, server: server, allRouterExpress:make(map[string]struct{})}
30+
server.groups = append(server.groups, g)
2731
logger.Logger().Debug("DotWeb:Group NewGroup ["+prefix+"]", LogTarget_HttpServer)
2832
return g
2933
}
@@ -92,6 +96,7 @@ func (g *xGroup) RegisterRoute(method, path string, handler HttpHandle) RouterNo
9296

9397
func (g *xGroup) add(method, path string, handler HttpHandle) RouterNode {
9498
node := g.server.Router().RegisterRoute(method, g.prefix+path, handler)
99+
g.allRouterExpress[method+"_"+g.prefix+path] = struct{}{}
95100
node.Node().groupMiddlewares = g.middlewares
96101
return node
97102
}

router.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ type (
9696
// handler functions via configurable routes
9797
router struct {
9898
Nodes map[string]*Node
99-
allNodeMap map[string]*Node
99+
allRouterExpress map[string]struct{}
100100
server *HttpServer
101101
handlerMap map[string]HttpHandle
102102
handlerMutex *sync.RWMutex
@@ -159,7 +159,7 @@ func NewRouter(server *HttpServer) *router {
159159
RedirectTrailingSlash: true,
160160
RedirectFixedPath: true,
161161
HandleOPTIONS: true,
162-
allNodeMap: make(map[string]*Node),
162+
allRouterExpress: make(map[string]struct{}),
163163
server: server,
164164
handlerMap: make(map[string]HttpHandle),
165165
handlerMutex: new(sync.RWMutex),
@@ -187,6 +187,14 @@ func (r *router) MatchPath(ctx Context, routePath string) bool {
187187
return false
188188
}
189189

190+
func (r *router) getNode(httpMethod string, routePath string) *Node{
191+
if root := r.Nodes[httpMethod]; root != nil {
192+
n := root.getNode(routePath)
193+
return n
194+
}
195+
return nil
196+
}
197+
190198
// ServeHTTP makes the router implement the http.Handler interface.
191199
func (r *router) ServeHTTP(ctx *HttpContext) {
192200
req := ctx.Request().Request
@@ -492,7 +500,7 @@ func (r *router) add(method, path string, handle RouterHandle, m ...Middleware)
492500
//fmt.Println("Handle => ", method, " - ", *root, " - ", path)
493501
outnode = root.addRoute(path, handle, m...)
494502
outnode.fullPath = path
495-
r.allNodeMap[method+"_"+path] = outnode
503+
r.allRouterExpress[method+"_"+path] = struct{}{}
496504
return
497505
}
498506

server.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ type (
2626
HttpServer struct {
2727
stdServer *http.Server
2828
router Router
29+
groups []Group
2930
Modules []*HttpModule
3031
DotApp *DotWeb
3132
sessionManager *session.SessionManager

version.MD

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
## dotweb版本记录:
22

3+
#### Version 1.4.7
4+
* BUG Fixed: 修复Middleware特定场景下无效问题
5+
* 新增dotweb.IncludeDotwebGroup,用于自动集成dotweb相关路由
6+
* /dotweb/state 增加 ServerVersion输出
7+
* 2018-01-22 22:00
8+
39
#### Version 1.4.6
410
* BUG Fixed: UploadFile废弃Bytes接口,新增ReadBytes接口,用于返回上传文件本身
511
* 需要特别注意,由于io.read具有一次性特性,UploadFile.SaveFile与UploadFile.ReadBytes只能使用其中一个,另外一个将无法正常获取数据

0 commit comments

Comments
 (0)