on main help sign in
fix: ensure all tools work when behind a http proxy (#2065)

Replace custom `http.Transport` with cloned `DefaultTransport` to inherit proxy configuration from environment variables (`HTTP_PROXY`, `HTTPS_PROXY`, `NO_PROXY`). Affects `fetch`, `web_fetch`, `web_search`, `sourcegraph`, `download`, and `agentic_fetch` tools. Fixes enterprise environment compatibility where proxy configuration is required for external HTTP requests.

commit47f5f429313ad1ab8694daa22611272df3397ce8 authorBitToby <brianwhitedev1996@gmail.com> dateMon 2 Feb 2026, 14:55 (9 months ago) parent552fa17
6 files changed+42−36
internal/agent/agentic_fetch_tool.go+7−6 internal/agent/tools/download.go+7−6 internal/agent/tools/fetch.go+7−6 internal/agent/tools/sourcegraph.go+7−6 internal/agent/tools/web_fetch.go+7−6 internal/agent/tools/web_search.go+7−6
internal/agent/agentic_fetch_tool.go+7−6
@@ -52,13 +52,14 @@ var agenticFetchPromptTmpl []byte
5252
5353func (c *coordinator) agenticFetchTool(_ context.Context, client *http.Client) (fantasy.AgentTool, error) {
5454 if client == nil {
55+ transport := http.DefaultTransport.(*http.Transport).Clone()
56+ transport.MaxIdleConns = 100
57+ transport.MaxIdleConnsPerHost = 10
58+ transport.IdleConnTimeout = 90 * time.Second
59+
5560 client = &http.Client{
56− Timeout: 30 * time.Second,
57− Transport: &http.Transport{
58− MaxIdleConns: 100,
59− MaxIdleConnsPerHost: 10,
60− IdleConnTimeout: 90 * time.Second,
61− },
61+ Timeout: 30 * time.Second,
62+ Transport: transport,
6263 }
6364 }
6465
internal/agent/tools/download.go+7−6
@@ -36,13 +36,14 @@ var downloadDescription []byte
3636
3737func NewDownloadTool(permissions permission.Service, workingDir string, client *http.Client) fantasy.AgentTool {
3838 if client == nil {
39+ transport := http.DefaultTransport.(*http.Transport).Clone()
40+ transport.MaxIdleConns = 100
41+ transport.MaxIdleConnsPerHost = 10
42+ transport.IdleConnTimeout = 90 * time.Second
43+
3944 client = &http.Client{
40− Timeout: 5 * time.Minute, // Default 5 minute timeout for downloads
41− Transport: &http.Transport{
42− MaxIdleConns: 100,
43− MaxIdleConnsPerHost: 10,
44− IdleConnTimeout: 90 * time.Second,
45− },
45+ Timeout: 5 * time.Minute, // Default 5 minute timeout for downloads
46+ Transport: transport,
4647 }
4748 }
4849 return fantasy.NewParallelAgentTool(
internal/agent/tools/fetch.go+7−6
@@ -23,13 +23,14 @@ var fetchDescription []byte
2323
2424func NewFetchTool(permissions permission.Service, workingDir string, client *http.Client) fantasy.AgentTool {
2525 if client == nil {
26+ transport := http.DefaultTransport.(*http.Transport).Clone()
27+ transport.MaxIdleConns = 100
28+ transport.MaxIdleConnsPerHost = 10
29+ transport.IdleConnTimeout = 90 * time.Second
30+
2631 client = &http.Client{
27− Timeout: 30 * time.Second,
28− Transport: &http.Transport{
29− MaxIdleConns: 100,
30− MaxIdleConnsPerHost: 10,
31− IdleConnTimeout: 90 * time.Second,
32− },
32+ Timeout: 30 * time.Second,
33+ Transport: transport,
3334 }
3435 }
3536
internal/agent/tools/sourcegraph.go+7−6
@@ -33,13 +33,14 @@ var sourcegraphDescription []byte
3333
3434func NewSourcegraphTool(client *http.Client) fantasy.AgentTool {
3535 if client == nil {
36+ transport := http.DefaultTransport.(*http.Transport).Clone()
37+ transport.MaxIdleConns = 100
38+ transport.MaxIdleConnsPerHost = 10
39+ transport.IdleConnTimeout = 90 * time.Second
40+
3641 client = &http.Client{
37− Timeout: 30 * time.Second,
38− Transport: &http.Transport{
39− MaxIdleConns: 100,
40− MaxIdleConnsPerHost: 10,
41− IdleConnTimeout: 90 * time.Second,
42− },
42+ Timeout: 30 * time.Second,
43+ Transport: transport,
4344 }
4445 }
4546 return fantasy.NewParallelAgentTool(
internal/agent/tools/web_fetch.go+7−6
@@ -18,13 +18,14 @@ var webFetchToolDescription []byte
1818// NewWebFetchTool creates a simple web fetch tool for sub-agents (no permissions needed).
1919func NewWebFetchTool(workingDir string, client *http.Client) fantasy.AgentTool {
2020 if client == nil {
21+ transport := http.DefaultTransport.(*http.Transport).Clone()
22+ transport.MaxIdleConns = 100
23+ transport.MaxIdleConnsPerHost = 10
24+ transport.IdleConnTimeout = 90 * time.Second
25+
2126 client = &http.Client{
22− Timeout: 30 * time.Second,
23− Transport: &http.Transport{
24− MaxIdleConns: 100,
25− MaxIdleConnsPerHost: 10,
26− IdleConnTimeout: 90 * time.Second,
27− },
27+ Timeout: 30 * time.Second,
28+ Transport: transport,
2829 }
2930 }
3031
internal/agent/tools/web_search.go+7−6
@@ -16,13 +16,14 @@ var webSearchToolDescription []byte
1616// NewWebSearchTool creates a web search tool for sub-agents (no permissions needed).
1717func NewWebSearchTool(client *http.Client) fantasy.AgentTool {
1818 if client == nil {
19+ transport := http.DefaultTransport.(*http.Transport).Clone()
20+ transport.MaxIdleConns = 100
21+ transport.MaxIdleConnsPerHost = 10
22+ transport.IdleConnTimeout = 90 * time.Second
23+
1924 client = &http.Client{
20− Timeout: 30 * time.Second,
21− Transport: &http.Transport{
22− MaxIdleConns: 100,
23− MaxIdleConnsPerHost: 10,
24− IdleConnTimeout: 90 * time.Second,
25− },
25+ Timeout: 30 * time.Second,
26+ Transport: transport,
2627 }
2728 }
2829