From fa846067f8fe717726019f4694a8c5463d07b447 Mon Sep 17 00:00:00 2001 From: junevanlong Date: Tue, 16 Jun 2026 10:54:43 +0800 Subject: [PATCH] http: preserve cookie jar for TLS clients --- http/transport.go | 1 + http/transport_test.go | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/http/transport.go b/http/transport.go index 7fa03bb..9dd0067 100644 --- a/http/transport.go +++ b/http/transport.go @@ -655,6 +655,7 @@ func (ct *ClientTransport) getStdHTTPClient(caFile, certFile, } client := &stdhttp.Client{ CheckRedirect: ct.Client.CheckRedirect, + Jar: ct.Client.Jar, Timeout: ct.Client.Timeout, } if ct.http2Only { diff --git a/http/transport_test.go b/http/transport_test.go index a9af42d..e3ded21 100644 --- a/http/transport_test.go +++ b/http/transport_test.go @@ -39,6 +39,7 @@ import ( "mime/multipart" "net" "net/http" + "net/http/cookiejar" "net/http/httptest" "net/url" "os" @@ -1048,6 +1049,41 @@ func TestHTTPSSkipClientVerify(t *testing.T) { require.Equal(t, []byte(t.Name()), rsp.Data) } +func TestTLSClientInheritsCookieJar(t *testing.T) { + ts := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + http.SetCookie(w, &http.Cookie{Name: "sid", Value: "cookie-value"}) + w.WriteHeader(http.StatusOK) + })) + defer ts.Close() + + u, err := url.Parse(ts.URL) + require.NoError(t, err) + jar, err := cookiejar.New(nil) + require.NoError(t, err) + + ct := thttp.NewClientTransport(false) + ct.(*thttp.ClientTransport).Jar = jar + + ctx, msg := codec.WithNewMessage(context.Background()) + msg.WithClientRPCName("/") + msg.WithClientReqHead(&thttp.ClientReqHeader{}) + rspHeader := &thttp.ClientRspHeader{} + msg.WithClientRspHead(rspHeader) + + _, err = ct.RoundTrip(ctx, nil, + transport.WithDialAddress(u.Host), + transport.WithDialTLS("", "", "none", ""), + ) + require.NoError(t, err) + require.NotNil(t, rspHeader.Response) + defer rspHeader.Response.Body.Close() + + cookies := jar.Cookies(u) + require.Len(t, cookies, 1) + require.Equal(t, "sid", cookies[0].Name) + require.Equal(t, "cookie-value", cookies[0].Value) +} + func TestListenAndServeHTTPHead(t *testing.T) { ctx := context.Background() const (