Let's suppose client uploads heavy image by http with slow internet connection, he opens connection to server, starts to write data and suddenly he loses this connection because of network problems. How can I detect this on server if handler function was not yet called. The solution I found is to check the connection state. But the problem is that it's not scalable, because a lot of goroutines will interact with global variable. Are there any more elegant solutions?
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()) }
sync.Map(golang.org/pkg/sync/#Map) instead of a regularmap.ConnStatecallback to server, which will be called each time state of connection is changed, using it I support this map of connections. And the main thing, detection of failed connection. As u see I check if current state is closed and the previous one was open - failed http connection, because there was nohttp.StateActivestate.