github.com/status-im/status-go@v1.1.0/services/updates/api.go (about) 1 package updates 2 3 import ( 4 "context" 5 "encoding/json" 6 "fmt" 7 "io/ioutil" 8 "net/http" 9 "time" 10 11 "github.com/hashicorp/go-version" 12 "go.uber.org/zap" 13 14 "github.com/ethereum/go-ethereum/log" 15 "github.com/status-im/status-go/services/ens" 16 "github.com/status-im/status-go/signal" 17 ) 18 19 func NewAPI(ensService *ens.Service) *API { 20 return &API{ 21 ensService: ensService, 22 httpClient: &http.Client{Timeout: time.Minute}, 23 } 24 } 25 26 type API struct { 27 ensService *ens.Service 28 httpClient *http.Client 29 } 30 31 func (api *API) Check(ctx context.Context, chainID uint64, ens string, currentVersion string) { 32 go func() { 33 ctx, cancel := context.WithTimeout(context.Background(), 45*time.Second) 34 defer cancel() 35 36 current, err := version.NewVersion(currentVersion) 37 if err != nil { 38 log.Error("invalid current version", "err", err) 39 return 40 } 41 42 uri, err := api.ensService.API().ResourceURL(ctx, chainID, ens) 43 if err != nil || uri.Host == "" { 44 log.Error("can't get obtain the updates content hash url", "ens", ens) 45 signal.SendUpdateAvailable(false, "", "") 46 return 47 } 48 49 url := uri.Scheme + "://" + uri.Host + uri.Path 50 versionURL := url + "VERSION" 51 response, err := api.httpClient.Get(versionURL) 52 if err != nil { 53 log.Error("can't get content", zap.String("any", versionURL)) 54 signal.SendUpdateAvailable(false, "", "") 55 return 56 } 57 58 defer response.Body.Close() 59 if response.StatusCode != http.StatusOK { 60 log.Error(fmt.Sprintf("version verification response status error: %v", response.StatusCode)) 61 signal.SendUpdateAvailable(false, "", "") 62 return 63 } 64 65 data, err := ioutil.ReadAll(response.Body) 66 if err != nil { 67 log.Error("version verification body err", "err", err) 68 signal.SendUpdateAvailable(false, "", "") 69 return 70 } 71 72 c := make(map[string]interface{}) 73 err = json.Unmarshal(data, &c) 74 if err != nil { 75 log.Error("invalid json", "err", err) 76 signal.SendUpdateAvailable(false, "", "") 77 return 78 } 79 80 latestStr := "" 81 switch c["version"].(type) { 82 case string: 83 latestStr = c["version"].(string) 84 default: 85 log.Error("invalid latest version", "val", c["version"]) 86 signal.SendUpdateAvailable(false, "", "") 87 return 88 } 89 90 latest, err := version.NewVersion(latestStr) 91 if err != nil { 92 log.Error("invalid latest version", "err", err) 93 signal.SendUpdateAvailable(false, "", "") 94 return 95 } 96 97 signal.SendUpdateAvailable(latest.GreaterThan(current), latestStr, url) 98 }() 99 }