]> Cypherpunks repositories - gostls13.git/commit
net/http: reject client-side retries in server timeout tests
authorBryan C. Mills <bcmills@google.com>
Wed, 31 Jan 2024 16:43:38 +0000 (11:43 -0500)
committerGopher Robot <gobot@golang.org>
Mon, 26 Feb 2024 22:45:28 +0000 (22:45 +0000)
commitfc0d9a4b7d8bfd1130b1fe8419b50fffa76b00a9
tree9d56767a60fefd21af6910a934e8dfd5db684317
parentf8b4653500744da567767b641378193638d4fcf8
net/http: reject client-side retries in server timeout tests

This breaks an unbounded client-side retry loop if the server's
timeout happens to fire during its final read of the TLS handshake.

The retry loop was observed on wasm platforms at CL 557437.
I was also able to reproduce chains of dozens of retries on my
linux/amd64 workstation by adjusting some timeouts and adding a couple
of sleeps, as in this patch:
https://gist.github.com/bcmills/d0a0a57e5f64eebc24e8211d8ea502b3
However, on linux/amd64 on my workstation the test always eventually
breaks out of the retry loop due to timing jitter.

I couldn't find a retry-specific hook in the http.Client,
http.Transport, or tls.Config structs, so I have instead abused the
Transport.Proxy hook for this purpose. Separately, we may want to
consider adding a retry-specific hook, or changing the net/http
implementation to avoid transparently retrying in this case.

Fixes #65410.
Updates #65178.

Change-Id: I0e43c039615fe815f0a4ba99a8813c48b1fdc7e6
Reviewed-on: https://go-review.googlesource.com/c/go/+/559835
Reviewed-by: Damien Neil <dneil@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Bryan Mills <bcmills@google.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
src/net/http/serve_test.go