2017-05-29 9 views
0

Ich habe diesen Code, die umleiten http/s Anfragen zur Login-Seite, es funktioniert mit Ausnahme TimeoutHandler keine Wirkung hat, meine ich die Sitzungen Timeout nicht nach 3 Sekunden:Golang1.8.1: TimeoutHandler hat keinen Einfluss auf Multiplexer

func main(){ 

     mux := http.NewServeMux() 
     rh := http.RedirectHandler("http://10.130.0.10:820/login", 307) 
     mux.Handle("/", rh) 
     tmux := http.TimeoutHandler(mux, time.Second*3, "Timeout!") 
     go http.ListenAndServe("10.130.0.10:818", tmux) 
     go http.ListenAndServeTLS("10.130.0.10:821", "server.pem", "server.key", tmux) 
     var input string 
     fmt.Scanln(&input) 
     fmt.Println("done") 
} 

jeder Rat wird geschätzt.

+0

Haben Sie versucht, die Zeitüberschreitung der Elemente zu überprüfen, wenn Sie ListenAndServe nicht in einer Goroutine ausführen? Um den Kommentar aus ListenAndServeTLS zu testen, führen Sie ListenAndServe aus, ohne eine separate Routine zu starten. – reticentroot

Antwort

0

Die http.TimeoutHandler dient nicht dazu, die Sitzung nach einer bestimmten Zeit ablaufen zu lassen. Stattdessen wird die Ausführungszeit eines Handlers begrenzt, d. H. Wenn die angegebene Zeit verstrichen ist, wird 503 Service Unavailable an den HTTP-Client zurückgegeben. Unten ist ein Beispiel für eine solche Nutzung:

func handlerNoTimeout(w http.ResponseWriter, r *http.Request) { 
    //This handler takes 1 second to finished, won't timeout 
    time.Sleep(1 * time.Second) 
    w.Write([]byte("Handler OK")) 
} 

func handlerTimeout(w http.ResponseWriter, r *http.Request) { 
    //This handler takes 4 seconds to finished. 
    //Before finished, it will timeout, 
    //503 response will be sent to client + given message (i.e. Timeout!) 
    time.Sleep(4 * time.Second) 
    w.Write([]byte("Handler timeout (never executed)")) 
} 

func main() { 

    mux := http.NewServeMux() 
    rh := http.RedirectHandler("http://10.130.0.10:820/login", 307) 
    mux.Handle("/", rh) 
    mux.HandleFunc("/timeout", handlerTimeout) 
    mux.HandleFunc("/notimeout", handlerNoTimeout) 
    tmux := http.TimeoutHandler(mux, time.Second*3, "Timeout!") 
    go http.ListenAndServe(":818", tmux) 
    go http.ListenAndServeTLS(":821", "server.pem", "server.key", tmux) 
    var input string 
    fmt.Scanln(&input) 
    fmt.Println("done") 
} 

Wenn Ihr Zugang /timeout, werden Sie 503 mit Timeout-Meldung erhalten, aber wenn Sie /notimeout zuzugreifen, wird die HTTP-Antwort 200 OK sein.

Eine Sitzung ist ein Zustand von dem Server gespeichert, nicht eine Verarbeitungsschritte/Aufgabe/Job, die kann Zeit beenden muss. Eine Sitzung ist nicht abgelaufen, es sei denn, Sie definieren eine Funktion/Methode/Handler im Hintergrund, beobachten regelmäßig die Zeit für die Sitzungsgenerierung und markieren die abgelaufene Zeit als abgelaufen.

In Ihrem Code wird es Timeout, wenn Redirect-Handler (d. H. Login-Handler) mehr als 3 Sekunden benötigt.

0

Ich fand es heraus, ich musste stattdessen ReadTimeout und WriteTimeout verwenden, hier ist ein funktionierendes Beispiel.

func main(){ 
     mux := http.NewServeMux() 
     rh := http.RedirectHandler("http://10.103.0.10:8020/login", 307) 
     mux.Handle("/", rh) 
     s := &http.Server{ 
      Addr:  "10.103.0.10:818", 
      Handler:  mux, 
      ReadTimeout: 5 * time.Second, 
      WriteTimeout: 5 * time.Second, 
     } 
     ss := &http.Server{ 
      Addr:  "10.103.0.10:821", 
      Handler:  mux, 
      ReadTimeout: 5 * time.Second, 
      WriteTimeout: 5 * time.Second, 
     } 
     go s.ListenAndServe() 
     go ss.ListenAndServeTLS("server.pem", "server.key") 

     var input string 
     fmt.Scanln(&input) 
     fmt.Println("done") 
    } 

Vielen Dank.

Verwandte Themen