Documentation ¶
Index ¶
- Constants
- Variables
- func CreateDatastoreBackedLimitter(pClient *datastore.Client, pTrackerKind string, ...) func(c *gin.Context)
- func CreateDatastoreBackedLimitterHandler(client *datastore.Client, trackerKind string, ...) func(c *gin.Context)
- func CreateDatastoreBackedLimitterMiddleware(client *datastore.Client, trackerKind string, ...) func(c *gin.Context)
- func CreateRedisBackedLimitter(pUserIdExtractor func(c *gin.Context) string, pConfig *LimitterConfig, ...) func(c *gin.Context)
- func CreateRedisBackedLimitterHandler(getUserIdFromContext func(c *gin.Context) string, ...) func(c *gin.Context)
- func CreateRedisBackedLimitterMiddleware(getUserIdFromContext func(c *gin.Context) string, ...) func(c *gin.Context)
- func CreateRedisTrackerKey(pUserId string, pUrl string) string
- func CreateTrackerName(userId string, url string) string
- func GetUserIdFromContextByField(userIdField string) func(c *gin.Context) string
- func InitRedis(pKeyPrefix string, pEnvironment string, pRedisServerAddress string, ...)
- func ProcessValidateResult(validateError error, c *gin.Context, isMiddleware bool)
- func SaveRedisRequestTracker(ctx context.Context, rClient *redis.Client, tracker *RequestTracker, ...) error
- func ValidateRequest(tracker *RequestTracker, currentTime time.Time, requestURL string, ...) error
- type LimitterConfig
- type RequestTracker
- func LoadRedisRequestTracker(ctx context.Context, rClient *redis.Client, userId string, url string) (*RequestTracker, error)
- func LoadUserTracker(Client *datastore.Client, TrackerKind string, URL string, UserId string) (*datastore.Key, *RequestTracker, error)
- func NewRequestTracker(uid string, url string) *RequestTracker
- func NewRequestTrackerWithExpiration(uid string, url string, expiration time.Time) *RequestTracker
- func (tracker *RequestTracker) IsRequestTooFast(currentTime time.Time, requestMinIntervalMilis int64) bool
- func (tracker *RequestTracker) IsRequestTooFrequently(currentTime time.Time, maxRequestPerWindow int64) bool
- func (tracker *RequestTracker) String() string
- func (tracker *RequestTracker) UpdateRequest(currentTime time.Time, config *LimitterConfig)
- func (tracker *RequestTracker) UpdateWindow(currentTime time.Time, windowMilis int64)
Constants ¶
const DefaultRequestTrackingWindowMilis int64 = 60000
const DefaultSessionExpirationSeconds int64 = 3600
const MIN_REQUEST_INTERVAL_MILIS int64 = 200
const VALIDATE_RESULT_FAILED int = -3
const VALIDATE_RESULT_TOO_FAST int = -1
const VALIDATE_RESULT_TOO_FREQUENTLY int = -2
const VALIDATE_RESULT_VALID int = 1
Variables ¶
var ErrorRequestTooFast = fmt.Errorf("request is too fast")
var ErrorRequestTooFreequently = fmt.Errorf("request is too freequently")
Functions ¶
func CreateDatastoreBackedLimitterHandler ¶ added in v0.2.3
func CreateDatastoreBackedLimitterHandler(client *datastore.Client, trackerKind string, getUserIdFromContext func(c *gin.Context) string, minRequestIntervalMilis int64, windowFrameMilis int64, maxRequestInWindow int, sessionExpirationSeconds int64) func(c *gin.Context)
CreateDatastoreBackedLimitter returns a limitter with given config as middleware.
Limitter aborts gin context if validating failed. If limitter has internal error, it will leaves the context run by calling c.Next() Params:
trackerKind: Kind of tracker in datastore
GetUserIdFromContext: Function to extract userid from a gin context
minRequestIntervalMilis: Minimum time between 2 requests, 0 means no limit
windowFrameMilis: Window frame in miliseconds, 0 means no limit
maxRequestInWindow: Max request in a window frame
func CreateDatastoreBackedLimitterMiddleware ¶ added in v0.2.3
func CreateDatastoreBackedLimitterMiddleware(client *datastore.Client, trackerKind string, getUserIdFromContext func(c *gin.Context) string, minRequestIntervalMilis int64, windowFrameMilis int64, maxRequestInWindow int, sessionExpirationSeconds int64) func(c *gin.Context)
CreateDatastoreBackedLimitter returns a limitter with given config as middleware.
Limitter aborts gin context if validating failed. If limitter has internal error, it will leaves the context run by calling c.Next() Params:
trackerKind: Kind of tracker in datastore
GetUserIdFromContext: Function to extract userid from a gin context
minRequestIntervalMilis: Minimum time between 2 requests, 0 means no limit
windowFrameMilis: Window frame in miliseconds, 0 means no limit
maxRequestInWindow: Max request in a window frame
func CreateRedisBackedLimitter ¶ added in v0.2.4
func CreateRedisBackedLimitterHandler ¶ added in v0.2.4
func CreateRedisBackedLimitterMiddleware ¶ added in v0.2.4
func CreateRedisTrackerKey ¶ added in v0.2.0
func CreateTrackerName ¶ added in v0.0.4
CreateTrackerName returns key of tracker based on userId and request URL. Key is a hash string to prevent invalid key in datastore
func GetUserIdFromContextByField ¶
GetUserIdFromContextByField extracts userId from a gin context by property name
func ProcessValidateResult ¶
ProcessValidateResult aborts gin context if there is an error, let gin context run otherwise
func SaveRedisRequestTracker ¶ added in v0.2.0
func SaveRedisRequestTracker(ctx context.Context, rClient *redis.Client, tracker *RequestTracker, expireSecond int64) error
func ValidateRequest ¶
func ValidateRequest(tracker *RequestTracker, currentTime time.Time, requestURL string, requestClientIP string, limitterConfig *LimitterConfig) error
ValidateRequest returns nil if request is valid, an error means invalid request
Types ¶
type LimitterConfig ¶ added in v0.0.3
type LimitterConfig struct { //Time between 2 requests in milisecs. 0 means no limit MinRequestInterval int64 //Window frame in milisec. Value 0 means no limit WindowSize int64 //Max requests per window MaxRequestPerWindow int64 //If true, error when save/load tracker will abort request //If false, request will be served even if save/load tracker error AbortOnFail bool //ExpSec is sesion expiration in seconds ExpSec int64 }
func (*LimitterConfig) CreateExpiration ¶ added in v0.1.2
func (config *LimitterConfig) CreateExpiration(Now time.Time) time.Time
type RequestTracker ¶
type RequestTracker struct { UID string `redis:"uid" datastore:"uid"` URL string `redis:"url" datastore:"url"` //WindowNum is index of current window WindowNum int64 `redis:"winNum" datastore:"winNum"` //WindowRequest is calls of request in current window WindowRequest int64 `redis:"winReq" datastore:"winReq"` //Last time request in millisec LastCall int64 `redis:"last" datastore:"last"` //Exp is expiration of this tracker as unix millisecond Exp int64 `redis:"exp" datastore:"exp"` }
----------------------------------------------------------------------------------------------------
func LoadRedisRequestTracker ¶ added in v0.2.0
func LoadUserTracker ¶ added in v0.0.5
func LoadUserTracker(Client *datastore.Client, TrackerKind string, URL string, UserId string) (*datastore.Key, *RequestTracker, error)
LoadUserTracker returns a tracker
func NewRequestTracker ¶ added in v0.2.0
func NewRequestTracker(uid string, url string) *RequestTracker
func NewRequestTrackerWithExpiration ¶ added in v0.2.0
func NewRequestTrackerWithExpiration(uid string, url string, expiration time.Time) *RequestTracker
func (*RequestTracker) IsRequestTooFast ¶
func (tracker *RequestTracker) IsRequestTooFast(currentTime time.Time, requestMinIntervalMilis int64) bool
func (*RequestTracker) IsRequestTooFrequently ¶
func (tracker *RequestTracker) IsRequestTooFrequently(currentTime time.Time, maxRequestPerWindow int64) bool
func (*RequestTracker) String ¶ added in v0.1.3
func (tracker *RequestTracker) String() string
func (*RequestTracker) UpdateRequest ¶
func (tracker *RequestTracker) UpdateRequest(currentTime time.Time, config *LimitterConfig)
func (*RequestTracker) UpdateWindow ¶
func (tracker *RequestTracker) UpdateWindow(currentTime time.Time, windowMilis int64)