Merge pull request #3708 from ethereum-optimism/feat/pattern-origins
proxyd: Support pattern matching in origin and user agent
This commit is contained in:
commit
43f0e88f5b
@ -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