def negotiate_encoder(encoders, accept=None): """ Given the value of a 'Accept' header, return the appropriate codec for encoding the response content. """ if accept is None: return encoders[0] acceptable = set( [item.split(';')[0].strip().lower() for item in accept.split(',')]) for codec in encoders: for media_type in codec.get_media_types(): if media_type in acceptable: return codec for codec in encoders: for media_type in codec.get_media_types(): if codec.media_type.split('/')[0] + '/*' in acceptable: return codec if '*/*' in acceptable: return encoders[0] msg = "Unsupported media in Accept header '%s'" % accept raise exceptions.NoCodecAvailable(msg)
def negotiate_decoder(decoders, content_type=None): """ Given the value of a 'Content-Type' header, return the appropriate codec for decoding the request content. """ if content_type is None: return decoders[0] content_type = content_type.split(';')[0].strip().lower() main_type = content_type.split('/')[0] + '/*' wildcard_type = '*/*' for codec in decoders: for media_type in codec.get_media_types(): if media_type in (content_type, main_type, wildcard_type): return codec msg = "Unsupported media in Content-Type header '%s'" % content_type raise exceptions.NoCodecAvailable(msg)