go-update/generic_http.go
Snider 3b328137db fix: replace fmt.Errorf and errors.New with coreerr.E() from go-log
Replace all remaining fmt.Errorf and errors.New calls in production code
with coreerr.E() for consistent error handling with context information.
This improves error messages by including the function context where
errors occur.

Modified files:
- github.go: 6 fmt.Errorf calls
- generic_http.go: 5 fmt.Errorf calls
- updater.go: 6 fmt.Errorf calls
- service.go: 4 fmt.Errorf calls
- github_test.go: Updated test expectation for new error format

All tests pass with the new error format.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-16 21:49:04 +00:00

57 lines
1.7 KiB
Go

package updater
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
coreerr "forge.lthn.ai/core/go-log"
)
// GenericUpdateInfo holds the information from a latest.json file.
// This file is expected to be at the root of a generic HTTP update server.
type GenericUpdateInfo struct {
Version string `json:"version"` // The version number of the update.
URL string `json:"url"` // The URL to download the update from.
}
// GetLatestUpdateFromURL fetches and parses a latest.json file from a base URL.
// The server at the baseURL should host a 'latest.json' file that contains
// the version and download URL for the latest update.
//
// Example of latest.json:
//
// {
// "version": "1.2.3",
// "url": "https://your-server.com/path/to/release-asset"
// }
func GetLatestUpdateFromURL(baseURL string) (*GenericUpdateInfo, error) {
u, err := url.Parse(baseURL)
if err != nil {
return nil, coreerr.E("GetLatestUpdateFromURL", "invalid base URL", err)
}
// Append latest.json to the path
u.Path += "/latest.json"
resp, err := http.Get(u.String())
if err != nil {
return nil, coreerr.E("GetLatestUpdateFromURL", "failed to fetch latest.json", err)
}
defer func() { _ = resp.Body.Close() }()
if resp.StatusCode != http.StatusOK {
return nil, coreerr.E("GetLatestUpdateFromURL", fmt.Sprintf("failed to fetch latest.json: status code %d", resp.StatusCode), nil)
}
var info GenericUpdateInfo
if err := json.NewDecoder(resp.Body).Decode(&info); err != nil {
return nil, coreerr.E("GetLatestUpdateFromURL", "failed to parse latest.json", err)
}
if info.Version == "" || info.URL == "" {
return nil, coreerr.E("GetLatestUpdateFromURL", "invalid latest.json content: version or url is missing", nil)
}
return &info, nil
}