def execute_image_operations(self): self.context.request.quality = None req = self.context.request conf = self.context.config req.extension = splitext(req.image_url)[-1].lower() should_store = self.context.config.RESULT_STORAGE_STORES_UNSAFE or not self.context.request.unsafe if self.context.modules.result_storage and should_store: result = self.context.modules.result_storage.get() if result is not None: mime = BaseEngine.get_mimetype(result) if mime == '.gif' and self.context.config.USE_GIFSICLE_ENGINE: self.context.request.engine = GifEngine(self.context) else: self.context.request.engine = self.context.modules.engine logger.debug('[RESULT_STORAGE] IMAGE FOUND: %s' % req.url) self.finish_request(self.context, result) return if conf.MAX_WIDTH and (not isinstance(req.width, basestring)) and req.width > conf.MAX_WIDTH: req.width = conf.MAX_WIDTH if conf.MAX_HEIGHT and (not isinstance(req.height, basestring)) and req.height > conf.MAX_HEIGHT: req.height = conf.MAX_HEIGHT req.meta_callback = conf.META_CALLBACK_NAME or self.request.arguments.get('callback', [None])[0] self.filters_runner = self.context.filters_factory.create_instances(self.context, self.context.request.filters) self.filters_runner.apply_filters(thumbor.filters.PHASE_PRE_LOAD, self.get_image)
def handle_loader_loaded(buffer): if buffer is None: callback(False, None) return original_preserve = self.context.config.PRESERVE_EXIF_INFO self.context.config.PRESERVE_EXIF_INFO = True try: mime = BaseEngine.get_mimetype(buffer) if mime == '.gif' and self.context.config.USE_GIFSICLE_ENGINE: self.context.request.engine = GifEngine(self.context) else: self.context.request.engine = self.context.modules.engine self.context.request.engine.load(buffer, extension) normalized = self.context.request.engine.normalize() is_no_storage = isinstance(storage, NoStorage) is_mixed_storage = isinstance(storage, MixedStorage) is_mixed_no_file_storage = is_mixed_storage and isinstance(storage.file_storage, NoStorage) if not (is_no_storage or is_mixed_no_file_storage): buffer = self.context.request.engine.read() storage.put(url, buffer) storage.put_crypto(url) finally: self.context.config.PRESERVE_EXIF_INFO = original_preserve callback(normalized, engine=self.context.request.engine)
def validate(self, body): conf = self.context.config mime = BaseEngine.get_mimetype(body) if mime == '.gif' and self.context.config.USE_GIFSICLE_ENGINE: engine = GifEngine(self.context) else: engine = self.context.modules.engine # Check if image is valid try: engine.load(body, None) except IOError: self._error(415, 'Unsupported Media Type') return False # Check weight constraints if (conf.UPLOAD_MAX_SIZE != 0 and len(self.request.body) > conf.UPLOAD_MAX_SIZE): self._error( 412, 'Image exceed max weight (Expected : %s, Actual : %s)' % (conf.UPLOAD_MAX_SIZE, len(self.request.body))) return False # Check size constraints size = engine.size if (conf.MIN_WIDTH > size[0] or conf.MIN_HEIGHT > size[1]): self._error( 412, 'Image is too small (Expected: %s/%s , Actual : %s/%s) % (conf.MIN_WIDTH, conf.MIN_HEIGHT, size[0], size[1])') return False return True
def topic(self): config = Config() server = ServerParameters( 8889, 'localhost', 'thumbor.conf', None, 'info', None ) context = Context(server, config, Importer(config)) context.server.gifsicle_path = which('gifsicle') context.request = RequestParameters() with open("%s/animated_image.gif" % FIXTURES_FOLDER, "rb") as f: buffer = f.read() engine = GifEngine(context=context) engine.load(buffer, '.gif') return engine.read()