func()

in providers/nvd/cve.go [326:378]


func (cf cveFile) downloadAndVerify(ctx context.Context, m *metaFile, remoteFileURL string) (string, error) {
	req, err := httpNewRequestContext(ctx, "GET", remoteFileURL)
	if err != nil {
		return "", err
	}
	flog.V(1).Infof("downloading data file %q", remoteFileURL)
	resp, err := client.Default().Do(req)
	if err != nil {
		return "", err
	}
	defer resp.Body.Close()
	if err = httpResponseNotOK(resp); err != nil {
		return "", err
	}
	var wantSize int64
	var hashFunc func(filename string) (string, error)
	switch cf.compression() {
	case "gz":
		wantSize = int64(m.GzSize)
		hashFunc = gunzipFileAndComputeSHA256
	case "zip":
		wantSize = int64(m.ZipSize)
		hashFunc = unzipFileAndComputeSHA256
	}
	if resp.ContentLength != wantSize {
		return "", fmt.Errorf(
			"unexpected size for %q (%s): want %d, have %d",
			remoteFileURL, resp.Status, wantSize, resp.ContentLength,
		)
	}
	dataFile, err := ioutil.TempFile("", "nvdsync-data-")
	if err != nil {
		return "", err
	}
	_, err = io.Copy(dataFile, resp.Body)
	dataFile.Close()
	if err != nil {
		return "", err
	}
	hash, err := hashFunc(dataFile.Name())
	if err != nil {
		defer os.Remove(dataFile.Name()) // TODO: delet?
		return "", err
	}
	if hash != m.SHA256 {
		defer os.Remove(dataFile.Name()) // TODO: delet?
		return "", fmt.Errorf(
			"unexpected hash for %q (%s): want %q, have %q",
			remoteFileURL, resp.Status, m.SHA256, hash,
		)
	}
	return dataFile.Name(), nil
}