{"record":{"id":"34fbf8095b8b45e9","repo":"caddyserver/caddy","slug":"adding-encoding-s-v","errorCode":null,"errorMessage":"adding encoding %s: %v","messagePattern":"adding encoding (.+?): (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"modules/caddyhttp/encode/encode.go","lineNumber":79,"sourceCode":"\n// CaddyModule returns the Caddy module information.\nfunc (Encode) CaddyModule() caddy.ModuleInfo {\n\treturn caddy.ModuleInfo{\n\t\tID:  \"http.handlers.encode\",\n\t\tNew: func() caddy.Module { return new(Encode) },\n\t}\n}\n\n// Provision provisions enc.\nfunc (enc *Encode) Provision(ctx caddy.Context) error {\n\tmods, err := ctx.LoadModule(enc, \"EncodingsRaw\")\n\tif err != nil {\n\t\treturn fmt.Errorf(\"loading encoder modules: %v\", err)\n\t}\n\tfor modName, modIface := range mods.(map[string]any) {\n\t\terr = enc.addEncoding(modIface.(Encoding))\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"adding encoding %s: %v\", modName, err)\n\t\t}\n\t}\n\tif enc.MinLength == 0 {\n\t\tenc.MinLength = defaultMinLength\n\t}\n\n\tif enc.Matcher == nil {\n\t\t// common text-based content types\n\t\t// list based on https://developers.cloudflare.com/speed/optimization/content/brotli/content-compression/#compression-between-cloudflare-and-website-visitors\n\t\tenc.Matcher = &caddyhttp.ResponseMatcher{\n\t\t\tHeaders: http.Header{\n\t\t\t\t\"Content-Type\": []string{\n\t\t\t\t\t\"application/atom+xml*\",\n\t\t\t\t\t\"application/eot*\",\n\t\t\t\t\t\"application/font*\",\n\t\t\t\t\t\"application/geo+json*\",\n\t\t\t\t\t\"application/graphql+json*\",\n\t\t\t\t\t\"application/graphql-response+json*\",","sourceCodeStart":61,"sourceCodeEnd":97,"githubUrl":"https://github.com/caddyserver/caddy/blob/50e54ee279aa1e504fe218ca49ab6ae16c100410/modules/caddyhttp/encode/encode.go#L61-L97","documentation":"Provision-time error when addEncoding() rejects a successfully-loaded encoder module. It wraps either 'encoder does not specify an Accept-Encoding value' (empty AcceptEncoding()) or 'encoder already added: %s' (two encoders claiming the same Accept-Encoding token).","triggerScenarios":"Two encoder modules in the same encode block returning the same AcceptEncoding() string, or a third-party encoder whose AcceptEncoding() returns \"\".","commonSituations":"Installing a custom encoder plugin that duplicates gzip/zstd's encoding name; writing your own Encoding implementation and forgetting AcceptEncoding().","solutions":["Read the wrapped error to see which encoding name collided or was empty","Remove the duplicate encoder from the encode block","If authoring a plugin, return a unique non-empty string from AcceptEncoding()"],"exampleFix":"// before (plugin)\nfunc (MyEnc) AcceptEncoding() string { return \"\" }\n// after\nfunc (MyEnc) AcceptEncoding() string { return \"myenc\" }","handlingStrategy":"validation","validationCode":"// For plugin authors: interface guard so AcceptEncoding contract is explicit\nvar _ encode.Encoding = (*MyEncoder)(nil)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Avoid loading two encoders that claim the same token","Plugin encoders must return a unique non-empty AcceptEncoding()"],"tags":["caddy","encode","modules","plugin"],"backgroundTag":null,"analyzedSha":"50e54ee279aa1e504fe218ca49ab6ae16c100410","analyzedAt":"2026-08-15T09:20:21.641Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}