2016-07-21 4 views
0

Ich versuche, eine einfache http MiddleWare-Handler schreiben, die eine http-Antwort verarbeitet. Leider funktioniert es nicht und ich kann nicht herausfinden, welchen Fehler ich mache. Jede/jede Hilfe wird geschätzt!Erweitern GoLang's http.ResponseWriter-Funktionalität zu Pre/Post-Prozess Antworten

Ich bin mit Go Gorilla-Mux-Router Hier sind illustrativ Teile des Codes:

import (
    "fmt" 
    "log" 
    "github.com/gorilla/mux" 
) 
: 
func Start() { 
    router := mux.NewRouter() 
    router.HandleFunc("/", myHandler) 
    : 
    log.Fatal(http.ListenAndServe(":8088", Middleware(router))) 
} 

func myHandler(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintln(w, "myHandler called") 
} 
func Middleware(h http.Handler) http.Handler { 
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
     neww := NewProcessor(w) 
     h.ServeHTTP(neww, r) 
    }) 
} 

type Processor struct { 
    http.ResponseWriter 
} 
func (r *Processor) Write(b []byte) (int, error) { 
    fmt.Printf("******* Processor writing...") 
    log.Print(string(b)) // log it out 
    return r.Write(b) // pass it to the original ResponseWriter 
} 
func NewProcessor(w http.ResponseWriter) http.ResponseWriter { 
    fmt.Printf("******* Creating new Processor...") 
    return &Processor{ResponseWriter: w} 
} 

Der Ausgang I ist unten (Text aus Gründen der Übersichtlichkeit weggelassen zusätzliche Protokollierung) aufgelistet bekommen:

******* Creating new Processor 
myHandler called 

Beachten Sie jedoch, dass die Nachricht "******* Prozessor schreiben ..." nicht angezeigt wurde, was darauf hinweist, dass die Funktion "Schreiben" nicht aufgerufen wurde.

Welche Änderungen müssen vorgenommen werden, damit die Funktion "Write" aufgerufen werden kann?

Antwort

2

return r.Write(b) verursachte eine Endlosschleife von Anrufen Write() des Prozessors. Ersetzen Sie es mit return r.ResponseWriter.Write(b) behoben den Fehler. Hier

ist der korrigierte Code:

package main 

import (
    "fmt" 
    "log" 
    "net/http" 
) 

func main() { 
    mux := http.NewServeMux() 
    mux.HandleFunc("/", myHandler) 
    log.Fatal(http.ListenAndServe(":8088", Middleware(mux))) 
} 

func myHandler(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintln(w, "myHandler called") 
} 

func Middleware(h http.Handler) http.Handler { 
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
     new := NewProcessor(w) 
     h.ServeHTTP(new, r) 
    }) 
} 

type Processor struct { 
    http.ResponseWriter 
} 

func (r *Processor) Write(b []byte) (int, error) { 
    log.Print("******* Processor writing...") 
    log.Print(string(b)) // log it out 
    return r.ResponseWriter.Write(b) // pass it to the original ResponseWriter 
} 

func NewProcessor(w http.ResponseWriter) http.ResponseWriter { 
    log.Print("******* Creating new Processor...") 
    return &Processor{ResponseWriter: w} 
} 

Ausgang:

2016/07/21 22:59:08 ******* Creating new Processor... 
2016/07/21 22:59:08 ******* Processor writing... 
2016/07/21 22:59:08 myHandler called