JuliusBrussee/caveman · error
rewriter: %s: %w
Error message
rewriter: %s: %w
What it means
Client.do's injected doer returned a transport-level error while executing the rewriter provider request (connection refused, timeout, DNS failure, TLS error). The message wraps the underlying error and names the endpoint so transport faults are distinguishable from decode or status errors.
Source
Thrown at rewriter/provider.go:188
}
func (c *Client) do(ctx context.Context, endpoint string, body map[string]any, headers map[string]string) ([]byte, error) {
encoded, err := json.Marshal(body)
if err != nil {
return nil, fmt.Errorf("rewriter: encode request: %w", err)
}
req, err := http.NewRequestWithContext(ctx, http.MethodPost, endpoint, bytes.NewReader(encoded))
if err != nil {
return nil, fmt.Errorf("rewriter: build request: %w", err)
}
req.Header.Set("content-type", "application/json")
for key, value := range headers {
req.Header.Set(key, value)
}
resp, err := c.doer(req)
if err != nil {
return nil, fmt.Errorf("rewriter: %s: %w", endpoint, err)
}
// An injected doer is caller code; a nil response or body must surface as an
// error rather than a panic inside the proxy hot path.
if resp == nil {
return nil, fmt.Errorf("rewriter: %s: nil response", endpoint)
}
if resp.Body == nil {
resp.Body = http.NoBody
}
defer resp.Body.Close()
if resp.StatusCode < 200 || resp.StatusCode > 299 {
detail, _ := io.ReadAll(io.LimitReader(resp.Body, maxErrorBody))
return nil, fmt.Errorf("rewriter: %s: status %d: %s", endpoint, resp.StatusCode, strings.TrimSpace(string(detail)))
}
raw, err := io.ReadAll(io.LimitReader(resp.Body, maxProviderResponseBody+1))
if err != nil {
return nil, fmt.Errorf("rewriter: read response: %w", err)View on GitHub (pinned to 766dce6b13)
Solutions
- Retry with backoff; transient network failures are expected
- Check network reachability and TLS configuration for the provider endpoint
- Treat persistent failure as provider unavailability and skip the rewrite (the gate records api_error)
Defensive patterns
Strategy: retry
When it happens
Trigger: Thrown at rewriter/provider.go:188 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of JuliusBrussee/caveman@766dce6b13 (2026-08-18).
Data as JSON: /api/errors/a3224109cbc1b156.
Report an issue: GitHub.