Skip to content

Instantly share code, notes, and snippets.

@nickcarenza
Created February 15, 2015 20:09
Show Gist options
  • Save nickcarenza/12e52b5e6617531e8c6e to your computer and use it in GitHub Desktop.
Save nickcarenza/12e52b5e6617531e8c6e to your computer and use it in GitHub Desktop.
Crude HTTP Middleware Implementation
package main
import(
"net/http"
"net/http/httptest"
"log"
"io/ioutil"
"fmt"
)
import (
"github.com/julienschmidt/httprouter"
)
func main(){
r := httprouter.New()
mIndex := -1
var middlewares []httprouter.Handle
var handler httprouter.Handle
var writer http.ResponseWriter
var request *http.Request
var params httprouter.Params
next := func() {
log.Println("next")
mIndex++
if mIndex < len(middlewares) {
middlewares[mIndex](writer, request, params)
} else {
handler(writer, request, params)
}
}
wrapper := func(h httprouter.Handle) httprouter.Handle{
log.Println("wrapper")
return func(w http.ResponseWriter, r *http.Request, p httprouter.Params){
handler = h
writer = w
request = r
params = p
next()
}
}
middlewares = append(middlewares, func(w http.ResponseWriter, _ *http.Request, _ httprouter.Params){
log.Println("m1")
fmt.Fprint(w, "m1")
next()
})
middlewares = append(middlewares, func(w http.ResponseWriter, _ *http.Request, _ httprouter.Params){
log.Println("m2")
fmt.Fprint(w, "m2")
next()
})
r.GET("/1", wrapper(func(w http.ResponseWriter, _ *http.Request, _ httprouter.Params){
log.Println("r1")
fmt.Fprint(w, "r1")
}))
r.GET("/2", wrapper(func(w http.ResponseWriter, _ *http.Request, _ httprouter.Params){
log.Println("r2")
fmt.Fprint(w, "r2")
}))
server := httptest.NewServer(r)
defer server.Close()
res, err := http.Get(server.URL+"/1")
if err != nil {
log.Fatal(err)
}
greeting, err := ioutil.ReadAll(res.Body)
res.Body.Close()
if err != nil {
log.Fatal(err)
}
fmt.Printf("final %s", greeting)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment