func (a *Application) ImageFileFromRequest(req *Request, async bool, load bool) (*image.ImageFile, error) { var file *image.ImageFile = &image.ImageFile{ Key: req.Key, Storage: a.DestStorage, Headers: map[string]string{}, } var err error key := a.WithPrefix(req.Key) // Image from the KVStore found stored, err := gokvstores.String(req.Connection.Get(key)) file.Filepath = stored if stored != "" { a.Logger.Infof("Key %s found in kvstore: %s", key, stored) if load { file, err = image.FromStorage(a.DestStorage, stored) if err != nil { return nil, err } } } else { a.Logger.Infof("Key %s not found in kvstore", key) // Image not found from the KVStore, we need to process it // URL available in Query String if req.URL != nil { file, err = image.FromURL(req.URL) } else { // URL provided we use http protocol to retrieve it file, err = image.FromStorage(a.SourceStorage, req.Filepath) } if err != nil { return nil, err } file, err = a.Engine.Transform(file, req.Operation, req.QueryString) if err != nil { return nil, err } file.Filepath = fmt.Sprintf("%s.%s", a.ShardFilename(req.Key), file.Format()) } file.Key = req.Key file.Storage = a.DestStorage file.Headers["Content-Type"] = file.ContentType() file.Headers["ETag"] = req.Key if stored == "" { if async == true { go a.Store(req.Filepath, file) } else { err = a.Store(req.Filepath, file) } } return file, err }