chenhg5/cc-connect · error

request failed: %w

Error message

request failed: %w

What it means

fetchLatestPreRelease wraps any error from the HTTP client's Do() call with "request failed: %w". It means the GET request to the GitHub releases API failed at the transport level: DNS resolution, TCP connect, TLS, or the 15s timeout. It is not an HTTP status error — non-200 responses produce a different error.

Source

Thrown at cmd/cc-connect/update.go:224

}

// fetchRelease returns the latest release. If pre=true, includes pre-releases.
func fetchRelease(pre bool) (*githubRelease, error) {
	if pre {
		return fetchLatestPreRelease()
	}
	return fetchLatestStableRelease()
}

// fetchLatestPreRelease fetches the newest release (including pre-releases) from GitHub.
func fetchLatestPreRelease() (*githubRelease, error) {
	client := &http.Client{Timeout: 15 * time.Second}
	req, _ := http.NewRequest("GET", githubAllAPI+"?per_page=10", nil)
	req.Header.Set("Accept", "application/vnd.github.v3+json")

	resp, err := client.Do(req)
	if err != nil {
		return nil, fmt.Errorf("request failed: %w", err)
	}
	defer resp.Body.Close()

	if resp.StatusCode != 200 {
		return nil, fmt.Errorf("GitHub API returned HTTP %d", resp.StatusCode)
	}

	var releases []githubRelease
	if err := json.NewDecoder(resp.Body).Decode(&releases); err != nil {
		return nil, fmt.Errorf("parse releases: %w", err)
	}

	if len(releases) == 0 {
		return nil, fmt.Errorf("no releases found")
	}

	// Return the first (newest) release, which may be a pre-release
	return &releases[0], nil

View on GitHub (pinned to 4000b2338a)

Solutions

  1. Check basic connectivity: curl -v https://api.github.com/repos/<owner>/<repo>/releases?per_page=10
  2. If behind a proxy, set HTTPS_PROXY correctly for the process running cc-connect
  3. Retry the update — transient network blips and GitHub brownouts are common
  4. If timeouts persist, check firewall/DNS rules for api.github.com (or corporate blocking)
  5. Run `cc-connect doctor` or equivalent network diagnostics if available

Example fix

// before
client := &http.Client{Timeout: 15 * time.Second}
// after
client := &http.Client{Timeout: 60 * time.Second} // tolerate slow networks
for attempt := 0; attempt < 3; attempt++ {
    resp, err := client.Do(req)
    if err == nil { break }
    time.Sleep(time.Duration(attempt+1) * time.Second)
}
Defensive patterns

Strategy: retry

Validate before calling

// before calling update, verify reachability:
conn, err := net.DialTimeout("tcp", "api.github.com:443", 5*time.Second)
if err != nil { return fmt.Errorf("GitHub unreachable: %w", err) }
conn.Close()

Try / catch

// Go: inspect the wrapped error and retry with backoff
if _, err := fetchRelease(); err != nil {
    if strings.Contains(err.Error(), "request failed") {
        var dnsErr *net.DNSError
        if errors.As(err, &dnsErr) {
            // DNS failure — check resolver/proxy
        }
        // otherwise transient: retry with backoff
    }
}

Prevention

When it happens

Trigger: client.Do(req) in fetchLatestPreRelease returns a non-nil error: unreachable network, DNS failure for api.github.com, TLS problems, proxy misconfiguration, or the 15-second client timeout firing on a slow connection.

Common situations: Developer running `cc-connect update` (which calls fetchRelease) offline or behind a corporate proxy that blocks api.github.com; DNS misconfiguration in containers/VMs; slow networks hitting the 15s http.Client timeout; IPv6 issues; firewall dropping outbound 443.

Understand the failure class

Background: 'Something went wrong' / 'Request failed (500)' / 'HTTP error! status: 404' — what failed HTTP requests actually mean and how to find the real cause — this error's family across 28 libraries.

Related errors


AI-assisted analysis of chenhg5/cc-connect@4000b2338a (2026-09-06). Data as JSON: /api/errors/7e4f2b250dd21fbc. Report an issue: GitHub.