feat: initial commit
This commit is contained in:
58
pkg/wails3kit/updates/downloader.go
Normal file
58
pkg/wails3kit/updates/downloader.go
Normal file
@@ -0,0 +1,58 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user