From acc408f0a034c36cb20083af9518adc43e58c6ea Mon Sep 17 00:00:00 2001 From: tickstep studio team Date: Mon, 29 Jun 2026 09:29:05 +0800 Subject: [PATCH] fix download url expired calc error issue #544 #543 #542 --- internal/file/downloader/utils.go | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/internal/file/downloader/utils.go b/internal/file/downloader/utils.go index 4f78b55..e2add24 100644 --- a/internal/file/downloader/utils.go +++ b/internal/file/downloader/utils.go @@ -15,8 +15,6 @@ package downloader import ( "errors" - "github.com/tickstep/library-go/logger" - "github.com/tickstep/library-go/requester" mathrand "math/rand" "mime" "net/url" @@ -24,6 +22,9 @@ import ( "regexp" "strconv" "time" + + "github.com/tickstep/library-go/logger" + "github.com/tickstep/library-go/requester" ) var ( @@ -106,8 +107,24 @@ func IsUrlExpired(urlStr string) bool { if err != nil { return true } - expiredTimeSecStr := u.Query().Get("x-oss-expires") - expiredTimeSec, _ := strconv.ParseInt(expiredTimeSecStr, 10, 64) + // OSS V4签名:x-oss-date=20260629T010316Z&x-oss-expires=900 + expiredDateStr := u.Query().Get("x-oss-date") // 该请求/签名生成的时间 + expiredTimeSecStr := u.Query().Get("x-oss-expires") // Presigned URL 的过期时间(单位:秒) + + // 解析 x-oss-date(ISO8601,UTC) + expiredDate, err := time.Parse("20060102T150405Z", expiredDateStr) + if err != nil { + // 非法时间格式 + return true + } + // 解析 x-oss-expires(秒) + expireSec, err := strconv.ParseInt(expiredTimeSecStr, 10, 64) + if err != nil || expireSec <= 0 { + // 非法过期时间 + return true + } + // 计算过期时间戳(Unix seconds) + expiredTimeSec := expiredDate.Unix() + expireSec if (expiredTimeSec - time.Now().Unix()) <= 5 { // 小于5秒钟 // expired return true