{"id":"9b94593b22ce1a8d","repo":"gorilla/mux","slug":"mux-missing-name-or-pattern-in-q","errorCode":null,"errorMessage":"mux: missing name or pattern in %q","messagePattern":"mux: missing name or pattern in %q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"regexp.go","lineNumber":97,"sourceCode":"\t\traw := tpl[end:idxs[i]]\n\t\tend = idxs[i+1]\n\t\ttag := tpl[idxs[i]:end]\n\n\t\t// trim braces from tag\n\t\tparam = tag[1 : len(tag)-1]\n\n\t\tcolonIdx = strings.Index(param, \":\")\n\t\tif colonIdx == -1 {\n\t\t\tname = param\n\t\t\tpatt = defaultPattern\n\t\t} else {\n\t\t\tname = param[0:colonIdx]\n\t\t\tpatt = param[colonIdx+1:]\n\t\t}\n\n\t\t// Name or pattern can't be empty.\n\t\tif name == \"\" || patt == \"\" {\n\t\t\treturn nil, fmt.Errorf(\"mux: missing name or pattern in %q\", tag)\n\t\t}\n\t\t// Build the regexp pattern.\n\t\tgroupName := varGroupName(groupIdx)\n\n\t\tpattern.WriteString(regexp.QuoteMeta(raw) + \"(?P<\" + groupName + \">\" + patt + \")\")\n\n\t\t// Build the reverse template.\n\t\treverse.WriteString(raw + \"%s\")\n\n\t\t// Append variable name and compiled pattern.\n\t\tvarsN[groupIdx] = name\n\t\tvarsR[groupIdx], err = RegexpCompileFunc(\"^\" + patt + \"$\")\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"mux: error compiling regex for %q: %w\", tag, err)\n\t\t}\n\t}\n\t// Add the remaining.\n\traw := tpl[end:]","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/gorilla/mux/blob/db9d1d0073d27a0a2d9a8c1bc52aa0af4374d265/regexp.go#L79-L115","documentation":"Returned by newRouteRegexp (regexp.go:96-97) when parsing a {name:pattern} variable in which the name or the pattern is empty. Allowed forms: {name}, {name:pattern}. Disallowed: {}, {:pattern}, {name:}. It surfaces during Path/Host/PathPrefix/Queries construction and is stored on r.err via addRegexpMatcher.","triggerScenarios":"r.Path(\"/users/{}/\"); r.Path(\"/users/{:id}\"); r.Path(\"/users/{id:}\"); r.Host(\"{:.*}.com\").","commonSituations":"Templating bugs that emit empty placeholders; copy-paste leaving braces empty; a URL builder interpolating into path templates unsafely.","solutions":["Provide both a name and (when using ':') a non-empty pattern: {id} or {id:[0-9]+}.","Validate user-supplied path templates before registering routes.","Sanitize dynamic template inputs and check route.GetError()."],"exampleFix":"// before\nr.Path(\"/users/{:id}\") // empty name\n\n// after\nr.Path(\"/users/{id}\")","handlingStrategy":"validation","validationCode":"var varRE = regexp.MustCompile(`^\\{([^:{}]+)(?::([^{}]+))?\\}$`)\nfunc validVar(tok string) bool { return varRE.MatchString(tok) }","typeGuard":"func validTemplate(tpl string) bool {\n    for _, tok := range extractBraces(tpl) {\n        if !validVar(tok) { return false }\n    }\n    return true\n}","tryCatchPattern":"rt := r.Path(tpl)\nif err := rt.GetError(); err != nil {\n    return fmt.Errorf(\"invalid template %q: %w\", tpl, err)\n}","preventionTips":["Validate templates with a brace/var regex before Path().","Never interpolate untrusted strings into path templates.","Unit-test route construction."],"tags":["routing","config","regexp","path-template","build-time"],"analyzedSha":"db9d1d0073d27a0a2d9a8c1bc52aa0af4374d265","analyzedAt":"2026-08-04T21:35:47.097Z","schemaVersion":2}