net/http: with Transfer-Encoding: chunked, Transport doesn't reuse the tcp connection #15703
Actually, I had misread your repro code the first time. This is working as intended.
The lack of connection of reuse (that I see 40-60% of the time with your repo) isn't due to chunked encoding, but because the handler hasn't yet finished when you call
If you put a
And if you move the
The race you're seeing is because depending on goroutine scheduling.
You have two goroutines, S(erver) and C(lient):
You're seeing them sometimes scheduled like this:
That is a valid result.
I recommend you remove the flush.
I've added a new test in https://golang.org/cl/23200 to guarantee the existing behavior when the flush is in the right spot.
Please let me know if I misunderstand something.
Verify that for a server doing chunked encoding, with the final data and EOF arriving together, the client will reuse the connection even if it closes the body without seeing an EOF. The server sends at least one non-zero chunk and one zero chunk. This verifies that the client's bufio reading reads ahead and notes the EOF, so even if the JSON decoder doesn't read the EOF itself, as long as somebody sees it, a close won't forcible tear down the connection. This was true at least of https://golang.org/cl/21291 No code change. Test already passed (even with lots of runs, including in race mode with randomized goroutine scheduling). Updates #15703 Change-Id: I2140b3eec6b099b6b6e54f153fe271becac5d949 Reviewed-on: https://go-review.googlesource.com/23200 Run-TryBot: Brad Fitzpatrick <firstname.lastname@example.org> TryBot-Result: Gobot Gobot <email@example.com> Reviewed-by: Andrew Gerrand <firstname.lastname@example.org>