You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
HttpDispatcher.dispatch claims every path whose first segment merely STARTS WITH auth — /authx, /authentication/foo all answer 200 {} instead of ROUTE_NOT_FOUND #16026
Found while measuring #15928; out of that card's scope (that card narrows which 404 the adapter's /auth/* mount may yield; this is about what dispatch() claims once a request reaches it). Filed unassigned.
Boot: a real ObjectKernel with AuthPlugin, createHonoApp({ kernel, prefix: '/api/v1' }), authenticated as the dev admin, requests injected through the returned app. Every one of these misses the adapter's FIELD_PREFIX + '/auth/*' mount and lands on its terminal FIELD_PREFIX + '/*' dispatcher catch-all:
GET /api/v1/auth -> 200 {}
GET /api/v1/auth/ -> 200 {}
GET /api/v1/authx -> 200 {}
GET /api/v1/authx/foo -> 200 {}
GET /api/v1/authentication/foo -> 200 {}
GET /api/v1/aut/foo -> 404 {"success":false,"error":{"code":"ROUTE_NOT_FOUND", ...}}
GET /api/v1/zzz/foo -> 404 {"success":false,"error":{"code":"ROUTE_NOT_FOUND", ...}}
The boundary is a string prefix on the path, with no segment boundary: anything beginning /auth is claimed, anything else falls through to the honest ROUTE_NOT_FOUND envelope. /authentication/foo is not an auth path by any reading, and /authx is a plausible future namespace someone would mount.
Two things are wrong independently:
The claim is too wide. A prefix test that does not stop at a / claims sibling namespaces. ROUTE_NOT_FOUND is right for all four of the 200 rows above.
The second half is what made the #15928 defect land as 200 {} rather than as a visible error, so the two interact — but they are separate: #15928's fix stops owned 404s being handed to this catch-all, and changes nothing about what the catch-all answers for the paths that legitimately reach it. /auth/me/permissions and /auth/me/localization must keep reaching dispatch() (#4088, objectui's permission layer reads the former), so this is a question about the match and the empty body, never about removing the fallthrough.
What is NOT measured here
Which registry entry or if-branch draws the boundary. The reading above is from the wire only; the claimant was not identified in source.
Whether plugin-hono-server-fronted deployments show the same shape. Only the createHonoApp front door was measured.
Whether the 200 {} is a deliberate empty envelope for some auth sub-surface or an unintended default.
Measured, on a real boot
Found while measuring #15928; out of that card's scope (that card narrows which 404 the adapter's
/auth/*mount may yield; this is about whatdispatch()claims once a request reaches it). Filed unassigned.Boot: a real
ObjectKernelwithAuthPlugin,createHonoApp({ kernel, prefix: '/api/v1' }), authenticated as the dev admin, requests injected through the returned app. Every one of these misses the adapter'sFIELD_PREFIX + '/auth/*'mount and lands on its terminalFIELD_PREFIX + '/*'dispatcher catch-all:The boundary is a string prefix on the path, with no segment boundary: anything beginning
/authis claimed, anything else falls through to the honestROUTE_NOT_FOUNDenvelope./authentication/foois not an auth path by any reading, and/authxis a plausible future namespace someone would mount.Two things are wrong independently:
/claims sibling namespaces.ROUTE_NOT_FOUNDis right for all four of the200rows above.200 {}. An empty body under a success status is the silent-success shape — the same one A nonexistent /api/v1/auth/admin/* path answers 200 with an empty body — and three real admin endpoints are indistinguishable from it #15417 and The@objectstack/honoadapter's/auth/*mount carries the same unconditioned yield PR #15918 fixes in the plugin — a second door on the identical defect #15928 are about, reached here without any yielding at all.Scope note
The second half is what made the #15928 defect land as
200 {}rather than as a visible error, so the two interact — but they are separate: #15928's fix stops owned 404s being handed to this catch-all, and changes nothing about what the catch-all answers for the paths that legitimately reach it./auth/me/permissionsand/auth/me/localizationmust keep reachingdispatch()(#4088, objectui's permission layer reads the former), so this is a question about the match and the empty body, never about removing the fallthrough.What is NOT measured here
plugin-hono-server-fronted deployments show the same shape. Only thecreateHonoAppfront door was measured.200 {}is a deliberate empty envelope for some auth sub-surface or an unintended default.