59 lines
1.2 KiB
Go
59 lines
1.2 KiB
Go
package updates
|
|
|
|
import (
|
|
"context"
|
|
"crypto/sha256"
|
|
"encoding/hex"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
"os"
|
|
)
|
|
|
|
type HTTPDownloader struct {
|
|
client *http.Client
|
|
}
|
|
|
|
func NewHTTPDownloader(client *http.Client) *HTTPDownloader {
|
|
if client == nil {
|
|
client = http.DefaultClient
|
|
}
|
|
return &HTTPDownloader{client: client}
|
|
}
|
|
|
|
func (downloader *HTTPDownloader) Download(ctx context.Context, artifact Artifact) (DownloadedFile, error) {
|
|
request, err := http.NewRequestWithContext(ctx, http.MethodGet, artifact.URL, nil)
|
|
if err != nil {
|
|
return DownloadedFile{}, err
|
|
}
|
|
|
|
response, err := downloader.client.Do(request)
|
|
if err != nil {
|
|
return DownloadedFile{}, err
|
|
}
|
|
defer response.Body.Close()
|
|
|
|
if response.StatusCode < 200 || response.StatusCode >= 300 {
|
|
return DownloadedFile{}, fmt.Errorf("unexpected download status: %s", response.Status)
|
|
}
|
|
|
|
file, err := os.CreateTemp("", "wails3kit-download-*")
|
|
if err != nil {
|
|
return DownloadedFile{}, err
|
|
}
|
|
defer file.Close()
|
|
|
|
hash := sha256.New()
|
|
written, err := io.Copy(io.MultiWriter(file, hash), response.Body)
|
|
if err != nil {
|
|
_ = os.Remove(file.Name())
|
|
return DownloadedFile{}, err
|
|
}
|
|
|
|
return DownloadedFile{
|
|
Path: file.Name(),
|
|
Size: written,
|
|
SHA256: hex.EncodeToString(hash.Sum(nil)),
|
|
}, nil
|
|
}
|