feat: support for using Flag-Filter request headers to filter the flags that the client expects to receive (#64)

This commit is contained in:
whw1sfb
2023-03-24 22:50:20 +08:00
committed by Li4n0
parent 1572171448
commit b33de11ba8
+21 -2
View File
@@ -1,8 +1,10 @@
package server package server
import ( import (
"regexp"
"sync" "sync"
"github.com/gin-contrib/sse"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/li4n0/revsuit/internal/database" "github.com/li4n0/revsuit/internal/database"
"github.com/li4n0/revsuit/internal/file" "github.com/li4n0/revsuit/internal/file"
@@ -44,6 +46,8 @@ func (revsuit *Revsuit) addClient(c *gin.Context) int {
revsuit.clientID++ revsuit.clientID++
revsuit.clients[revsuit.clientID] = c revsuit.clients[revsuit.clientID] = c
sse.Event{}.WriteContentType(c.Writer)
c.Writer.Flush()
revsuit.clientsNum <- struct{}{} revsuit.clientsNum <- struct{}{}
return revsuit.clientID return revsuit.clientID
} }
@@ -231,8 +235,23 @@ func (revsuit *Revsuit) Run() {
<-revsuit.clientsNum <-revsuit.clientsNum
revsuit.clientsLock.RLock() revsuit.clientsLock.RLock()
for _, client := range revsuit.clients { for _, client := range revsuit.clients {
client.SSEvent("message", r.GetFlag()) pushIt := false
client.Writer.Flush() flag := client.Request.Header.Get("Flag-Filter")
if len(flag) == 0 || flag == "*" {
pushIt = true
} else {
if catcher, err := regexp.Compile(flag); err != nil {
log.Warn("%s[sse flag:%s]", err, flag)
continue
} else {
matched := catcher.FindStringSubmatch(r.GetFlag())
pushIt = len(matched) > 0
}
}
if pushIt {
client.SSEvent("message", r.GetFlag())
client.Writer.Flush()
}
} }
revsuit.clientsNum <- struct{}{} revsuit.clientsNum <- struct{}{}
revsuit.clientsLock.RUnlock() revsuit.clientsLock.RUnlock()