Вы создаете contex.Context
, который можно отменить, который вы отменяете, когда клиент закрывает соединение, НО вы не проверяете контекст, и ваш обработчик ничего не делает, если он отменяется.Только контекст несет сигналы тайм-аута и отмены, он не имеет ни силы, ни намерения уничтожать / прекращать выполнение программ.Сами goroutines должны отслеживать такие сигналы отмены и действовать в соответствии с ними.
Итак, вы видите ожидаемый вывод вашего кода.
То, что вы хотите, это контролировать контекст, и если этоотменяется, возвращает «немедленно» из обработчика.
Конечно, если вы «спите», вы тем временем не можете контролировать контекст.Поэтому вместо этого используйте time.After()
, как в этом примере:
mux.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
if cn, ok := w.(http.CloseNotifier); ok {
go func(done <-chan struct{}, closed <-chan bool) {
select {
case <-done:
case <-closed:
fmt.Println("client cancelled....................!!!!!!!!!")
cancel()
}
}(ctx.Done(), cn.CloseNotify())
}
select {
case <-time.After(5 * time.Second):
fmt.Println("5 seconds elapsed, client didn't close")
case <-ctx.Done():
fmt.Println("Context closed, client closed connection?")
return
}
fmt.Fprint(w, "cancellation testing......")
})