Open
Description
As part of #26937, Transport started returning writable bodies for 101 Switching Protocol responses. This is great, thank you!
However, if you have a non-zero Timeout on your http.Client, you can't use this, because of the following lines from client.go:
if !deadline.IsZero() {
resp.Body = &cancelTimerBody{
stop: stopTimer,
rc: resp.Body,
reqDidTimeout: didTimeout,
}
}
This wraps the writable body in a non-writable body.
Go version: 1.12
Observed behavior: res.Body.(io.ReadWriteCloser) fails when client.Timeout > 0.
Expected behavior: timeouts and writeable bodies are compatible.
Although we have some streaming requests, we would like to set a long (eg one hour) timeout on our requests to prevent resource exhaustion. #30876 suggests that we can't even do this manually with contexts.