ek9_query_service_routes

Answers first: status, programState, routeCount, byService, then routes[] {verb, uri, fullPath, parameters with binding + sanitized, securityGate, cors, auditWarnings} and summary counts.

Category: Enquiry · Compare: EK9 IDE — "Service Routes" diagram (bottom pane): services → routes → params with per-node click-to-source, security gate / CORS shown as cross-file jump targets, unsanitized-input and unguarded-route findings highlighted

When to use it

'What is the HTTP attack surface - every route, its inputs, which are unsanitized or unguarded' is one call, no arguments; verb/service/uri/audit narrow it.

When not to use it

Details

status ok | empty (empty = no 'defines service' blocks, or filters matched nothing); needs a prior ek9_compile. parameters[].binding is UPPERCASE (PATH/QUERY/HEADER/CONTENT/REQUEST/CONTEXT); securityGate/cors are the declaring FUNCTION reference {name,fqn,file,line} (usually another file) — the compiler stores only the reference, null = unguarded / no CORS. auditWarnings flags unsanitized-{query,header,content} (PATH excluded, template-constrained) and unguarded-route; reuses the compiler's own ServiceMetadataExtractor, so the inventory never diverges from generated routing.

Arguments

ArgumentTypeRequiredWhat it is
auditstring: all | unsanitized | unguardedAudit-level filter: all (default), unsanitized (routes with >=1 un-sanitized input parameter), unguarded (routes without a security gate).
servicestringOptional service-name SUBSTRING filter ('Order' matches OrderService).
uristringOptional fullPath SUBSTRING filter ('/addresses' matches every route under it).
verbstring: all | GET | POST | PUT | DELETE | PATCH | HEAD | OPTIONSFilter by HTTP verb (default all).

Recorded calls

Real calls, recorded against small projects and checked on every build - a changed answer fails it.

Inventory

Request

{ }

Response

{
  "byService" : {
    "CachedService" : 1,
    "ClockService" : 1,
    "CorsService" : 1,
    "LookupService" : 2,
    "OrderService" : 4,
    "PublicService" : 1,
    "ReportService" : 6
  },
  "meta" : {
    "serverMs" : "<timing>"
  },
  "programState" : "clean",
  "routeCount" : 16,
  "routes" : [ {
    "anySanitized" : false,
    "auditCompliant" : true,
    "auth" : {
      "explicitlyOpen" : false,
      "guarded" : true,
      "source" : "service"
    },
    "baseUri" : "/api/cached",
...

Cut short here: 646 more lines. The whole recorded call.