7

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?

  • I cannot send a series of 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).
  • I cannot use 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.

Alexander Klauer
  • 957
  • 11
  • 18
  • Possible duplicate of [how to close/abort a Golang http.Client POST prematurely](https://stackoverflow.com/questions/29197685/how-to-close-abort-a-golang-http-client-post-prematurely) – Jonathan Hall Aug 21 '18 at 10:13
  • 1
    Much clearer. Thanks. It's still a duplicate, though :) – Jonathan Hall Aug 21 '18 at 11:34

1 Answers1

10

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:
}
Peter
  • 29,454
  • 5
  • 48
  • 60