1
1
"""OpenAPI core templating media types finders module"""
2
2
import fnmatch
3
+ from typing import Mapping
4
+ from typing import Tuple
3
5
4
6
from openapi_core .spec import Spec
5
7
from openapi_core .templating .media_types .datatypes import MediaType
@@ -12,15 +14,31 @@ def __init__(self, content: Spec):
12
14
13
15
def get_first (self ) -> MediaType :
14
16
mimetype , media_type = next (self .content .items ())
15
- return MediaType (media_type , mimetype )
17
+ return MediaType (mimetype , {}, media_type )
16
18
17
19
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 )
20
21
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 :
22
29
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 )
25
32
26
33
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