{"record":{"id":"9d90a4c4a881b297","repo":"hashicorp/nomad","slug":"error-parsing-https-handshake-timeout-v","errorCode":null,"errorMessage":"error parsing https_handshake_timeout: %v","messagePattern":"error parsing https_handshake_timeout: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"command/agent/http.go","lineNumber":133,"sourceCode":"\tlogger     log.Logger\n\tAddr       string\n\n\twsUpgrader *websocket.Upgrader\n}\n\n// NewHTTPServers starts an HTTP server for every address.http configured in\n// the agent.\nfunc NewHTTPServers(agent *Agent, config *Config) ([]*HTTPServer, error) {\n\tvar (\n\t\tsrvs                       []*HTTPServer\n\t\tserverInitializationErrors error\n\t\tconnCount                  atomic.Int32\n\t)\n\n\t// Get connection handshake timeout limit\n\thandshakeTimeout, err := time.ParseDuration(config.Limits.HTTPSHandshakeTimeout)\n\tif err != nil {\n\t\treturn srvs, fmt.Errorf(\"error parsing https_handshake_timeout: %v\", err)\n\t} else if handshakeTimeout < 0 {\n\t\treturn srvs, fmt.Errorf(\"https_handshake_timeout must be >= 0\")\n\t}\n\n\t// Get max connection limit\n\tmaxConns := 0\n\tif mc := config.Limits.HTTPMaxConnsPerClient; mc != nil {\n\t\tmaxConns = *mc\n\t}\n\tif maxConns < 0 {\n\t\treturn srvs, fmt.Errorf(\"http_max_conns_per_client must be >= 0\")\n\t}\n\n\ttlsConf, err := tlsutil.NewTLSConfiguration(config.TLSConfig, config.TLSConfig.VerifyHTTPSClient, true)\n\tif err != nil && config.TLSConfig.EnableHTTP {\n\t\treturn srvs, fmt.Errorf(\"failed to initialize HTTP server TLS configuration: %s\", err)\n\t}\n","sourceCodeStart":115,"sourceCodeEnd":151,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/command/agent/http.go#L115-L151","documentation":"Returned by NewHTTPServers (command/agent/http.go:133) when the agent config `limits.https_handshake_timeout` fails time.ParseDuration. The value must be a Go duration string like \"5s\" or \"500ms\"; an unparseable value aborts HTTP server startup or hot reload.","triggerScenarios":"Setting `limits { https_handshake_timeout = \"5\" }` (missing unit), a typo like \"5sec\", an empty/whitespace string, or programmatically assigning an invalid string to Limits.HTTPSHandshakeTimeout, then starting or reloading the agent.","commonSituations":"Config assuming unitless seconds; copying values from tools with different duration syntax; env substitution producing empty strings; old configs from software with different parsing rules.","solutions":["Add a time unit: https_handshake_timeout = \"5s\".","Use only valid Go duration units (ns, us/µs, ms, s, m, h) — \"5sec\" is invalid.","Validate with time.ParseDuration locally or run `nomad validate <config>` before deploy.","If a reload triggered it, fix the config and re-run `nomad agent reload` or restart."],"exampleFix":"// before (HCL)\nlimits {\n  https_handshake_timeout = \"5\"\n}\n// after\nlimits {\n  https_handshake_timeout = \"5s\"\n}","handlingStrategy":"validation","validationCode":"if _, err := time.ParseDuration(cfg.Limits.HTTPSHandshakeTimeout); err != nil {\n    return fmt.Errorf(\"https_handshake_timeout invalid: %v\", err)\n}","typeGuard":null,"tryCatchPattern":"if err := agent.Setup(); err != nil {\n    if strings.Contains(err.Error(), \"error parsing https_handshake_timeout\") {\n        // fix config to a valid Go duration like \"5s\" and retry startup\n    }\n}","preventionTips":["Always include a unit (s, ms, m) in duration settings.","Run `nomad validate <config>` before every deploy.","Use typed duration fields from your SDK where available.","Grep configs for unitless numbers before upgrades."],"tags":["configuration","duration-parsing","hcl","nomad"],"backgroundTag":"invalid-duration-config","analyzedSha":"482b49bf1aec006f089bcfc7e632d8f6ac303e5e","analyzedAt":"2026-09-04T07:54:14.808Z","contentChangedAt":"2026-09-04T07:54:14.808Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}