aboutsummaryrefslogtreecommitdiff
path: root/src/net/http/httputil/reverseproxy_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/http/httputil/reverseproxy_test.go')
-rw-r--r--src/net/http/httputil/reverseproxy_test.go38
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)