Просмотр исходного кода

simplify middleware structures

tags/v0.9.0
jimzhan 9 лет назад
Родитель
Сommit
bb305e89f9
2 измененных файлов: 49 добавлений и 29 удалений
  1. +43
    -0
      middleware.go
  2. +6
    -29
      router.go

+ 43
- 0
middleware.go Просмотреть файл

@@ -0,0 +1,43 @@
/* ----------------------------------------------------------------------
* ______ ___ __
* / ____/___ / | ____ __ ___ __/ /_ ___ ________
* / / __/ __ \/ /| | / __ \/ / / / | /| / / __ \/ _ \/ ___/ _ \
* / /_/ / /_/ / ___ |/ / / / /_/ /| |/ |/ / / / / __/ / / __/
* \____/\____/_/ |_/_/ /_/\__. / |__/|__/_/ /_/\___/_/ \___/
* /____/
*
* (C) Copyright 2015 GoAnywhere (http://goanywhere.io).
* ----------------------------------------------------------------------
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ----------------------------------------------------------------------*/
package rex

import "net/http"

type middleware struct {
cache http.Handler
stack []func(http.Handler) http.Handler
}

// Implements the net/http Handler interface and calls the middleware stack.
func (self *middleware) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if self.cache == nil {
// setup the whole middleware modules in a FIFO chain.
var next http.Handler = http.DefaultServeMux
for index := len(self.stack) - 1; index >= 0; index-- {
next = self.stack[index](next)
}
self.cache = next
}
self.cache.ServeHTTP(w, r)
}

+ 6
- 29
router.go Просмотреть файл

@@ -32,29 +32,6 @@ import (
"github.com/gorilla/mux"
)

type middleware struct {
cache http.Handler
stack []func(http.Handler) http.Handler
}

// build sets up the whole middleware modules in a FIFO chain.
func (self *middleware) build() http.Handler {
if self.cache == nil {
var next http.Handler = http.DefaultServeMux
// Activate modules in FIFO order.
for index := len(self.stack) - 1; index >= 0; index-- {
next = self.stack[index](next)
}
self.cache = next
}
return self.cache
}

// Implements the net/http Handler interface and calls the middleware stack.
func (self *middleware) ServeHTTP(w http.ResponseWriter, r *http.Request) {
self.build().ServeHTTP(w, r)
}

type Router struct {
middleware *middleware
mux *mux.Router
@@ -72,18 +49,18 @@ func New() *Router {
// build constructs all router/subrouters along with their middleware modules chain.
func (self *Router) build() http.Handler {
if !self.ready {
self.ready = true
// * activate router's middleware modules.
// * add router into middlware stack to serve as final http.Handler.
self.Use(func(http.Handler) http.Handler {
return self.mux
})
// * activate subrouters's middleware modules.
// * add subrouters into middlware stack to serve as final http.Handler.
for index := 0; index < len(self.subrouters); index++ {
sr := self.subrouters[index]
sr.Use(func(http.Handler) http.Handler {
return sr.mux
router := self.subrouters[index]
router.Use(func(http.Handler) http.Handler {
return router.mux
})
}
self.ready = true
}
return self.middleware
}

Загрузка…
Отмена
Сохранить