// download a file with the HTTP/HTTPS protocol showing a progress bar. The destination file is // always overwritten. func download(rawurl string, destinationPath string) { tempDestinationPath := destinationPath + ".tmp" destination, err := os.Create(tempDestinationPath) if err != nil { log.Fatalf("Unable to open the destination file: %s", tempDestinationPath) } defer destination.Close() response, err := customGet(rawurl) if err != nil { log.Fatalf("Unable to open a connection to %s", rawurl) } defer response.Body.Close() if response.StatusCode != http.StatusOK { log.Fatalf("Unexpected HTTP response code. Wanted 200 but got %d", response.StatusCode) } var progressBar *pb.ProgressBar contentLength, err := strconv.Atoi(response.Header.Get("Content-Length")) if err == nil { progressBar = pb.New(int(contentLength)) } else { progressBar = pb.New(0) } defer progressBar.Finish() progressBar.ShowSpeed = true progressBar.SetRefreshRate(time.Millisecond * 1000) progressBar.SetUnits(pb.U_BYTES) progressBar.Start() writer := io.MultiWriter(destination, progressBar) io.Copy(writer, response.Body) destination.Close() os.Rename(tempDestinationPath, destinationPath) }