From e749b3b1f72ea4acec286d0f7ed6dd511fc39033 Mon Sep 17 00:00:00 2001 From: Erik Pellizzon Date: Tue, 28 Jan 2025 23:19:11 +0100 Subject: [PATCH] Add MITM request cancel test (#644) --- proxy_test.go | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/proxy_test.go b/proxy_test.go index b200cc16..077560ce 100644 --- a/proxy_test.go +++ b/proxy_test.go @@ -22,6 +22,8 @@ import ( "time" "github.com/elazarl/goproxy" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) var ( @@ -1038,3 +1040,50 @@ func TestResponseContentLength(t *testing.T) { t.Fatalf("Wrong response Content-Length.") } } + +func TestMITMRequestCancel(t *testing.T) { + // target server + srv := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + _, _ = w.Write([]byte("hello world")) + })) + defer srv.Close() + + // proxy server + proxy := goproxy.NewProxyHttpServer() + proxy.OnRequest().HandleConnect(goproxy.AlwaysMitm) + var request *http.Request + proxy.OnRequest().DoFunc(func(req *http.Request, ctx *goproxy.ProxyCtx) (*http.Request, *http.Response) { + request = req + return req, nil + }) + proxySrv := httptest.NewServer(proxy) + defer proxySrv.Close() + + // send request + client := &http.Client{} + client.Transport = &http.Transport{ + Proxy: func(req *http.Request) (*url.URL, error) { + return url.Parse(proxySrv.URL) + }, + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + } + req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, srv.URL, nil) + require.NoError(t, err) + + resp, err := client.Do(req) + require.NoError(t, err) + + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + _ = resp.Body.Close() + + assert.Equal(t, "hello world", string(body)) + assert.NotNil(t, request) + + select { + case _, ok := <-request.Context().Done(): + assert.False(t, ok) + default: + assert.Fail(t, "request hasn't been cancelled") + } +}