Skip to content

Instantly share code, notes, and snippets.

type logResponseWriter struct {
http.ResponseWriter
status int
}
func (w *logResponseWriter) WriteHeader(status int) {
w.status = status
w.ResponseWriter.WriteHeader(status)
}
package main
import (
"fmt"
"log"
"math/rand"
"net/http"
)
type middlewareFunc func(next http.HandlerFunc) http.HandlerFunc
package main
import (
"fmt"
"log"
"math/rand"
"net/http"
)
type middlewareFunc func(next http.HandlerFunc) http.HandlerFunc
func main() {
http.Handle("/api/v1", chain(businessLogic("12345"), logger, shortCircuitLogic(deciderFunc)))
log.Print("Listening (finalhandler) ...")
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal(err.Error())
}
}
func businessLogic(p1 string) http.HandlerFunc {
type middlewareFunc func(next http.HandlerFunc) http.HandlerFunc
func chain(handler http.HandlerFunc, chain ...middlewareFunc) http.Handler {
return http.HandlerFunc(recurseChain(handler, chain))
}
func recurseChain(handler http.HandlerFunc, chain []middlewareFunc) http.HandlerFunc {
if len(chain) <= 0 {
return handler
}
package main
import (
"fmt"
"log"
"math/rand"
"net/http"
)
type middlewareFunc func(next http.HandlerFunc) http.HandlerFunc
func deciderFunc() bool {
return rand.Intn(2) == 1
}
func shortCircuitLogic(deciderFunc func() bool) middlewareFunc {
return func(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
d := deciderFunc()
var decision string
func logger(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
log.Printf("Request: %v", r.URL.Path)
next(w, r)
log.Printf("Request complete: %v", r.URL.Path)
}
}
func main() {
http.Handle("/api/v1", chain(businessLogic("12345")))
log.Print("Listening (recursivechain) ...")
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal(err.Error())
}
}
func businessLogic(p1 string) middlewareFunc {
type middlewareFunc func(next http.HandlerFunc) http.HandlerFunc
func chain(chain ...middlewareFunc) http.Handler {
return http.HandlerFunc(recurseChain(chain))
}
func recurseChain(chain []middlewareFunc) http.HandlerFunc {
if len(chain) <= 0 {
return func(_ http.ResponseWriter, _ *http.Request) {}
}