code: func (o *httpOps) DownloadImageWithETag(u *url.URL, etag string) (readSeekCloser, *cacheData, error) {
  	var aciFile *removeOnClose // closed on error
  	var errClose error         // error signaling to close aciFile
  
  	ensureLogger(o.Debug)
  	aciFile, err := getTmpROC(o.S, u.String())
  	if err != nil {
  		return nil, nil, err
  	}
  
  	defer func() {
  		if errClose != nil {
  			aciFile.Close()
  		}
  	}()
  
  	session := o.getSession(u, aciFile.File, "ACI", etag)
  	dl := o.getDownloader(session)
  	errClose = dl.Download(u, aciFile.File)
  	if errClose != nil {
  		return nil, nil, errwrap.Wrap(errors.New("error downloading ACI"), errClose)
  	}
  
  	if session.Cd.UseCached {
  		aciFile.Close()
  		return NopReadSeekCloser(nil), session.Cd, nil
  	}
  
  	return aciFile, session.Cd, nil
  }
docs: // DownloadImageWithETag might download an image or tell you to use
  // the cached image. In the latter case the returned file will be nil.