Simplify updateLastSeen/cleanLastSeen

This commit is contained in:
Neil Alexander 2020-11-20 11:12:47 +00:00
parent f80e098a71
commit 41836019d4
No known key found for this signature in database
GPG key ID: A02A2019A2BB0944

View file

@ -21,6 +21,7 @@ import (
"fmt" "fmt"
"net" "net"
"net/http" "net/http"
"strings"
"sync" "sync"
"time" "time"
@ -61,11 +62,8 @@ func NewRequestPool(
func (rp *RequestPool) cleanLastSeen() { func (rp *RequestPool) cleanLastSeen() {
for { for {
rp.lastseen.Range(func(key interface{}, value interface{}) bool { rp.lastseen.Range(func(key interface{}, _ interface{}) bool {
lastseen := value.(time.Time) rp.lastseen.Delete(key)
if time.Since(lastseen) > time.Minute*2 {
rp.lastseen.Delete(key)
}
return true return true
}) })
time.Sleep(time.Minute) time.Sleep(time.Minute)
@ -73,17 +71,19 @@ func (rp *RequestPool) cleanLastSeen() {
} }
func (rp *RequestPool) updateLastSeen(req *http.Request, device *userapi.Device) { func (rp *RequestPool) updateLastSeen(req *http.Request, device *userapi.Device) {
value, _ := rp.lastseen.LoadOrStore(device.UserID+device.ID, time.Now().Add(-time.Minute)) if _, ok := rp.lastseen.LoadOrStore(device.UserID+device.ID, struct{}{}); ok {
lastseen := value.(time.Time)
if time.Since(lastseen) < time.Minute {
return return
} }
remoteAddr := req.RemoteAddr remoteAddr := req.RemoteAddr
if rp.cfg.RealIPHeader != "" { if rp.cfg.RealIPHeader != "" {
if realIP := req.Header.Get(rp.cfg.RealIPHeader); realIP != "" { if header := req.Header.Get(rp.cfg.RealIPHeader); header != "" {
if ip := net.ParseIP(realIP); ip != nil { // TODO: Maybe this isn't great but it will satisfy both X-Real-IP
remoteAddr = realIP // and X-Forwarded-For (which can be a list where the real client
// address is the first listed address). Make more intelligent?
addresses := strings.Split(header, ",")
if ip := net.ParseIP(addresses[0]); ip != nil {
remoteAddr = addresses[0]
} }
} }
} }