]> Cypherpunks repositories - gostls13.git/commit
net/http: flush request body chunks in Transport
authorBrad Fitzpatrick <bradfitz@golang.org>
Wed, 13 May 2015 19:41:56 +0000 (12:41 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 14 May 2015 00:29:24 +0000 (00:29 +0000)
commite5febf957f5be9d3325c2d851bff6ec7c55e4662
tree50369fa056f32ea6d0739126cc9de998705800c1
parent5c7f94421ef5eca55b37f778b427abd5ea174c26
net/http: flush request body chunks in Transport

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/10021
Reviewed-by: Andrew Gerrand <adg@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
src/net/http/internal/chunked.go
src/net/http/transfer.go
src/net/http/transport_test.go