{"record":{"id":"656863c447ff010c","repo":"projectdiscovery/nuclei","slug":"headless-template-threads-must-be-at-least-1","errorCode":null,"errorMessage":"headless template threads must be at least 1","messagePattern":"headless template threads must be at least 1","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"lib/config.go","lineNumber":142,"sourceCode":"\tTemplatePayloadConcurrency    int // max concurrent payloads to run for a template (a good default is 25)\n\tProbeConcurrency              int // max concurrent http probes to run (a good default is 50)\n}\n\n// WithConcurrency sets concurrency options\nfunc WithConcurrency(opts Concurrency) NucleiSDKOptions {\n\treturn func(e *NucleiEngine) error {\n\t\t// minimum required is 1\n\t\tif opts.TemplateConcurrency <= 0 {\n\t\t\treturn errors.New(\"template threads must be at least 1\")\n\t\t}\n\t\tif opts.HostConcurrency <= 0 {\n\t\t\treturn errors.New(\"host concurrency must be at least 1\")\n\t\t}\n\t\tif opts.HeadlessHostConcurrency <= 0 {\n\t\t\treturn errors.New(\"headless host concurrency must be at least 1\")\n\t\t}\n\t\tif opts.HeadlessTemplateConcurrency <= 0 {\n\t\t\treturn errors.New(\"headless template threads must be at least 1\")\n\t\t}\n\t\tif opts.JavascriptTemplateConcurrency <= 0 {\n\t\t\treturn errors.New(\"js must be at least 1\")\n\t\t}\n\t\tif opts.TemplatePayloadConcurrency <= 0 {\n\t\t\treturn errors.New(\"payload concurrency must be at least 1\")\n\t\t}\n\t\tif opts.ProbeConcurrency <= 0 {\n\t\t\treturn errors.New(\"probe concurrency must be at least 1\")\n\t\t}\n\t\te.opts.TemplateThreads = opts.TemplateConcurrency\n\t\te.opts.BulkSize = opts.HostConcurrency\n\t\te.opts.HeadlessBulkSize = opts.HeadlessHostConcurrency\n\t\te.opts.HeadlessTemplateThreads = opts.HeadlessTemplateConcurrency\n\t\te.opts.JsConcurrency = opts.JavascriptTemplateConcurrency\n\t\te.opts.PayloadConcurrency = opts.TemplatePayloadConcurrency\n\t\te.opts.ProbeConcurrency = opts.ProbeConcurrency\n\t\treturn nil","sourceCodeStart":124,"sourceCodeEnd":160,"githubUrl":"https://github.com/projectdiscovery/nuclei/blob/265b3a3dec374741614e342f813c10f8b38d2bb7/lib/config.go#L124-L160","documentation":"splitSharePath trims slashes off the smb:// URL path and errors when nothing remains: every smb:// URL must name at least host/share. smb://host or smb://host/ leaves no share segment, so parsing aborts before any connection is attempted.","triggerScenarios":"smb://host or smb://host/ passed as a file target - the path component is empty after trimming slashes.","commonSituations":"Probing host reachability with a bare smb://host URL; the share name typo'd into the host part.","solutions":["Add the share name: smb://host/share/file.txt","List available shares first and use an exact name"],"exampleFix":"# before\nsmb://fileserver/\n# after\nsmb://fileserver/public/report.pdf","handlingStrategy":"validation","validationCode":"import (\n    \"net/url\"\n    \"strings\"\n)\n\nfunc smbURLHasShare(raw string) bool {\n    u, err := url.Parse(raw)\n    if err != nil {\n        return false\n    }\n    return strings.Trim(u.Path, \"/\") != \"\"\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Include /share in every smb:// URL","Enumerate shares separately from file scans"],"tags":["smb","url","path","validation"],"backgroundTag":null,"analyzedSha":"265b3a3dec374741614e342f813c10f8b38d2bb7","analyzedAt":"2026-08-15T20:05:51.855Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}