According to https://golang.org/pkg/net/http/#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.


My expectation, then, is for the following code to block:

package main

import (
        "fmt"
        "io/ioutil"
        "net/http"
)

func main() {
        s := &http.Server{
                Addr: ":8080",
                Handler: http.HandlerFunc(func(w http.ResponseWriter, r *
http.Request) {
                        ioutil.ReadAll(r.Body)

                        <-r.Context().Done()

                        w.Write([]byte(fmt.Sprintf(
                                "request context done: %+v\n",
                                r.Context().Err(),
                        )))
                }),
        }
        s.ListenAndServe()
}



Instead, it always returns immediately, reporting that the context was 
canceled:

> printf "POST / HTTP/1.1\r\nHost: localhost\r\nContent-Length: 
4\r\n\r\nbody" | nc localhost 8080
HTTP/1.1 200 OK
Date: Mon, 15 Jan 2018 16:01:46 GMT
Content-Length: 39
Content-Type: text/plain; charset=utf-8


request context done: context canceled


Curiously, if I don't ioutil.ReadAll(r.Body), the request blocks as 
expected.

Am I missing something? My hope was to be able to use the default context 
to detect client disconnection.

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to