{"record":{"id":"ea8f7fd58ecccb6a","repo":"amir20/dozzle","slug":"invalid-regex-pattern-w-ea8f7f","errorCode":null,"errorMessage":"invalid regex pattern: %w","messagePattern":"invalid regex pattern: %w","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/cloud/tools_stream.go","lineNumber":33,"sourceCode":"\n// streamSender is a function that sends a ToolResponse to the cloud.\ntype streamSender func(resp *pb.ToolResponse) error\n\nfunc parseStreamArgs(argsJSON string) (*fetchLogsArgs, *regexp.Regexp, error) {\n\tvar args fetchLogsArgs\n\tif err := json.Unmarshal([]byte(argsJSON), &args); err != nil {\n\t\treturn nil, nil, fmt.Errorf(\"failed to parse arguments: %w\", err)\n\t}\n\tif args.ContainerID == \"\" {\n\t\treturn nil, nil, fmt.Errorf(\"container_id is required\")\n\t}\n\n\tvar re *regexp.Regexp\n\tif args.Regex != \"\" {\n\t\tvar err error\n\t\tre, err = regexp.Compile(args.Regex)\n\t\tif err != nil {\n\t\t\treturn nil, nil, fmt.Errorf(\"invalid regex pattern: %w\", err)\n\t\t}\n\t}\n\treturn &args, re, nil\n}\n\nfunc matchesFilters(event *container.LogEvent, args *fetchLogsArgs, re *regexp.Regexp) (string, bool) {\n\tif args.Level != \"\" && !strings.EqualFold(event.Level, args.Level) {\n\t\treturn \"\", false\n\t}\n\n\tmsg := event.RawMessage\n\tif msg == \"\" {\n\t\tmsg = fmt.Sprintf(\"%v\", event.Message)\n\t}\n\n\tif args.Query != \"\" {\n\t\tmatched := containsIgnoreCase(msg, args.Query)\n\t\tif matched == args.Inverse {","sourceCodeStart":15,"sourceCodeEnd":51,"githubUrl":"https://github.com/amir20/dozzle/blob/d9463cbe21874e44ab79db6fa63e746ca7d22928/internal/cloud/tools_stream.go#L15-L51","documentation":"parseStreamArgs compiles the optional regex argument with regexp.Compile; a syntactically invalid pattern yields 'invalid regex pattern' wrapping the Go regexp error. This prevents a bad pattern from reaching the streaming filter loop.","triggerScenarios":"executeStreamLogs passes fetchLogsArgs with a non-empty Regex string that Go's regexp (RE2 syntax) cannot compile, e.g. unbalanced parentheses, invalid escape sequences, or lookahead assertions.","commonSituations":"LLM emitting PCRE-style patterns like '(?<=error )' which Go regexp rejects; typos such as 'error[' or 'foo).bar'; ported patterns from other languages using backreferences.","solutions":["Fix the pattern to valid RE2 syntax per the wrapped compile error position","Remove unsupported constructs (lookahead/lookbehind, backreferences) and rewrite the filter","Omit the regex field entirely and rely on level/query filters if a pattern is not needed"],"exampleFix":"// before\nparseStreamArgs(`{\"container_id\":\"a1\",\"regex\":\"(?<=err)\\\\d+\"}`) // lookbehind unsupported\n// after\nparseStreamArgs(`{\"container_id\":\"a1\",\"regex\":\"err\\\\d+\"}`)","handlingStrategy":"validation","validationCode":"if _, err := regexp.Compile(args.Regex); err != nil { /* fix pattern before sending */ }","typeGuard":null,"tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"invalid regex pattern\") {\n  // retry without regex or with corrected RE2 pattern\n}","preventionTips":["Test patterns against Go RE2 (no lookahead/lookbehind/backreferences)","Compile patterns client-side as a pre-check","Fall back to level filters when regex is unnecessary"],"tags":["cloud-tools","regex","validation"],"backgroundTag":"invalid-regex-pattern","analyzedSha":"d9463cbe21874e44ab79db6fa63e746ca7d22928","analyzedAt":"2026-09-07T10:08:55.855Z","contentChangedAt":"2026-09-07T10:08:55.855Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}