{"record":{"id":"5c355ad898ce4e90","repo":"nats-io/nats-server","slug":"fetching-jwt-failed-due-to-shutdown","errorCode":null,"errorMessage":"fetching jwt failed due to shutdown","messagePattern":"fetching jwt failed due to shutdown","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/accounts.go","lineNumber":4771,"sourceCode":"\t\t\treturn\n\t\t}\n\t\t// Use the first valid response if there is still interest or\n\t\t// one of the empty responses to signal that it was not found.\n\t\tif _, ok := replies[replySubj]; ok {\n\t\t\tselect {\n\t\t\tcase respC <- clone:\n\t\t\tdefault:\n\t\t\t}\n\t\t}\n\t}\n\ts.sendInternalMsg(accountLookupRequest, replySubj, nil, []byte{})\n\tquit := s.quitCh\n\ts.mu.Unlock()\n\tvar err error\n\tvar theJWT string\n\tselect {\n\tcase <-quit:\n\t\terr = errors.New(\"fetching jwt failed due to shutdown\")\n\tcase <-time.After(timeout):\n\t\terr = errors.New(\"fetching jwt timed out\")\n\tcase m := <-respC:\n\t\tif len(m) == 0 {\n\t\t\terr = errors.New(\"account jwt not found\")\n\t\t} else if err = res.Store(name, string(m)); err == nil {\n\t\t\ttheJWT = string(m)\n\t\t}\n\t}\n\ts.mu.Lock()\n\tdelete(replies, replySubj)\n\ts.mu.Unlock()\n\tclose(respC)\n\treturn theJWT, err\n}\n\nfunc NewCacheDirAccResolver(path string, limit int64, ttl time.Duration, opts ...DirResOption) (*CacheDirAccResolver, error) {\n\tif limit <= 0 {","sourceCodeStart":4753,"sourceCodeEnd":4789,"githubUrl":"https://github.com/nats-io/nats-server/blob/3a66a489d262bf89b71a71c955c94920394532f3/server/accounts.go#L4753-L4789","documentation":"Returned by Connz (monitoring endpoint) when the ConnzOptions.Sort field is set to a string that is not a valid SortOpt (e.g. not cid, start, stop, reason, subs, pending, etc.). The endpoint rejects the request before building the connection list. This affects both the Go API (server.Connz(opts)) and the HTTP monitoring /connz endpoint.","triggerScenarios":"Calling Connz with opts.Sort = \"foo\"; HTTP GET /connz?sort=invalid_option; typo'd sort field like \"uptime\" (deprecated alias not valid anymore) in tests or dashboards.","commonSituations":"Monitoring dashboards with hardcoded sort options after a server upgrade renamed/removed options; user-supplied query params passed straight into ConnzOptions.","solutions":["Use a valid sort option from the SortOpt set (cid, start, idle, stop, reason, etc.)","Validate user-supplied sort values against server.AllSortOptions before assigning","Handle the returned error and surface a 400-level message to the dashboard user"],"exampleFix":"// before\nconnz, err := srv.Connz(&ConnzOptions{Sort: \"uptime\"})\n// after\nsortOpt := SortBy(\"uptime\")\nif !sortOpt.IsValid() {\n    sortOpt = ByCid\n}\nconnz, err := srv.Connz(&ConnzOptions{Sort: sortOpt})","handlingStrategy":"validation","validationCode":"func validSortOpt(opt string) bool {\n    for _, o := range server.AllSortOptions {\n        if string(o) == opt { return true }\n    }\n    return false\n}\nvar opts *server.ConnzOptions\nif !validSortOpt(sortParam) {\n    return http.StatusBadRequest\n}\nopts = &server.ConnzOptions{Sort: server.SortOpt(sortParam)}\nconnz, err := srv.Connz(opts)","typeGuard":null,"tryCatchPattern":"connz, err := srv.Connz(&ConnzOptions{Sort: sortOpt})\nif err != nil && strings.Contains(err.Error(), \"invalid sorting option\") {\n    // fall back to default ByCid sort\n    connz, err = srv.Connz(nil)\n}","preventionTips":["Map user input to SortOpt via a whitelist, never cast raw strings","Re-check valid options after upgrading nats-server (options change across versions)","Default to ByCid when the requested sort is unknown"],"tags":["monitoring","http","validation","connz"],"backgroundTag":"invalid-sort-option","analyzedSha":"3a66a489d262bf89b71a71c955c94920394532f3","analyzedAt":"2026-09-02T04:41:54.247Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}