Skip to content

ProductSupport#34: document and cover the broken HTTP-transport control channel - #7

Open
jeremydmiller wants to merge 1 commit into
mainfrom
fix/ps34-http-transport-control-channel
Open

ProductSupport#34: document and cover the broken HTTP-transport control channel#7
jeremydmiller wants to merge 1 commit into
mainfrom
fix/ps34-http-transport-control-channel

Conversation

@jeremydmiller

Copy link
Copy Markdown
Member

Companion to wolverine#3681, which fixes the underlying defect.

ProductSupport#34 came from someone following WebService.Http closely. Telemetry (service → console) worked; every console → service command failed with An invalid request URI was provided…. They were right, and the sample was wrong in two ways.

The comment was actively misleading. CritterWatchConsole/Program.cs said the named HttpClient for a service's control URL is "created on demand from the service's reported control URI". Nothing creates it. WolverineHttpTransportClient uses the outbound URI purely as an IHttpClientFactory client name and posts to that client's BaseAddress; CreateClient hands back a default client with a null BaseAddress for an unknown name. The console cannot pre-register one either — it only learns a service's control URL at runtime from that service's own registration.

Nothing tested it. The battery covered console liveness, the OrderService's own endpoints, and registration — all telemetry-direction. The control direction had no coverage at all, which is why a permanently-broken path shipped as a reference sample.

Changes

  • The console comment and the README now describe the real behaviour, name the upstream fix, and say exactly what to delete after the bump (the two manual registration lines — AddWolverineHttp() will register them).
  • A new test, console_control_channel_sends_without_transport_errors.

The test asserts on the console's own logs rather than driving an operator command: operator commands travel CritterWatch's SignalR hub and this harness has no SignalR client. That is weaker than a true end-to-end command, and I would rather say so than dress it up — but it does pin this defect, because the console pushes to a registered service unprompted, so a broken send surfaces as BufferedSendingAgent failures with no operator action at all. That is precisely how the reporter found it.

It is skipped, on purpose

[Fact(Skip = …)], because it legitimately fails on the pinned WolverineFx 6.23.1 — the control channel really is broken there. Un-skipping is part of the Wolverine bump; the README and the skip reason both say so.

🤖 Generated with Claude Code

https://claude.ai/code/session_01U6rL8dGQMMh9xNYtP9R9jP

…ol channel

This sample's battery only ever exercised telemetry (service → console). The
control direction (console → service) has never worked on the pinned Wolverine,
and nothing here noticed — which is how a reporter followed this sample closely
and hit a wall.

The console's comment was actively misleading. It said the named HttpClient for
a service's control URL is "created on demand from the service's reported
control URI". Nothing creates it. WolverineHttpTransportClient uses the outbound
URI purely as an IHttpClientFactory client NAME and posts to that client's
BaseAddress; CreateClient returns a default client with a null BaseAddress for
an unknown name, so the send throws "An invalid request URI was provided…". The
console cannot pre-register the client either — it only learns a service's
control URL at runtime from that service's own registration.

Fixed upstream in wolverine#3681 (GH-3690). Here: the comment and README now say
what actually happens and what to delete after the bump, and there is a test
that would have caught it. The test asserts on the console's own logs rather
than driving an operator command, because operator commands travel CritterWatch's
SignalR hub and this harness has no SignalR client — but it still pins the
defect, since the console pushes to a registered service unprompted and a broken
send shows up with no operator action at all.

It is [Fact(Skip)] because it legitimately fails on the pinned WolverineFx
6.23.1. Un-skip with the bump; both the README and the skip reason say so.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U6rL8dGQMMh9xNYtP9R9jP
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant