Tencent/WeKnora · error

execute request

Error message

execute request: %w

What it means

doRequest wraps errors from c.httpClient.Do(req) as "execute request: %w". This is the transport layer failing: DNS resolution failure, TCP connect refused/timeout, TLS handshake error, or request cancellation via context. The client retries with backoff up to maxRetries before returning the last error.

Solutions

  1. Test outbound connectivity to the Yuque API from the host: curl -v https://www.yuque.com/api/v2.
  2. Configure proxy environment variables (HTTPS_PROXY) if the network requires one, or fix firewall/egress rules.
  3. Check DNS resolution inside the container/host (nslookup www.yuque.com).
  4. If context canceled, extend the request timeout or investigate why the caller's context was canceled.
  5. Retry later if it's a transient Yuque outage — the client already retries with backoff.

Example fix

// before (no proxy support, blocked network)
client := &http.Client{Timeout: 10 * time.Second}
// after
proxy := http.ProxyFromEnvironment
transport := &http.Transport{Proxy: proxy, TLSHandshakeTimeout: 10 * time.Second}
client := &http.Client{Transport: transport, Timeout: 30 * time.Second}
Defensive patterns

Strategy: retry

Validate before calling

conn, err := net.DialTimeout("tcp", "www.yuque.com:443", 5*time.Second)
if err != nil {
    return fmt.Errorf("Yuque API unreachable: %v", err)
}
conn.Close()

Type guard

func isTransportError(err error) bool {
    var ne net.Error
    return errors.As(err, &ne) || strings.Contains(err.Error(), "execute request:")
}

Try / catch

err := client.GetCurrentUser(ctx)
if err != nil && strings.HasPrefix(err.Error(), "execute request:") {
    if errors.Is(ctx.Err(), context.DeadlineExceeded) {
        // increase timeout and retry once
    }
    return err
}

Prevention

When it happens

Trigger: Network unreachable from the host running the connector; Yuque API temporarily down or blocked by firewall/proxy; DNS not resolving www.yuque.com; context canceled (client disconnect, shutdown, deadline) mid-request.

Common situations: Deploying in an environment without outbound internet or behind a corporate proxy that isn't configured (missing HTTPS_PROXY); DNS failures in containers; transient Yuque outages; request deadlines too short.

Related errors


AI-assisted analysis of Tencent/WeKnora@988cbb0330 (2026-09-02). Data as JSON: /api/errors/9af98c801bb9cadd. Report an issue: GitHub.

Appendix: source

Thrown at internal/datasource/connector/yuque/client.go:78

	for attempt := 0; attempt <= maxRetries; attempt++ {
		reqURL := c.baseURL + path
		req, err := http.NewRequestWithContext(ctx, method, reqURL, nil)
		if err != nil {
			return fmt.Errorf("create request: %w", err)
		}
		req.Header.Set("X-Auth-Token", c.token)
		req.Header.Set("User-Agent", userAgent)
		req.Header.Set("Content-Type", "application/json; charset=utf-8")

		if attempt == 0 {
			logger.Infof(ctx, "[Yuque] %s %s", method, path)
		} else {
			logger.Infof(ctx, "[Yuque] %s %s (retry %d/%d)", method, path, attempt, maxRetries)
		}

		resp, err := c.httpClient.Do(req)
		if err != nil {
			lastErr = fmt.Errorf("execute request: %w", err)
			if attempt < maxRetries {
				if sErr := sleepCtx(ctx, backoff[attempt]); sErr != nil {
					return sErr
				}
				continue
			}
			return lastErr
		}

		body, readErr := io.ReadAll(resp.Body)
		resp.Body.Close()
		if readErr != nil {
			lastErr = fmt.Errorf("read response body: %w", readErr)
			if attempt < maxRetries {
				if sErr := sleepCtx(ctx, backoff[attempt]); sErr != nil {
					return sErr
				}
				continue

View on GitHub (pinned to 988cbb0330)