fix(signal): preserve reverse-proxy path prefixes#110495
Conversation
|
Codex review: needs maintainer review before merge. Reviewed July 18, 2026, 10:15 AM ET / 14:15 UTC. Summary PR surface: Source +5, Tests +52. Total +57 across 2 files. Reproducibility: yes. at source level: resolving an absolute Review metrics: none identified. Stored data model Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Next step before merge
Security Review detailsBest possible solution: Land the focused native Signal URL repair after ordinary assigned-owner review, retaining the three endpoint regression tests and reverse-proxy behavior proof. Do we have a high-confidence way to reproduce the issue? Yes, at source level: resolving an absolute Is this the best way to solve the issue? Yes. Preserving the parsed native-client base pathname in the shared endpoint resolver is the narrowest maintainable fix because it repairs RPC, health-check, and SSE callers without changing container-mode construction. AGENTS.md: unclear because the file could not be read completely. Codex review notes: model internal, reasoning high; reviewed against 3f976a949ad3. Label changesLabel justifications:
Evidence reviewedPR surface: Source +5, Tests +52. Total +57 across 2 files. View PR surface stats
What I checked:
Likely related people:
What the crustacean ranks mean
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics. How this review workflow works
Review history (16 earlier review cycles; latest 8 shown)
|
|
Updated the PR body with the requested real behavior proof. The new Evidence section includes a redacted live terminal transcript for: It shows the current-main URL shape being rejected outside the @clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
c8ccdce to
2d83df1
Compare
48f5d7b to
cf85f38
Compare
1cf8763 to
f4e3f06
Compare
f4e3f06 to
8f65d39
Compare
Co-authored-by: VectorPeak <[email protected]>
8f65d39 to
c4517a9
Compare
|
Merged via squash.
|
Co-authored-by: Peter Steinberger <[email protected]>
What Problem This Solves
Fixes an issue where users running the native Signal channel behind a reverse proxy path prefix, such as
http://127.0.0.1:8080/signal, would still send RPC, health-check, and SSE requests to the origin root (/api/v1/...) instead of the configured prefix (/signal/api/v1/...).That can make Signal send/check/receive flows fail with 404s even though
channels.signal.httpUrlpoints at the correct mounted Signal service.Why This Change Was Made
resolveSignalEndpointUrlnow keeps the parsed base URL pathname before appending the Signal native endpoint suffix. Root-mounted base URLs keep the existing/api/v1/...behavior, while path-prefixed base URLs now resolve beneath the configured prefix.The change is limited to the native Signal client URL join helper. Container-mode Signal URL construction is separate and already preserves its configured path prefix, so it is intentionally unchanged.
User Impact
Operators can run the native Signal HTTP/SSE API behind a path-prefixed reverse proxy and use the same configured
httpUrlfor sends, health checks, and event streaming.Evidence
Live reverse-proxy behavior proof
I ran the current PR head against a local path-prefixed reverse-proxy setup:
This proof does not use a private Signal account or credentials. It validates the deployment behavior changed by this PR: the native OpenClaw Signal client preserves the configured
httpUrlpathname before sending RPC, health-check, and SSE requests.Focused tests
Focused behavior covered in tests:
http://server/signal/resolves to/signal/api/v1/rpc.http://server/signalresolves to/signal/api/v1/check.http://server/signalresolves to/signal/api/v1/events?account=....Local validation:
pnpm check:changedwas also attempted locally, but it did not reach repository checks because the localcrabboxbinary failed its basic--version/--helpsanity check before dispatching Blacksmith Testbox.Remote CI note: the PR's own
extensions/signal/src/client.test.tsshard passed on GitHub. The current redchecks-node-changed-*jobs fail in existing Signal monitor harness tests that do not execute this URL helper; those failures are tracked separately from this path-prefix proof.Open PR overlap checked with
gh search prsforsignal baseUrl path prefix,resolveSignalEndpointUrl, andsignal reverse proxy path; no matching open PR was found.Prepared with AI assistance; the commit includes the verified Codex bot co-author trailer.