chenhg5/cc-connect · error

download file %s: %w

Error message

download file %s: %w

What it means

Returned when the HTTP GET to the Telegram file download URL (built from FileDownloadLink) fails at the transport level. The getFile step succeeded and a link was produced, but the actual byte transfer could not be performed or completed.

Source

Thrown at platform/telegram/telegram.go:1362

func (p *Platform) downloadFile(fileID string) ([]byte, error) {
	bot, err := p.connectedBot("download file")
	if err != nil {
		return nil, err
	}
	ctx := context.Background()
	f, err := bot.GetFile(ctx, &tgbot.GetFileParams{FileID: fileID})
	if err != nil {
		return nil, fmt.Errorf("get file: %w", err)
	}
	if f.FilePath == "" {
		return nil, fmt.Errorf("get file: empty file_path returned for file_id %s", fileID)
	}
	link := bot.FileDownloadLink(f)

	resp, err := p.httpClient.Get(link)
	if err != nil {
		return nil, fmt.Errorf("download file %s: %w", fileID, err)
	}
	defer resp.Body.Close()
	if resp.StatusCode != http.StatusOK {
		return nil, fmt.Errorf("download file %s: status %d", fileID, resp.StatusCode)
	}
	return io.ReadAll(resp.Body)
}

func (p *Platform) ReconstructReplyCtx(sessionKey string) (any, error) {
	// Formats:
	//   telegram:{chatID}                      - shared session, no topic
	//   telegram:{chatID}:{threadID}           - shared session, with topic
	//   telegram:{chatID}:{userID}             - per-user session, no topic
	//   telegram:{chatID}:{threadID}:{userID}  - per-user session, with topic
	parts := strings.SplitN(sessionKey, ":", 5)
	if len(parts) < 2 || parts[0] != "telegram" {
		return nil, fmt.Errorf("telegram: invalid session key %q", sessionKey)
	}

View on GitHub (pinned to 4000b2338a)

Solutions

  1. Check outbound network/DNS from the host running the bot; ensure api.telegram.org is reachable.
  2. Increase p.httpClient Timeout for large media downloads.
  3. Configure an HTTP proxy if Telegram is blocked in the deployment region.
  4. Retry with backoff on transient transport errors.

Example fix

// before
p.httpClient = &http.Client{}
// after: longer timeout for file downloads
p.httpClient = &http.Client{Timeout: 120 * time.Second}
Defensive patterns

Strategy: retry

Validate before calling

// preflight connectivity
resp, err := p.httpClient.Get("https://api.telegram.org")
if err != nil { /* network unavailable */ }

Try / catch

resp, err := p.httpClient.Get(link)
if err != nil {
    if errors.Is(err, context.DeadlineExceeded) { /* increase timeout */ }
    return nil, fmt.Errorf("download file %s: %w", fileID, err)
}

Prevention

When it happens

Trigger: p.httpClient.Get(link) returns a non-nil err: DNS failure, connection refused/reset, TLS error, timeout, or context cancellation while downloading from the file host.

Common situations: Outbound network restrictions in containerized deployments; long downloads hitting the http.Client timeout; api.telegram.org blocked in the host region (common where Telegram is filtered); transient server resets.

Related errors


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