diff options
Diffstat (limited to 'src/net/http/httputil/reverseproxy_test.go')
| -rw-r--r-- | src/net/http/httputil/reverseproxy_test.go | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/net/http/httputil/reverseproxy_test.go b/src/net/http/httputil/reverseproxy_test.go index 62c93fb261..3cca6eda99 100644 --- a/src/net/http/httputil/reverseproxy_test.go +++ b/src/net/http/httputil/reverseproxy_test.go @@ -2149,6 +2149,44 @@ func TestReverseProxyHijackCopyError(t *testing.T) { proxyHandler.ServeHTTP(rw, req) } +// https://go.dev/issue/75933. +func TestReverseProxyInvalidUpstream100ContinueDoNotHang(t *testing.T) { + proxy := ReverseProxy{ + Transport: &http.Transport{DisableKeepAlives: true, ExpectContinueTimeout: time.Second * 60}, + Director: func(request *http.Request) { + request.URL.Scheme = "http" + request.URL.Host = "doesnotexist:12345" // non-existent upstream + }, + } + handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + proxy.ServeHTTP(w, r) + }) + upstreamServer := httptest.NewServer(handler) + defer upstreamServer.Close() + + conn, err := net.Dial("tcp", upstreamServer.Listener.Addr().String()) + if err != nil { + t.Fatal(err) + } + defer conn.Close() + + requestBody := `{"test": "data"}` + initialRequest := fmt.Sprintf("POST %s/test-expect HTTP/1.1\r\n"+ + "Host: %s\r\n"+ + "Content-Type: application/json\r\n"+ + "Content-Length: %d\r\n"+ + "Expect: 100-continue\r\n"+ + "\r\n", upstreamServer.URL, upstreamServer.Listener.Addr().String(), len(requestBody)) + + if _, err := conn.Write([]byte(initialRequest)); err != nil { + log.Fatal(err) + } + buff := make([]byte, 1024) + if _, err := conn.Read(buff); err != nil { + log.Fatal(err) + } +} + type testResponseWriter struct { h http.Header writeHeader func(int) |
