From b318e7662348a131771bae76294875c56cf40882 Mon Sep 17 00:00:00 2001 From: XOF Date: Mon, 15 Dec 2025 04:11:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20proxy/session.go?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- proxy/session.go | 74 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 proxy/session.go diff --git a/proxy/session.go b/proxy/session.go new file mode 100644 index 0000000..285b18d --- /dev/null +++ b/proxy/session.go @@ -0,0 +1,74 @@ +package proxy + +import ( + "crypto/rand" + "encoding/hex" + "sync" + "time" +) + +type ProxySession struct { + Token string + TargetURL string + Created time.Time + Expires time.Time +} + +type ProxySessionManager struct { + sessions sync.Map + ttl time.Duration +} + +func NewProxySessionManager(ttl time.Duration) *ProxySessionManager { + sm := &ProxySessionManager{ttl: ttl} + go sm.cleanup() + return sm +} + +func (sm *ProxySessionManager) Create(targetURL string) string { + token := generateToken() + + sm.sessions.Store(token, &ProxySession{ + Token: token, + TargetURL: targetURL, + Created: time.Now(), + Expires: time.Now().Add(sm.ttl), + }) + + return token +} + +func (sm *ProxySessionManager) Get(token string) *ProxySession { + val, ok := sm.sessions.Load(token) + if !ok { + return nil + } + + session := val.(*ProxySession) + if time.Now().After(session.Expires) { + sm.sessions.Delete(token) + return nil + } + + return session +} + +func (sm *ProxySessionManager) cleanup() { + ticker := time.NewTicker(5 * time.Minute) + for range ticker.C { + now := time.Now() + sm.sessions.Range(func(key, value interface{}) bool { + session := value.(*ProxySession) + if now.After(session.Expires) { + sm.sessions.Delete(key) + } + return true + }) + } +} + +func generateToken() string { + b := make([]byte, 16) + rand.Read(b) + return hex.EncodeToString(b) +}