I have a net/http
Server serving a GET request (via ServeHTTP()
) which can take a very long time to complete. Consequently, no client timeout is configured server side. However, the connected client may have shut down its connection to the server (typically due to a timeout on its side, but of course, other reasons are possible as well). I have no control over the clients.
How do I detect such a condition within ServeHTTP()
without "disturbing" the connection?
1xx
response headers because it's not supported by ResponseWriter.WriteHeader()
(also, it allows only one header to be set and does not return anything).ResponseWriter.Write()
with zero-sized data, as that would send a header.What other options do I have?
Edit: this is not a duplicate of how to close/abort a Golang http.Client POST prematurely because there the question is how to cancel a request from the client side while my question is about detecting such a cancellation from the server side.
Interrogate the request context:
For incoming server requests, the context is canceled when the client's connection closes, the request is canceled (with HTTP/2), or when the ServeHTTP method returns.
var r *http.Request
select {
case <-r.Context().Done():
// Client gave up
default:
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With