From 9735d26b3dbcf2cf514f3cd8eb41f7e30039aa0e Mon Sep 17 00:00:00 2001 From: MHSanaei Date: Sun, 10 May 2026 00:24:25 +0200 Subject: [PATCH] perf(xray): bound Xray-version request and extend cache Replace the unbounded http.Get used by GetXrayVersions with a 10s- timeout client so a slow or unreachable GitHub can't hang the Xray Updates modal. Bump the controller cache from 60s to 15 minutes, and on a request error fall back to the last successful list when one is available. --- web/controller/server.go | 10 ++++++++-- web/service/server.go | 4 +++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/web/controller/server.go b/web/controller/server.go index 146c94cd..15b1188c 100644 --- a/web/controller/server.go +++ b/web/controller/server.go @@ -143,16 +143,22 @@ func (a *ServerController) getMetricHistoryBucket(c *gin.Context) { jsonObj(c, a.serverService.AggregateSystemMetric(metric, bucket, 60), nil) } -// getXrayVersion retrieves available Xray versions, with caching for 1 minute. func (a *ServerController) getXrayVersion(c *gin.Context) { + const cacheTTLSeconds = 15 * 60 + now := time.Now().Unix() - if now-a.lastGetVersionsTime <= 60 { // 1 minute cache + if a.lastVersions != nil && now-a.lastGetVersionsTime <= cacheTTLSeconds { jsonObj(c, a.lastVersions, nil) return } versions, err := a.serverService.GetXrayVersions() if err != nil { + if a.lastVersions != nil { + logger.Warning("getXrayVersion failed; serving cached list:", err) + jsonObj(c, a.lastVersions, nil) + return + } jsonMsg(c, I18nWeb(c, "getVersion"), err) return } diff --git a/web/service/server.go b/web/service/server.go index d3caf3aa..b2e04370 100644 --- a/web/service/server.go +++ b/web/service/server.go @@ -492,13 +492,15 @@ func (s *ServerService) sampleCPUUtilization() (float64, error) { return s.emaCPU, nil } +var xrayVersionsClient = &http.Client{Timeout: 10 * time.Second} + func (s *ServerService) GetXrayVersions() ([]string, error) { const ( XrayURL = "https://api.github.com/repos/XTLS/Xray-core/releases" bufferSize = 8192 ) - resp, err := http.Get(XrayURL) + resp, err := xrayVersionsClient.Get(XrayURL) if err != nil { return nil, err }