proxyd: Support pattern matching in origin and user agent
Adds support for pattern matchin in exempt origins. This should help with some of the issues Synthetix and others are seeing.
This commit is contained in:
parent
24a3668bc8
commit
fe8a89e61d
@ -8,6 +8,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"math"
|
"math"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
@ -49,8 +50,8 @@ type Server struct {
|
|||||||
upgrader *websocket.Upgrader
|
upgrader *websocket.Upgrader
|
||||||
mainLim FrontendRateLimiter
|
mainLim FrontendRateLimiter
|
||||||
overrideLims map[string]FrontendRateLimiter
|
overrideLims map[string]FrontendRateLimiter
|
||||||
limExemptOrigins map[string]bool
|
limExemptOrigins []*regexp.Regexp
|
||||||
limExemptUserAgents map[string]bool
|
limExemptUserAgents []*regexp.Regexp
|
||||||
rpcServer *http.Server
|
rpcServer *http.Server
|
||||||
wsServer *http.Server
|
wsServer *http.Server
|
||||||
cache RPCCache
|
cache RPCCache
|
||||||
@ -104,15 +105,23 @@ func NewServer(
|
|||||||
}
|
}
|
||||||
|
|
||||||
var mainLim FrontendRateLimiter
|
var mainLim FrontendRateLimiter
|
||||||
limExemptOrigins := make(map[string]bool)
|
limExemptOrigins := make([]*regexp.Regexp, 0)
|
||||||
limExemptUserAgents := make(map[string]bool)
|
limExemptUserAgents := make([]*regexp.Regexp, 0)
|
||||||
if rateLimitConfig.BaseRate > 0 {
|
if rateLimitConfig.BaseRate > 0 {
|
||||||
mainLim = limiterFactory(time.Duration(rateLimitConfig.BaseInterval), rateLimitConfig.BaseRate, "main")
|
mainLim = limiterFactory(time.Duration(rateLimitConfig.BaseInterval), rateLimitConfig.BaseRate, "main")
|
||||||
for _, origin := range rateLimitConfig.ExemptOrigins {
|
for _, origin := range rateLimitConfig.ExemptOrigins {
|
||||||
limExemptOrigins[strings.ToLower(origin)] = true
|
pattern, err := regexp.Compile(origin)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
limExemptOrigins = append(limExemptOrigins, pattern)
|
||||||
}
|
}
|
||||||
for _, agent := range rateLimitConfig.ExemptUserAgents {
|
for _, agent := range rateLimitConfig.ExemptUserAgents {
|
||||||
limExemptUserAgents[strings.ToLower(agent)] = true
|
pattern, err := regexp.Compile(agent)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
limExemptUserAgents = append(limExemptUserAgents, pattern)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
mainLim = NoopFrontendRateLimiter
|
mainLim = NoopFrontendRateLimiter
|
||||||
@ -548,11 +557,22 @@ func (s *Server) populateContext(w http.ResponseWriter, r *http.Request) context
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) isUnlimitedOrigin(origin string) bool {
|
func (s *Server) isUnlimitedOrigin(origin string) bool {
|
||||||
return s.limExemptOrigins[strings.ToLower(origin)]
|
for _, pat := range s.limExemptOrigins {
|
||||||
|
if pat.MatchString(origin) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) isUnlimitedUserAgent(origin string) bool {
|
func (s *Server) isUnlimitedUserAgent(origin string) bool {
|
||||||
return s.limExemptUserAgents[strings.ToLower(origin)]
|
for _, pat := range s.limExemptUserAgents {
|
||||||
|
if pat.MatchString(origin) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func setCacheHeader(w http.ResponseWriter, cached bool) {
|
func setCacheHeader(w http.ResponseWriter, cached bool) {
|
||||||
|
Loading…
Reference in New Issue
Block a user