• Brad Fitzpatrick's avatar
    net/http: flush request body chunks in Transport · e5febf95
    Brad Fitzpatrick authored
    The Transport's writer to the remote server is wrapped in a
    bufio.Writer to suppress many small writes while writing headers and
    trailers. However, when writing the request body, the buffering may get
    in the way if the request body is arriving slowly.
    
    Because the io.Copy from the Request.Body to the writer is already
    buffered, the outer bufio.Writer is unnecessary and prevents small
    Request.Body.Reads from going to the server right away. (and the
    io.Reader contract does say to return when you've got something,
    instead of blocking waiting for more). After the body is finished, the
    Transport's bufio.Writer is still used for any trailers following.
    
    A previous attempted fix for this made the chunk writer always flush
    if the underlying type was a bufio.Writer, but that is not quite
    correct. This CL instead makes it opt-in by using a private sentinel
    type (wrapping a *bufio.Writer) to the chunk writer that requests
    Flushes after each chunk body (the chunk header & chunk body are still
    buffered together into one write).
    
    Fixes #6574
    
    Change-Id: Icefcdf17130c9e285c80b69af295bfd3e72c3a70
    Reviewed-on: https://go-review.googlesource.com/10021Reviewed-by: 's avatarAndrew Gerrand <adg@golang.org>
    Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    e5febf95
transport_test.go 66.8 KB