Browse Source

simplify middleware structures

tags/v0.9.0
jimzhan 9 years ago
parent
commit
bb305e89f9
2 changed files with 49 additions and 29 deletions
  1. +43
    -0
      middleware.go
  2. +6
    -29
      router.go

+ 43
- 0
middleware.go View File

/* ----------------------------------------------------------------------
* ______ ___ __
* / ____/___ / | ____ __ ___ __/ /_ ___ ________
* / / __/ __ \/ /| | / __ \/ / / / | /| / / __ \/ _ \/ ___/ _ \
* / /_/ / /_/ / ___ |/ / / / /_/ /| |/ |/ / / / / __/ / / __/
* \____/\____/_/ |_/_/ /_/\__. / |__/|__/_/ /_/\___/_/ \___/
* /____/
*
* (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 View File

"github.com/gorilla/mux" "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 { type Router struct {
middleware *middleware middleware *middleware
mux *mux.Router mux *mux.Router
// build constructs all router/subrouters along with their middleware modules chain. // build constructs all router/subrouters along with their middleware modules chain.
func (self *Router) build() http.Handler { func (self *Router) build() http.Handler {
if !self.ready { 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 { self.Use(func(http.Handler) http.Handler {
return self.mux 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++ { 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 return self.middleware
} }

Loading…
Cancel
Save