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,31 @@ 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+ mime_type , parameters = self ._parse_mimetype (mimetype )
2021
21- if mimetype :
22+ # simple mime type
23+ for m in [mimetype , mime_type ]:
24+ if m in self .content :
25+ return MediaType (mime_type , parameters , self .content / m )
26+
27+ # range mime type
28+ if mime_type :
2229 for key , value in self .content .items ():
23- if fnmatch .fnmatch (mimetype , key ):
24- return MediaType (value , key )
30+ if fnmatch .fnmatch (mime_type , key ):
31+ return MediaType (key , parameters , value )
2532
2633 raise MediaTypeNotFound (mimetype , list (self .content .keys ()))
34+
35+ def _parse_mimetype (self , mimetype : str ) -> Tuple [str , Mapping [str , str ]]:
36+ mimetype_parts = mimetype .split ("; " )
37+ mime_type = mimetype_parts [0 ]
38+ parameters = {}
39+ if len (mimetype_parts ) > 1 :
40+ parameters_list = (
41+ param_str .split ("=" ) for param_str in mimetype_parts [1 :]
42+ )
43+ parameters = dict (parameters_list )
44+ return mime_type , parameters
0 commit comments