{"record":{"id":"1a93c235752ed214","repo":"caddyserver/caddy","slug":"parsing-browse-template-v","errorCode":null,"errorMessage":"parsing browse template: %v","messagePattern":"parsing browse template: (.+?)","errorType":"http","errorClass":null,"httpStatus":500,"severity":"error","filePath":"modules/caddyhttp/fileserver/browse.go","lineNumber":203,"sourceCode":"\n\tdefault:\n\t\tvar fs http.FileSystem\n\t\tif fsrv.Root != \"\" {\n\t\t\tfs = http.Dir(repl.ReplaceAll(fsrv.Root, \".\"))\n\t\t}\n\n\t\ttplCtx := &templateContext{\n\t\t\tTemplateContext: templates.TemplateContext{\n\t\t\t\tRoot:       fs,\n\t\t\t\tReq:        r,\n\t\t\t\tRespHeader: templates.WrappedHeader{Header: w.Header()},\n\t\t\t},\n\t\t\tbrowseTemplateContext: listing,\n\t\t}\n\n\t\ttpl, err := fsrv.makeBrowseTemplate(tplCtx)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"parsing browse template: %v\", err)\n\t\t}\n\t\tif err := tpl.Execute(buf, tplCtx); err != nil {\n\t\t\treturn caddyhttp.Error(http.StatusInternalServerError, err)\n\t\t}\n\t\tw.Header().Set(\"Content-Type\", \"text/html; charset=utf-8\")\n\t}\n\n\t_, _ = buf.WriteTo(w)\n\n\treturn nil\n}\n\nfunc (fsrv *FileServer) loadDirectoryContents(ctx context.Context, fileSystem fs.FS, dir fs.ReadDirFile, root, urlPath string, repl *caddy.Replacer) (*browseTemplateContext, error) {\n\t// modTime for the directory itself\n\tstat, err := dir.Stat()\n\tif err != nil {\n\t\treturn nil, err\n\t}","sourceCodeStart":185,"sourceCodeEnd":221,"githubUrl":"https://github.com/caddyserver/caddy/blob/50e54ee279aa1e504fe218ca49ab6ae16c100410/modules/caddyhttp/fileserver/browse.go#L185-L221","documentation":"Runtime (per-request) error from the file server's browse handler: makeBrowseTemplate failed to parse the template (custom file or built-in default). The wrapped error contains the Go template parse details.","triggerScenarios":"A request for a browsed directory with browse enabled while the template (custom TemplateFile or embedded BrowseTemplate) has invalid Go template syntax; parsing happens lazily per request here.","commonSituations":"Custom browse_template_file with malformed {{.Bad}} actions or unbalanced delimiters; a template using functions not in the template context.","solutions":["Read the wrapped error for line/column of the template syntax problem","Test the template with `go template` parsing locally (text/template Parse) before deploying","Remove TemplateFile to fall back to the built-in default template"],"exampleFix":"# before\n{{.Listing.Name \n# after (well-formed)\n{{.Name}}","handlingStrategy":"validation","validationCode":"// offline: parse the custom template before deploying\nif _, err := template.New(\"t\").ParseFiles(\"browse.html\"); err != nil { log.Fatal(err) }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Validate custom browse templates with text/template.Parse in CI","Fall back to the default template when unsure"],"tags":["caddy","fileserver","browse","template","runtime"],"backgroundTag":null,"analyzedSha":"50e54ee279aa1e504fe218ca49ab6ae16c100410","analyzedAt":"2026-08-15T09:20:21.641Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}