gofiber/fiber · error

client: invalid proxy URL

Error message

client: invalid proxy URL: %w

What it means

SetProxyURL builds a fasthttpproxy dialer from the supplied URL and returns this error when GetDialFunc rejects it. The cause is the underlying proxy parse error (bad scheme, unresolvable host, invalid port, unsupported scheme).

Solutions

  1. Prefix the proxy URL with a supported scheme (http://, https://, socks5://).
  2. Trim and validate the URL with url.Parse before calling SetProxyURL; reject empty values.
  3. Log the wrapped cause — it names the exact parse failure (scheme/port/host).

Example fix

// before
if err := c.SetProxyURL(os.Getenv("HTTP_PROXY")); err != nil { ... }

// after
proxy := strings.TrimSpace(os.Getenv("HTTP_PROXY"))
if _, err := url.Parse(proxy); err != nil {
    return fmt.Errorf("bad HTTP_PROXY: %w", err)
}
if err := c.SetProxyURL(proxy); err != nil { ... }
Defensive patterns

Strategy: validation

Validate before calling

proxy := strings.TrimSpace(os.Getenv("HTTP_PROXY"))
if proxy == "" { /* proceed without proxy */ }
u, err := url.Parse(proxy)
if err != nil || (u.Scheme != "http" && u.Scheme != "https" && u.Scheme != "socks5") {
    return fmt.Errorf("invalid proxy URL %q", proxy)
}
return c.SetProxyURL(proxy)

Try / catch

if err := c.SetProxyURL(proxy); err != nil {
    return fmt.Errorf("startup config: bad proxy: %w", err)
}

Prevention

When it happens

Trigger: Calling client.SetProxyURL with a malformed string: missing scheme ("127.0.0.1:1080"), unsupported scheme ("socks5://" when fasthttpproxy cannot configure it), empty string in some configs, or a URL with invalid characters.

Common situations: Reading the proxy URL from an env var that is unset or has stray whitespace; a config typo; switching from HTTP to SOCKS proxy without the right scheme prefix; copy-pasting a cURL-style proxy string.

Related errors


AI-assisted analysis of gofiber/fiber@a105acad6c (2026-08-11). Data as JSON: /api/errors/106fb3c8f02c32c2. Report an issue: GitHub.

Appendix: source

Thrown at client/client.go:369

		c.logger.Panicf("client: %v", ErrFailedToAppendCert)
	}

	return c
}

// SetProxyURL sets the proxy URL for the client. This affects all subsequent requests.
func (c *Client) SetProxyURL(proxyURL string) error {
	c.mu.Lock()
	defer c.mu.Unlock()

	// Build the fasthttp proxy dialer directly so invalid proxy URLs are returned
	// to callers instead of being swallowed by FasthttpHTTPDialer.
	dialer := fasthttpproxy.Dialer{
		Config: httpproxy.Config{HTTPProxy: proxyURL, HTTPSProxy: proxyURL},
	}
	dialFunc, err := dialer.GetDialFunc(false)
	if err != nil {
		return fmt.Errorf("client: invalid proxy URL: %w", err)
	}
	c.applyDial(dialFunc)
	return nil
}

// RetryConfig returns a copy of the current retry configuration.
func (c *Client) RetryConfig() *RetryConfig {
	c.mu.RLock()
	defer c.mu.RUnlock()

	if c.retryConfig == nil {
		return nil
	}

	cfg := *c.retryConfig
	return &cfg
}

View on GitHub (pinned to a105acad6c)