{"record":{"id":"ac5580a263627615","repo":"deepset-ai/haystack","slug":"invalid-mime-type-or-regex-pattern-mime-type","errorCode":null,"errorMessage":"Invalid MIME type or regex pattern '{mime_type}'.","messagePattern":"Invalid MIME type or regex pattern '(.+?)'\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"haystack/components/routers/file_type_router.py","lineNumber":93,"sourceCode":"            (for example: `{\"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": \".docx\"}`).\n\n        :param raise_on_failure:\n            If True, raises FileNotFoundError when a file path doesn't exist.\n            If False (default), only emits a warning when a file path doesn't exist.\n        \"\"\"\n        if not mime_types:\n            raise ValueError(\"The list of mime types cannot be empty.\")\n\n        if additional_mimetypes:\n            for mime, ext in additional_mimetypes.items():\n                mimetypes.add_type(mime, ext)\n\n        self.mime_type_patterns = []\n        for mime_type in mime_types:\n            try:\n                pattern = re.compile(mime_type)\n            except re.error as e:\n                raise ValueError(f\"Invalid MIME type or regex pattern '{mime_type}'.\") from e\n            self.mime_type_patterns.append(pattern)\n\n        # the actual output type is list[Union[Path, ByteStream]],\n        # but this would cause PipelineConnectError with Converters\n        component.set_output_types(\n            self,\n            unclassified=list[str | Path | ByteStream],\n            failed=list[str | Path | ByteStream],\n            **dict.fromkeys(mime_types, list[str | Path | ByteStream]),\n        )\n        self.mime_types = mime_types\n        self._additional_mimetypes = additional_mimetypes\n        self._raise_on_failure = raise_on_failure\n\n    def to_dict(self) -> dict[str, Any]:\n        \"\"\"\n        Serializes the component to a dictionary.\n","sourceCodeStart":75,"sourceCodeEnd":111,"githubUrl":"https://github.com/deepset-ai/haystack/blob/e318778c9bf60a1963e3b5f451359655dd696c30/haystack/components/routers/file_type_router.py#L75-L111","documentation":"FileTypeRouter.__init__ treats each mime_types entry as either a known MIME type (via mimetypes.guess_type) or a regular expression; if re.compile fails because the string is not valid regex, this ValueError is raised, chaining the original re.error.","triggerScenarios":"Passing malformed patterns like 'application/(pdf' or 'text[/plain' to FileTypeRouter(mime_types=[...]).","commonSituations":"Typos in MIME type lists; regex characters left unescaped; mixing shell-glob syntax with regex syntax.","solutions":["Correct the pattern to valid regex or a standard MIME type string","Escape regex metacharacters, e.g. 'text\\\\/(plain|html)' if you need alternation","Verify with re.compile(your_string) before constructing the router"],"exampleFix":"# before\nrouter = FileTypeRouter(mime_types=[\"application/(pdf\"])\n# after\nrouter = FileTypeRouter(mime_types=[\"application/pdf\", \"application/(pdf|zip)\"])\n","handlingStrategy":"validation","validationCode":"import re, mimetypes\nfor mt in mime_types:\n    if mimetypes.guess_type(\"x\" + (mimetypes.guess_extension(mt) or \"\"))[0] is None:\n        re.compile(mt)  # not a known MIME type; must be valid regex","typeGuard":"def is_valid_mime_pattern(mime_type: str) -> bool:\n    import re\n    try:\n        re.compile(mime_type)\n        return True\n    except re.error:\n        return False","tryCatchPattern":"try:\n    router = FileTypeRouter(mime_types=mime_types)\nexcept ValueError as e:\n    if \"Invalid MIME type or regex\" in str(e):\n        mime_types = [mt for mt in mime_types if is_valid_mime_pattern(mt)]\n        router = FileTypeRouter(mime_types=mime_types)\n    else:\n        raise","preventionTips":["Escape regex metacharacters in custom patterns","Stick to standard MIME type strings from the mimetypes registry","Add unit tests compiling every configured pattern"],"tags":["python","regex","validation","mime-type"],"backgroundTag":"invalid-regex-pattern","analyzedSha":"e318778c9bf60a1963e3b5f451359655dd696c30","analyzedAt":"2026-08-30T11:45:20.711Z","schemaVersion":2},"datasetVersion":"2026-08-30T13:17:10.514Z"}