{"record":{"id":"899d79553553ab88","repo":"nats-io/nats-server","slug":"invalid-test-subject-must-be-valid-publish-subjec","errorCode":null,"errorMessage":"invalid test subject, must be valid publish subject: %s","messagePattern":"invalid test subject, must be valid publish subject: (.+?)","errorType":"http","errorClass":null,"httpStatus":400,"severity":"error","filePath":"server/monitor.go","lineNumber":1033,"sourceCode":"\t\tfilterAcc string\n\t\tlimit     = DefaultSubListSize\n\t)\n\n\tif opts != nil {\n\t\tsubdetail = opts.Subscriptions\n\t\toffset = opts.Offset\n\t\tif offset < 0 {\n\t\t\toffset = 0\n\t\t}\n\t\tlimit = opts.Limit\n\t\tif limit <= 0 {\n\t\t\tlimit = DefaultSubListSize\n\t\t}\n\t\tif opts.Test != _EMPTY_ {\n\t\t\ttestSub = opts.Test\n\t\t\ttest = true\n\t\t\tif !IsValidLiteralSubject(testSub) {\n\t\t\t\treturn nil, fmt.Errorf(\"invalid test subject, must be valid publish subject: %s\", testSub)\n\t\t\t}\n\t\t}\n\t\tif opts.Account != _EMPTY_ {\n\t\t\tfilterAcc = opts.Account\n\t\t}\n\t}\n\n\tslStats := &SublistStats{}\n\n\t// FIXME(dlc) - Make account aware.\n\tsz := &Subsz{\n\t\tID:           s.info.ID,\n\t\tNow:          time.Now().UTC(),\n\t\tSublistStats: slStats,\n\t\tTotal:        0,\n\t\tOffset:       offset,\n\t\tLimit:        limit,\n\t\tSubs:         nil,","sourceCodeStart":1015,"sourceCodeEnd":1051,"githubUrl":"https://github.com/nats-io/nats-server/blob/3a66a489d262bf89b71a71c955c94920394532f3/server/monitor.go#L1015-L1051","documentation":"Subsz rejects the Test option when the provided subject is not a valid publish (literal, no wildcard) subject. The test filter matches connections whose subscriptions would receive a message published to this subject, so only concrete literal subjects are accepted.","triggerScenarios":"Calling Subsz with ConnzOptions.Test set to a subject containing wildcards (foo.*.bar, foo.>) or otherwise failing IsValidLiteralSubject; requesting /subsz?test=foo.*.","commonSituations":"Building subscription inspection tools where users type wildcard patterns into the test field; reusing subscription subjects (which may contain wildcards) as test subjects.","solutions":["Pass a fully concrete subject with no * or > tokens: test=foo.bar.baz","Pre-validate with server.IsValidLiteralSubject(subject) before calling Subsz","If users need wildcard matching of subscriptions, present the returned subscription list and filter client-side instead"],"exampleFix":"// before\nsubs, err := s.Subsz(&server.ConnzOptions{Test: \"foo.*.bar\"})\n// after\nsubs, err := s.Subsz(&server.ConnzOptions{Test: \"foo.baz.bar\"})","handlingStrategy":"validation","validationCode":"if !server.IsValidLiteralSubject(testSubject) {\n\treturn fmt.Errorf(\"test subject must be a concrete publish subject, got %q\", testSubject)\n}","typeGuard":null,"tryCatchPattern":"subs, err := srv.Subsz(opts)\nif err != nil && strings.Contains(err.Error(), \"invalid test subject\") {\n\treturn nil, fmt.Errorf(\"%q is not a literal subject; wildcards are not allowed for Test\", opts.Test)\n}","preventionTips":["Strip or reject * and > tokens before passing a user subject to Test","Use server.IsValidLiteralSubject as the single source of truth","Offer wildcard matching client-side on the returned subscription list instead"],"tags":["monitoring","subsz","subject-validation"],"backgroundTag":"invalid-subject","analyzedSha":"3a66a489d262bf89b71a71c955c94920394532f3","analyzedAt":"2026-09-02T04:41:54.247Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}