{"record":{"id":"2d5113686b5b4e15","repo":"fish2018/pansou","slug":"request-failed-w-2d5113","errorCode":null,"errorMessage":"request failed: %w","messagePattern":"request failed: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"plugin/melost/melost.go","lineNumber":172,"sourceCode":"\n\tctx, cancel := context.WithTimeout(context.Background(), DefaultTimeout)\n\tdefer cancel()\n\n\treq, err := http.NewRequestWithContext(ctx, \"POST\", MelostSearchAPI, bytes.NewBuffer(jsonData))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"create request failed: %w\", err)\n\t}\n\n\treq.Header.Set(\"Content-Type\", \"application/json\")\n\treq.Header.Set(\"Accept\", \"application/json, text/plain, */*\")\n\treq.Header.Set(\"Accept-Language\", \"zh-CN,zh;q=0.9,en;q=0.8\")\n\treq.Header.Set(\"Origin\", \"https://www.melost.cn\")\n\treq.Header.Set(\"Referer\", DefaultReferer)\n\treq.Header.Set(\"User-Agent\", \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36\")\n\n\tresp, err := client.Do(req)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"request failed: %w\", err)\n\t}\n\tdefer resp.Body.Close()\n\n\tif resp.StatusCode != http.StatusOK {\n\t\treturn nil, fmt.Errorf(\"unexpected status code: %d\", resp.StatusCode)\n\t}\n\n\trespBody, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"read response failed: %w\", err)\n\t}\n\n\tvar apiResp MelostResponse\n\tif err := json.Unmarshal(respBody, &apiResp); err != nil {\n\t\treturn nil, fmt.Errorf(\"decode response failed: %w\", err)\n\t}\n\n\tif apiResp.Code != 200 {","sourceCodeStart":154,"sourceCodeEnd":190,"githubUrl":"https://github.com/fish2018/pansou/blob/beaa56133755a548ebc51b090b3816e2ae044aa6/plugin/melost/melost.go#L154-L190","documentation":"searchPage executes the POST via client.Do; any transport-level failure (connection refused, DNS resolution failure, TLS error, or context deadline exceeded from the DefaultTimeout timeout) is wrapped as \"request failed: %w\". Unlike status errors, this fires before an HTTP response is obtained.","triggerScenarios":"client.Do(req) returns an error during a page search: network unreachable, DNS failure for www.melost.cn, TLS handshake failure, connection refused/reset, or the per-request context.WithTimeout(DefaultTimeout) expiring mid-request.","commonSituations":"Deployment host has no internet access or DNS issues, a corporate proxy blocks melost.cn, the site is down or geo-blocked, or slow upstream responses exceed DefaultTimeout.","solutions":["Unwrap the error and check for context.DeadlineExceeded — if so, the timeout was hit; consider increasing DefaultTimeout","Verify network connectivity and DNS resolution of www.melost.cn from the host (curl the endpoint manually)","If behind a proxy/firewall, configure the http.Client's Transport proxy settings","Retry later if the upstream site is down; note only page-level errors are aggregated by doSearch"],"exampleFix":"// before\nresp, err := client.Do(req)\nif err != nil {\n\treturn nil, fmt.Errorf(\"request failed: %w\", err)\n}\n// after: distinguish timeout vs transport\nresp, err := client.Do(req)\nif err != nil {\n\tif errors.Is(err, context.DeadlineExceeded) {\n\t\treturn nil, fmt.Errorf(\"request timed out after %v: %w\", DefaultTimeout, err)\n\t}\n\treturn nil, fmt.Errorf(\"request failed: %w\", err)\n}","handlingStrategy":"retry","validationCode":"// resolve DNS before searching\nif _, err := net.LookupHost(\"www.melost.cn\"); err != nil {\n\treturn nil, fmt.Errorf(\"melost DNS unreachable: %w\", err)\n}","typeGuard":null,"tryCatchPattern":"resp, err := client.Do(req)\nif err != nil {\n\tif errors.Is(err, context.DeadlineExceeded) {\n\t\t// retry with longer timeout\n\t}\n\tif isTransientNetErr(err) { // connection refused/reset, EOF\n\t\t// retry with backoff\n\t}\n\treturn nil, fmt.Errorf(\"request failed: %w\", err)\n}","preventionTips":["Verify outbound connectivity/DNS on deployment hosts before running searches","Set DefaultTimeout generously relative to upstream latency","Configure proxy settings on the http.Client Transport if behind a firewall","Retry transient transport errors with exponential backoff"],"tags":["network","http","timeout","dns"],"backgroundTag":"http-request-failed","analyzedSha":"beaa56133755a548ebc51b090b3816e2ae044aa6","analyzedAt":"2026-09-07T00:31:18.025Z","contentChangedAt":"2026-09-07T00:31:18.025Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}