package mcpclient import ( "flag" "net/http" ) func httpClientWithHeaders(headers map[string]string) *http.Client { base := http.DefaultTransport if isolated := mcpHTTPClient(); isolated != nil { base = isolated.Transport } if len(headers) == 0 { return &http.Client{Transport: base} } return &http.Client{Transport: &headerRoundTripper{ base: base, headers: headers, }} } type headerRoundTripper struct { base http.RoundTripper headers map[string]string } func (h *headerRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { clone := req.Clone(req.Context()) for k, v := range h.headers { clone.Header.Set(k, v) } return h.base.RoundTrip(clone) } // mcpHTTPClient returns an isolated *http.Client when running // inside tests, or nil for production. During tests, // httptest.Server.Close() calls // http.DefaultTransport.CloseIdleConnections(), which disrupts // any MCP client sharing that transport. When DefaultTransport // is a *http.Transport it is cloned; otherwise a minimal // transport with ProxyFromEnvironment is created as a fallback. func mcpHTTPClient() *http.Client { if flag.Lookup("test.v") == nil { return nil } if dt, ok := http.DefaultTransport.(*http.Transport); ok { return &http.Client{Transport: dt.Clone()} } return &http.Client{Transport: &http.Transport{ Proxy: http.ProxyFromEnvironment, }} }