App, Group, Operation. A group is a prefix and what holds under it, an operation
is one typed route declared there, and the verb methods are generic methods —
which Go 1.27 allows on a concrete type and still refuses on an interface. So In
and Out come from the handler and the caller writes no type arguments:
users := app.Group("/v1/users")
users.Post("/", api.Create)
mint := users.Group("/mint").With(middleware.Mint(gate))
mint.Post("/deposit", api.Deposit)
A Group is a CLOSED HANDLE: two unexported fields, and no method that hands back
the app, the parent or the fiber underneath. A subsystem given the group at its
own prefix cannot reach above it, so confinement is a property of the type
instead of a rule something has to police — which is what a host needs in order
to hand out a bounded surface and know what comes back.
That is bought by giving up the router interface, deliberately. Router and
OpTarget are gone, and with them the ability to implement a route table outside
this package: a decorator is no longer a router, a gate is middleware on a group,
and a bound is a path. The five package-level verb functions go the same way —
a registration is a method on the thing it registers into.
Raw carries what is not a typed operation: a stream, an upgrade, a probe, a
foreign subtree. It names its method, and it is the longer spelling because
opting out of the typed model is the exception and should read like one.
Co-authored-by: Hanzo Dev <[email protected]>
Two halves of one path, and fixing only the first is why the last attempt looked
right and changed nothing.
forward() overwrote the Host header with the child's dial address. A client
dials its own address and never reads that header to find the far end, so the
value was routing nothing — it was destroying the one fact a callee needs to
serve more than one brand.
zap-proto/http then dropped it again: the encoder excluded Host from the headers
slot as "frame-owned" while nothing in the frame carried a host, and the decoder
reconstructed it from the very header the encoder had removed. Every request
over the ZAP wire arrived with an empty Host. Fixed in v0.3.2, required here.
TestMountedChildSeesTheCallersHost goes through a REAL mount rather than a
stubbed client, which is what the earlier unit test missed: it built its own
request, so it never met the serialization the server path takes. It fails on
either half alone.
Co-authored-by: Hanzo Dev <[email protected]>