func determineAction()

in go/downloader/downloader.go [38:88]


func determineAction(client *http.Client, crlUrl url.URL, path string) (DownloadAction, int64, int64) {
	szOnDisk, localDate, err := GetSizeAndDateOfFile(path)
	if err != nil {
		glog.V(1).Infof("[%s] CREATE: File not on disk: %s ", crlUrl.String(), err)
		return Create, 0, 0
	}
	req, err := http.NewRequest("HEAD", crlUrl.String(), nil)
	if err != nil {
		return Create, szOnDisk, 0
	}
	req.Header.Add("X-Automated-Tool", "https://github.com/mozilla/crlite")

	resp, err := client.Do(req)
	if err != nil {
		return Create, szOnDisk, 0
	}

	eTag := resp.Header.Get("Etag")
	lastMod, err := http.ParseTime(resp.Header.Get("Last-Modified"))
	if err != nil {
		glog.V(1).Infof("[%s] CREATE: Invalid last-modified: %s [%s]", crlUrl.String(), err, resp.Header.Get("Last-Modified"))
		return Create, szOnDisk, 0
	}
	szOnServer, err := strconv.ParseInt(resp.Header.Get("Content-Length"), 10, 64)
	if err != nil {
		glog.V(1).Infof("[%s] CREATE: No content length: %s [%s]", crlUrl.String(), err, resp.Header.Get("Content-Length"))
		return Create, szOnDisk, 0
	}

	if localDate.Before(lastMod) {
		glog.V(1).Infof("[%s] CREATE: Local Date is before last modified header date, assuming out-of-date", crlUrl.String())
		return Create, szOnDisk, szOnServer
	}

	if szOnServer == szOnDisk {
		glog.V(1).Infof("[%s] UP TO DATE", crlUrl.String())
		return UpToDate, szOnDisk, szOnServer
	}

	if szOnServer > szOnDisk {
		if resp.Header.Get("Accept-Ranges") == "bytes" {
			glog.V(1).Infof("[%s] RESUME: { Already on disk: %d %s, Last-Modified: %s, Etag: %s, Length: %d }", crlUrl.String(), szOnDisk, localDate.String(), lastMod.String(), eTag, szOnServer)
			return Resume, szOnDisk, szOnServer
		}

		glog.V(1).Infof("[%s] Accept-Ranges not supported, unable to resume", crlUrl.String())
	}

	glog.V(1).Infof("[%s] CREATE: Fallthrough", crlUrl.String())
	return Create, szOnDisk, szOnServer
}