11from starlette .datastructures import Headers
2- from pydantic import BaseModel , Field , StrictStr , field_validator , ByteSize , ConfigDict , AliasChoices
3- from typing import Optional , Self , Annotated
2+ from pydantic import BaseModel , ByteSize , ConfigDict , Field , field_validator , StrictStr
3+ from typing import Annotated , Optional , Self
4+ import re
45
56
67class FileMetadata (BaseModel ):
@@ -13,8 +14,19 @@ class FileMetadata(BaseModel):
1314 @field_validator ('name' )
1415 @classmethod
1516 def validate_name (cls , v : str ) -> str :
16- safe_filename = str (v ).translate (str .maketrans (':;|*@/\\ ' , ' ' )).strip ()
17- return safe_filename .encode ('latin-1' , 'ignore' ).decode ('utf-8' , 'ignore' )
17+ if not v or not v .strip ():
18+ raise ValueError ("Filename cannot be empty" )
19+
20+ safe_filename = re .sub (r'[<>:"/\\|?*\x00-\x1f]' , ' ' , str (v )).strip ()
21+ if not safe_filename :
22+ raise ValueError ("Filename contains only invalid characters" )
23+
24+ try :
25+ safe_filename = safe_filename .encode ('utf-8' ).decode ('utf-8' )
26+ except UnicodeError :
27+ safe_filename = safe_filename .encode ('utf-8' , 'ignore' ).decode ('utf-8' , 'ignore' )
28+
29+ return safe_filename
1830
1931 @classmethod
2032 def from_json (cls , data : str ) -> Self :
0 commit comments