Closed
Description
This is pulling #60041 (comment) out into a separate issue.
Reproduction case:
package tmpgbudljeu3i_test
import (
"bufio"
"bytes"
"fmt"
"io"
"net/http"
"net/http/httptest"
"testing"
)
func writeChunk(w io.Writer, b []byte) {
fmt.Fprintf(w, "%x\r\n", len(b))
w.Write(b)
fmt.Fprint(w, "\r\n")
}
func startRequestGenerator(url string) io.ReadCloser {
r, w := io.Pipe()
chunk := bytes.Repeat([]byte("A"), 64)
go func() {
for {
_, err := fmt.Fprintf(w, "POST %s HTTP/1.1\r\n", url)
if err != nil {
return
}
fmt.Fprint(w, "Host: localhost\r\n")
fmt.Fprint(w, "Transfer-Encoding: chunked\r\n")
fmt.Fprint(w, "\r\n")
writeChunk(w, chunk)
writeChunk(w, nil)
}
}()
return r
}
func TestHTTPRace(t *testing.T) {
svr := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// cause cs.abortRequestBodyWrite()
// https://github.com/golang/go/blob/go1.20.6/src/net/http/h2_bundle.go#L8205-L8216
w.WriteHeader(http.StatusBadRequest)
}))
svr.EnableHTTP2 = true
svr.StartTLS()
r := startRequestGenerator("https://" + svr.Listener.Addr().String() + "/")
defer r.Close()
b := bufio.NewReader(r)
for i := 0; i < 3; i++ {
req, err := http.ReadRequest(b)
if err != nil {
t.Fatal(err)
}
req.RequestURI = ""
_, err = svr.Client().Transport.RoundTrip(req)
if err != nil {
t.Log(err)
}
}
}