Мое промежуточное ПО для отмены запроса:
func Cancelation(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
// create a channel
ch := make(chan bool)
serve := func() {
next.ServeHTTP(w, r)
ch <- true
}
go serve()
select {
case <-ch:
close(ch)
case <-ctx.Done():
fmt.Fprintf(os.Stderr, constants.MessageRequestCanceled)
}
}
}
Это промежуточное ПО обрабатывает каждый входящий запрос. Когда пользователь отменяет запрос, канал <-ctx.Done()
устанавливается и возвращается с func Cancelation
, но каждый процесс внутри next.ServeHTTP(w, r)
не останавливается и продолжает работать.
Как избежать всего процесса, когда запрос был отменен?