feat(openapi): document debug endpoint rate-limit headers

Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
Virgil 2026-04-02 06:52:40 +00:00
parent 30e610686b
commit b99e445436
2 changed files with 46 additions and 6 deletions

View file

@ -919,6 +919,9 @@ func wsUpgradeHeaders() map[string]any {
}
func pprofPathItem(operationIDs map[string]int) map[string]any {
successHeaders := mergeHeaders(standardResponseHeaders(), rateLimitSuccessHeaders())
errorHeaders := mergeHeaders(standardResponseHeaders(), rateLimitSuccessHeaders())
return map[string]any{
"get": map[string]any{
"summary": "pprof index",
@ -940,7 +943,7 @@ func pprofPathItem(operationIDs map[string]int) map[string]any {
},
},
},
"headers": standardResponseHeaders(),
"headers": successHeaders,
},
"401": map[string]any{
"description": "Unauthorised",
@ -952,7 +955,7 @@ func pprofPathItem(operationIDs map[string]int) map[string]any {
},
},
},
"headers": standardResponseHeaders(),
"headers": errorHeaders,
},
"403": map[string]any{
"description": "Forbidden",
@ -964,7 +967,7 @@ func pprofPathItem(operationIDs map[string]int) map[string]any {
},
},
},
"headers": standardResponseHeaders(),
"headers": errorHeaders,
},
},
},
@ -972,6 +975,9 @@ func pprofPathItem(operationIDs map[string]int) map[string]any {
}
func expvarPathItem(operationIDs map[string]int) map[string]any {
successHeaders := mergeHeaders(standardResponseHeaders(), rateLimitSuccessHeaders())
errorHeaders := mergeHeaders(standardResponseHeaders(), rateLimitSuccessHeaders())
return map[string]any{
"get": map[string]any{
"summary": "Runtime metrics",
@ -994,7 +1000,7 @@ func expvarPathItem(operationIDs map[string]int) map[string]any {
},
},
},
"headers": standardResponseHeaders(),
"headers": successHeaders,
},
"401": map[string]any{
"description": "Unauthorised",
@ -1006,7 +1012,7 @@ func expvarPathItem(operationIDs map[string]int) map[string]any {
},
},
},
"headers": standardResponseHeaders(),
"headers": errorHeaders,
},
"403": map[string]any{
"description": "Forbidden",
@ -1018,7 +1024,7 @@ func expvarPathItem(operationIDs map[string]int) map[string]any {
},
},
},
"headers": standardResponseHeaders(),
"headers": errorHeaders,
},
},
},

View file

@ -2485,3 +2485,37 @@ func TestSpecBuilder_Good_ServersCollapseTrailingSlashes(t *testing.T) {
t.Fatalf("expected second server url=%q, got %v", "/api", second["url"])
}
}
func TestSpecBuilder_Good_RuntimeDebugEndpointsDocumentRateLimitHeaders(t *testing.T) {
sb := &api.SpecBuilder{
Title: "Test",
Version: "1.0.0",
PprofEnabled: true,
ExpvarEnabled: true,
}
data, err := sb.Build(nil)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
var spec map[string]any
if err := json.Unmarshal(data, &spec); err != nil {
t.Fatalf("invalid JSON: %v", err)
}
paths := spec["paths"].(map[string]any)
for _, path := range []string{"/debug/pprof", "/debug/vars"} {
item := paths[path].(map[string]any)
op := item["get"].(map[string]any)
for _, code := range []string{"200", "401", "403"} {
resp := op["responses"].(map[string]any)[code].(map[string]any)
headers := resp["headers"].(map[string]any)
for _, name := range []string{"X-Request-ID", "X-RateLimit-Limit", "X-RateLimit-Remaining", "X-RateLimit-Reset"} {
if _, ok := headers[name]; !ok {
t.Fatalf("expected %s header on %s %s response", name, path, code)
}
}
}
}
}