Skip to content

feat(errors): expose Retry-After seconds on rate-limit errors - #105

Merged
Domantas merged 3 commits into
mainfrom
feat/retry-after
Oct 21, 2026
Merged

Domantas merged 3 commits into
mainfrom
feat/retry-after

Conversation

@Domantas

Copy link
Copy Markdown
Contributor

NorbixException gains RetryAfterSeconds (int?): HttpTransport reads the answer's Retry-After header (delta seconds, or the seconds until an HTTP date, never below 0; null when absent or unreadable) and passes it to the exception. Additive: the constructor takes it as an optional last parameter. A 429 CM-ERRORS-LOGGING-003 from WriteLogsAsync now tells the caller how long to wait. README Error Handling + logs row updated ("wait a minute" → RetryAfterSeconds).

Tests: dotnet test Norbix.Sdk.sln -p:NuGetAudit=false — Sdk 109/109, Hub 260/260, Coexistence 2/2 (6 new: 429 + Retry-After: 37 → 37 and one POST /logs; HTTP date; past date → 0; no header → null; unreadable → null; 500 → null).

Expected release: v3.28.0 (feat → minor).

🤖 Generated with Claude Code

Domantas and others added 3 commits October 21, 2026 21:46
NorbixException gains RetryAfterSeconds (int?), read by HttpTransport from the
answer's Retry-After header (delta seconds, or seconds until an HTTP date,
never below 0; null when absent or unreadable). The constructor takes it as an
optional last parameter, so existing callers compile.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The fake handler can now add response headers. 429 with Retry-After: 37 gives
37 with CM-ERRORS-LOGGING-003 and one POST /logs; an HTTP date gives the
seconds until it (a past date gives 0); no header, an unreadable header and a
500 give null.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

🚀 Release preview

Next version on merge to main: none

semantic-release dry-run output
[6:47:04 PM] [semantic-release] › ℹ  Running semantic-release version 25.0.9
[6:47:05 PM] [semantic-release] › ✔  Loaded plugin "verifyConditions" from "@semantic-release/exec"
[6:47:05 PM] [semantic-release] › ✔  Loaded plugin "verifyConditions" from "@semantic-release/github"
[6:47:05 PM] [semantic-release] › ✔  Loaded plugin "analyzeCommits" from "@semantic-release/commit-analyzer"
[6:47:05 PM] [semantic-release] › ✔  Loaded plugin "analyzeCommits" from "@semantic-release/exec"
[6:47:05 PM] [semantic-release] › ✔  Loaded plugin "verifyRelease" from "@semantic-release/exec"
[6:47:05 PM] [semantic-release] › ✔  Loaded plugin "generateNotes" from "@semantic-release/release-notes-generator"
[6:47:05 PM] [semantic-release] › ✔  Loaded plugin "generateNotes" from "@semantic-release/exec"
[6:47:05 PM] [semantic-release] › ✔  Loaded plugin "prepare" from "@semantic-release/exec"
[6:47:05 PM] [semantic-release] › ✔  Loaded plugin "publish" from "@semantic-release/exec"
[6:47:05 PM] [semantic-release] › ✔  Loaded plugin "publish" from "@semantic-release/github"
[6:47:05 PM] [semantic-release] › ✔  Loaded plugin "addChannel" from "@semantic-release/exec"
[6:47:05 PM] [semantic-release] › ✔  Loaded plugin "addChannel" from "@semantic-release/github"
[6:47:05 PM] [semantic-release] › ✔  Loaded plugin "success" from "@semantic-release/exec"
[6:47:05 PM] [semantic-release] › ✔  Loaded plugin "success" from "@semantic-release/github"
[6:47:05 PM] [semantic-release] › ✔  Loaded plugin "fail" from "@semantic-release/exec"
[6:47:05 PM] [semantic-release] › ✔  Loaded plugin "fail" from "@semantic-release/github"
[6:47:06 PM] [semantic-release] › ℹ  This test run was triggered on the branch refs/pull/105/merge, while semantic-release is configured to only publish from main, therefore a new version won’t be published.

If next_version is none, your commits don't trigger a release. Use feat: for minor (breaking changes too, until launch), fix: / perf: for patch.

@Domantas
Domantas merged commit f485b22 into main Oct 21, 2026
7 checks passed
@Domantas
Domantas deleted the feat/retry-after branch October 21, 2026 18:48
@github-actions

Copy link
Copy Markdown

🎉 This PR is included in version 3.28.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant