Предположим, клиент загружает тяжелое изображение по http с медленным интернет-соединением, он открывает соединение с сервером, начинает записывать данные и внезапно теряет это соединение из-за проблем с сетью.Как я могу обнаружить это на сервере, если функция обработчика еще не была вызвана.Решение, которое я нашел, это проверить состояние соединения.Но проблема в том, что он не масштабируемый, потому что многие программы будут взаимодействовать с глобальной переменной.Есть ли более элегантные решения?
package main
import (
"fmt"
"log"
"net"
"net/http"
)
// current state of connections
var connStates = make(map[string]http.ConnState)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Println("got new request")
fmt.Println(connStates)
})
srv := &http.Server{
Addr: ":8080",
ConnState: func(conn net.Conn, event http.ConnState) {
if event != http.StateClosed {
connStates[conn.RemoteAddr().String()] = event
} else {
if connStates[conn.RemoteAddr().String()] == http.StateActive {
fmt.Println("client cancelled request")
}
delete(connStates, conn.RemoteAddr().String())
}
},
}
log.Fatal(srv.ListenAndServe())
}