fish2018/pansou · error

HTTP请求失败

Error message

HTTP请求失败: %w

What it means

In fetchSearchResults, the HTTP request executed via doRequestWithRetry returned a transport-level error (connection failure, timeout, TLS error, context deadline). The error wraps the underlying cause. Even with retries, persistent network problems surface here.

Solutions

  1. Check basic connectivity: curl -v the search URL from the same host.
  2. Increase the 30-second context timeout if the upstream is slow, or tune retry count/backoff in doRequestWithRetry.
  3. Verify DNS resolution and any proxy environment variables (HTTP_PROXY/HTTPS_PROXY) are correct.
  4. Inspect the wrapped error for the specific cause (timeout vs refused vs TLS) and address accordingly.
Defensive patterns

Strategy: retry

Try / catch

results, err := plugin.SearchWithResult(ctx, opts)
if err != nil {
    var netErr net.Error
    if errors.As(err, &netErr) && netErr.Timeout() {
        // increase timeout or retry with backoff
    }
}

Prevention

When it happens

Trigger: searchImpl triggers a search and p.doRequestWithRetry exhausts its attempts — DNS failure, connection refused/reset, TLS handshake failure, or the 30-second context timeout expiring.

Common situations: Upstream host unreachable or DNS broken; firewall/proxy blocking outbound requests; site slow enough that the 30s context times out; server intermittently resetting connections so all retries fail.

Related errors


AI-assisted analysis of fish2018/pansou@beaa561337 (2026-09-07). Data as JSON: /api/errors/35d9fcda757d67bb. Report an issue: GitHub.

Appendix: source

Thrown at plugin/cyg/cyg.go:149

// fetchSearchResults 获取搜索结果列表
func (p *CygPlugin) fetchSearchResults(client *http.Client, searchURL string) ([]CygPost, error) {
	// 创建带超时的上下文
	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()

	// 创建请求对象
	req, err := http.NewRequestWithContext(ctx, "GET", searchURL, nil)
	if err != nil {
		return nil, fmt.Errorf("创建请求失败: %w", err)
	}

	// 设置请求头
	p.setRequestHeaders(req)

	// 发送请求
	resp, err := p.doRequestWithRetry(req, client)
	if err != nil {
		return nil, fmt.Errorf("HTTP请求失败: %w", err)
	}
	defer resp.Body.Close()

	// 检查状态码
	if resp.StatusCode != 200 {
		return nil, fmt.Errorf("HTTP错误状态码: %d", resp.StatusCode)
	}

	// 解析响应
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return nil, fmt.Errorf("读取响应失败: %w", err)
	}

	var posts []CygPost
	if err := json.Unmarshal(body, &posts); err != nil {
		return nil, fmt.Errorf("JSON解析失败: %w", err)
	}

View on GitHub (pinned to beaa561337)