diff --git a/main.go b/main.go index 4f9596b..7e76ec9 100644 --- a/main.go +++ b/main.go @@ -174,8 +174,8 @@ func checkAndDownload() { return } - var data []byte client := &http.Client{} + var downloaded bool for i := 0; i < maxRetries; i++ { resp, err := client.Get(downloadURL) @@ -185,30 +185,37 @@ func checkAndDownload() { continue } - data, err = io.ReadAll(resp.Body) + tmpFile := filePath + ".tmp" + f, err := os.Create(tmpFile) + if err != nil { + resp.Body.Close() + log.Printf("Attempt %d: failed to create file: %v", i+1, err) + time.Sleep(time.Duration(i+1) * 10 * time.Second) + continue + } + + written, err := io.Copy(f, resp.Body) + f.Close() resp.Body.Close() - if err == nil && len(data) > 10000000 { + if err == nil && written > 10000000 { + os.Rename(tmpFile, filePath) + os.WriteFile(sha256File, []byte(sha256), 0644) + log.Printf("Downloaded: %s (%.2f MB)", filename, float64(written)/1024/1024) + downloaded = true break } - log.Printf("Attempt %d: invalid response (size: %d bytes)", i+1, len(data)) + os.Remove(tmpFile) + log.Printf("Attempt %d: invalid response (size: %d bytes)", i+1, written) time.Sleep(time.Duration(i+1) * 10 * time.Second) } - if len(data) < 10000000 { + if !downloaded { log.Println("All download attempts failed") return } - if err := os.WriteFile(filePath, data, 0644); err != nil { - log.Printf("Error saving file: %v", err) - return - } - - os.WriteFile(sha256File, []byte(sha256), 0644) - - log.Printf("Downloaded: %s (%.2f MB)", filename, float64(len(data))/1024/1024) cleanupOldVersions() }