{"record":{"id":"c2e11d5d85400fb0","repo":"caddyserver/caddy","slug":"unexpected-compression-level-use-one-of-s-s","errorCode":null,"errorMessage":"unexpected compression level, use one of '%s', '%s', '%s', '%s'","messagePattern":"unexpected compression level, use one of '(.+?)', '(.+?)', '(.+?)', '(.+?)'","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"modules/caddyhttp/encode/zstd/zstd.go","lineNumber":155,"sourceCode":"}\n\nfunc (z Zstd) encoderLevel() zstd.EncoderLevel {\n\tif z.level != 0 {\n\t\treturn z.level\n\t}\n\tif z.Level != \"\" {\n\t\tif level, err := parseEncoderLevel(z.Level); err == nil {\n\t\t\treturn level\n\t\t}\n\t}\n\treturn zstd.SpeedDefault\n}\n\nfunc parseEncoderLevel(level string) (zstd.EncoderLevel, error) {\n\tif ok, encLevel := zstd.EncoderLevelFromString(level); ok {\n\t\treturn encLevel, nil\n\t}\n\treturn 0, fmt.Errorf(\"unexpected compression level, use one of '%s', '%s', '%s', '%s'\",\n\t\tzstd.SpeedFastest,\n\t\tzstd.SpeedBetterCompression,\n\t\tzstd.SpeedBestCompression,\n\t\tzstd.SpeedDefault,\n\t)\n}\n\n// Interface guards\nvar (\n\t_ encode.Encoding       = (*Zstd)(nil)\n\t_ caddyfile.Unmarshaler = (*Zstd)(nil)\n\t_ caddy.Provisioner     = (*Zstd)(nil)\n)\n","sourceCodeStart":137,"sourceCodeEnd":169,"githubUrl":"https://github.com/caddyserver/caddy/blob/50e54ee279aa1e504fe218ca49ab6ae16c100410/modules/caddyhttp/encode/zstd/zstd.go#L137-L169","documentation":"parseEncoderLevel error from the zstd encoder: the Level string did not match any zstd.EncoderLevelFromString value. Acceptable names are the zstd speed constants printed in the message (fastest, better-compression, best-compression, default).","triggerScenarios":"{\"level\": \"max\"} or \"9\" for the zstd encoder — anything not one of zstd.SpeedFastest / SpeedBetterCompression / SpeedBestCompression / SpeedDefault (case-insensitive per EncoderLevelFromString).","commonSituations":"Using gzip-style numeric levels as strings for zstd; assuming 'max'/'high' are valid names.","solutions":["Use one of: 'fastest', 'better-compression', 'best-compression', 'default'","Do not pass numbers for zstd; unlike gzip it takes named levels"],"exampleFix":"// before\n{\"level\": \"9\"}\n// after\n{\"level\": \"best-compression\"}","handlingStrategy":"validation","validationCode":"var zstdLevels = map[string]bool{\"fastest\": true, \"better-compression\": true, \"best-compression\": true, \"default\": true}\nif !zstdLevels[strings.ToLower(level)] { return errors.New(\"invalid zstd level\") }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["zstd takes named levels, gzip takes numbers","Keep a cheat sheet of per-encoder level schemes"],"tags":["caddy","zstd","encode","validation","config"],"backgroundTag":null,"analyzedSha":"50e54ee279aa1e504fe218ca49ab6ae16c100410","analyzedAt":"2026-08-15T09:20:21.641Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}