Commit ca45a85e authored by Matthew Slipper's avatar Matthew Slipper

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.
parent fd043d83
---
'@eth-optimism/proxyd': minor
---
Support pattern matching in exempt origins/user agents
...@@ -8,6 +8,7 @@ import ( ...@@ -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 { ...@@ -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( ...@@ -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 ...@@ -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) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment