def test_specific_json_consumer(self): @consumes(MediaType.ApplicationJson, object, vendor='supercell') class MyHandler(RequestHandler): pass (_, consumer) = ConsumerBase.map_consumer( 'application/vnd.supercell+json', handler=MyHandler) self.assertIs(consumer, MoreDetailedJsonConsumer) with self.assertRaises(NoConsumerFound): ConsumerBase.map_consumer(MediaType.ApplicationJson, handler=MyHandler)
def test_json_consumer_with_version(self): @consumes(MediaType.ApplicationJson, object, vendor='supercell', version=1.0) class MyHandler(RequestHandler): pass (_, consumer) = ConsumerBase.map_consumer( 'application/vnd.supercell-v1.0+json', handler=MyHandler) self.assertIs(consumer, JsonConsumerWithVendorAndVersion) with self.assertRaises(NoConsumerFound): ConsumerBase.map_consumer(MediaType.ApplicationJson, handler=MyHandler)
def test_default_json_consumer_with_encoding_in_ctype(self): @consumes(MediaType.ApplicationJson, object) class MyHandler(RequestHandler): pass (_, consumer) = ConsumerBase.map_consumer( 'application/json; encoding=UTF-8', handler=MyHandler) self.assertIs(consumer, JsonConsumer) with self.assertRaises(NoConsumerFound): ConsumerBase.map_consumer('application/vnd.supercell-v1.1+json', handler=MyHandler)
def _check_consumer(self): """For a POST or PUT request check if we can find a matching consumer for the incoming data.""" verb = self.request.method.lower() headers = self.request.headers kwargs = self.path_kwargs if verb in ['post', 'put'] and 'Content-Type' in headers: # try to find a matching consumer try: (model, consumer_class) = ConsumerBase.map_consumer( headers['Content-Type'], self) consumer = consumer_class() kwargs['model'] = consumer.consume(self, model) except NoConsumerFound: # TODO return available consumer types?! raise HTTPError(406) except Exception as e: raise HTTPError(400, reason=text_type(e))
def _execute_method(self): '''Execute the request. The method to be executed is determined by the request method. ''' if not self._finished: verb = self.request.method.lower() headers = self.request.headers method = getattr(self, verb) kwargs = self.path_kwargs if verb in ['post', 'put'] and 'Content-Type' in headers: # try to find a matching consumer try: (model, consumer_class) = ConsumerBase.map_consumer( headers['Content-Type'], self) consumer = consumer_class() kwargs['model'] = consumer.consume(self, model) except NoConsumerFound: # TODO return available consumer types?! raise HTTPError(406) except StandardError as e: raise HTTPError(400, reason=unicode(e)) if verb in ['get', 'head']: # check if there is caching information stored with the handler cache_config = self.environment.get_cache_info(self.__class__) if cache_config: self.set_header('Cache-Control', compute_cache_header(cache_config)) expires = self.environment.get_expires_info(self.__class__) if expires: self.set_header('Expires', datetime.now() + expires) future_model = method(*self.path_args, **kwargs) if future_model: callback = partial(self._provide_result, verb, headers) future_model.add_done_callback(callback)