jeessy2/ddns-go · error
Rainyun API error, code=%d
Error message
Rainyun API error, code=%d
What it means
dns/rainyun.go fallback error: when the Rainyun API returns code != 200 but the response Message field is empty, request() (used by getRecordList, createRecord, patchRecord) reports "Rainyun API error, code=%d" with the numeric code only. It exists so callers never get an empty error string.
Source
Thrown at dns/rainyun.go:260
if method == http.MethodPost || method == http.MethodPatch || method == http.MethodPut {
req.Header.Set("Content-Type", "application/json")
}
resp, err := rainyun.httpClient.Do(req)
if err != nil {
return err
}
var apiResp RainyunResp
err = util.GetHTTPResponse(resp, err, &apiResp)
if err != nil {
return err
}
if apiResp.Code != 200 {
if apiResp.Message != "" {
return fmt.Errorf("%s", apiResp.Message)
}
return fmt.Errorf("Rainyun API error, code=%d", apiResp.Code)
}
if result == nil {
return nil
}
dataBytes, err := json.Marshal(apiResp.Data)
if err != nil {
return err
}
return json.Unmarshal(dataBytes, result)
}
View on GitHub (pinned to 5874c2e666)
Solutions
- Look up the numeric code in the Rainyun API documentation
- Retry if the code is in the 5xx range; it may be transient
- Check Rainyun status page or console for ongoing incidents
- Update the library/provider SDK if the API response format changed
Example fix
// before
return fmt.Errorf("Rainyun API error, code=%d", apiResp.Code)
// after (caller: retry on transient codes)
if strings.Contains(err.Error(), "code=5") {
time.Sleep(2 * time.Second)
return provider.getRecordList(domain) // retry once
} Defensive patterns
Strategy: retry
Validate before calling
// preflight: ensure API reachable and key set
if apiKey == "" { return errors.New("rainyun: missing API key") } Type guard
// detect the code-only fallback error
func isCodeOnlyErr(err error) (code int, ok bool) {
_, e := fmt.Sscanf(errString(err), "Rainyun API error, code=%d", &code)
return code, e == nil
} Try / catch
if err != nil {
if code, ok := isCodeOnlyErr(err); ok && code >= 500 {
time.Sleep(2 * time.Second)
return retryOnce()
}
return err
} Prevention
- Retry only 5xx-style codes; fail fast on others
- Watch the Rainyun status page for incidents
- Keep the provider SDK/library updated for envelope changes
When it happens
Trigger: Any Rainyun API call whose JSON body has code != 200 and an empty Message — typically provider-side failures that omit a human-readable message (5xx-style conditions, unknown codes, malformed provider responses).
Common situations: Rainyun backend incidents returning error codes without messages; API version changes that alter the response envelope; proxy middleware stripping the JSON body.
Related errors
AI-assisted analysis of jeessy2/ddns-go@5874c2e666 (2026-09-03).
Data as JSON: /api/errors/ed4d75481bee8484.
Report an issue: GitHub.