@@ -206,12 +206,12 @@ def __init__(self, request, supported_locales):
206206 self ._raw_locale , self ._locale = self ._get_locale (request .headers ,
207207 supported_locales )
208208
209- # Determine format
210- self ._format = self ._get_format (request .headers )
211-
212209 # Get received headers
213210 self ._headers = self .get_request_headers (request .headers )
214211
212+ # Determine format
213+ self ._format = self ._get_format ()
214+
215215 @classmethod
216216 def from_flask (cls , request , supported_locales ) -> 'APIRequest' :
217217 """Factory class similar to with_data, but only for flask requests"""
@@ -298,12 +298,10 @@ def _get_locale(self, headers: dict,
298298
299299 return raw , default_locale
300300
301- def _get_format (self , headers : dict ,
302- extra_formats : dict = {}) -> Union [str , None ]:
301+ def _get_format (self , extra_formats : dict = {}) -> Union [str , None ]:
303302 """
304303 Get `Request` format type from query parameters or headers.
305304
306- :param headers: Dict of Request headers
307305 :param extra_formats: Dict of extra dataset specific formats
308306
309307 :returns: format value or None if not found/specified
@@ -317,19 +315,25 @@ def _get_format(self, headers: dict,
317315
318316 # Format not specified: get from Accept headers (MIME types)
319317 # e.g. Accept: 'text/html;q=0.5,application/ld+json'
320- types_ = get_choice_from_headers (headers , 'accept' , all = True )
318+ types_ = get_choice_from_headers (self . headers , 'accept' , all = True )
321319 if types_ is None :
322320 return
323321
324- merged_format_types = FORMAT_TYPES | extra_formats
325-
326- (fmts , mimes ) = zip (* merged_format_types .items ())
327- mimes2 = [m .split (';' )[0 ] for m in mimes ]
322+ # Add formatters to accepted format types
323+ extra_formats_mimes = {
324+ k : v .mimetype for k , v in extra_formats .items ()
325+ if hasattr (v , 'mimetype' )
326+ }
327+ merged_format_types = FORMAT_TYPES | extra_formats_mimes
328328
329+ # Lookup formatter by mimetype
330+ mimes = {
331+ merged_format_types [k ].split (';' )[0 ]: k
332+ for k in merged_format_types
333+ }
329334 for type_ in types_ :
330- if type_ in mimes2 :
331- idx_ = mimes2 .index (type_ )
332- return fmts [idx_ ]
335+ if type_ in mimes :
336+ return mimes [type_ ]
333337
334338 @property
335339 def data (self ) -> bytes :
0 commit comments