11"""OpenAPI core templating media types finders module"""
22import fnmatch
3+ from typing import Mapping
4+ from typing import Tuple
35
46from openapi_core .spec import Spec
57from openapi_core .templating .media_types .datatypes import MediaType
@@ -12,15 +14,34 @@ def __init__(self, content: Spec):
1214
1315 def get_first (self ) -> MediaType :
1416 mimetype , media_type = next (self .content .items ())
15- return MediaType (media_type , mimetype )
17+ return MediaType (mimetype , {}, media_type )
1618
1719 def find (self , mimetype : str ) -> MediaType :
18- if mimetype in self . content :
19- return MediaType ( self . content / mimetype , mimetype )
20+ if mimetype is None :
21+ raise MediaTypeNotFound ( mimetype , list ( self . content . keys ()) )
2022
21- if mimetype :
23+ mime_type , parameters = self ._parse_mimetype (mimetype )
24+
25+ # simple mime type
26+ for m in [mimetype , mime_type ]:
27+ if m in self .content :
28+ return MediaType (mime_type , parameters , self .content / m )
29+
30+ # range mime type
31+ if mime_type :
2232 for key , value in self .content .items ():
23- if fnmatch .fnmatch (mimetype , key ):
24- return MediaType (value , key )
33+ if fnmatch .fnmatch (mime_type , key ):
34+ return MediaType (key , parameters , value )
2535
2636 raise MediaTypeNotFound (mimetype , list (self .content .keys ()))
37+
38+ def _parse_mimetype (self , mimetype : str ) -> Tuple [str , Mapping [str , str ]]:
39+ mimetype_parts = mimetype .split ("; " )
40+ mime_type = mimetype_parts [0 ]
41+ parameters = {}
42+ if len (mimetype_parts ) > 1 :
43+ parameters_list = (
44+ param_str .split ("=" ) for param_str in mimetype_parts [1 :]
45+ )
46+ parameters = dict (parameters_list )
47+ return mime_type , parameters
0 commit comments