continue;
}
- $throttleKey = $this->cache->makeGlobalKey( 'throttler', $this->type, $index, $ipKey, $userKey );
+ $throttleKey = $this->cache->makeGlobalKey(
+ 'throttler',
+ $this->type,
+ $index,
+ $ipKey,
+ $userKey
+ );
$throttleCount = $this->cache->get( $throttleKey );
-
- if ( !$throttleCount ) { // counter not started yet
- $this->cache->add( $throttleKey, 1, $expiry );
- } elseif ( $throttleCount < $count ) { // throttle limited not yet reached
- $this->cache->incr( $throttleKey );
- } else { // throttled
+ if ( $throttleCount && $throttleCount >= $count ) {
+ // Throttle limited reached
$this->logRejection( [
'throttle' => $this->type,
'index' => $index,
// @codeCoverageIgnoreEnd
] );
- return [
- 'throttleIndex' => $index,
- 'count' => $count,
- 'wait' => $expiry,
- ];
+ return [ 'throttleIndex' => $index, 'count' => $count, 'wait' => $expiry ];
+ } else {
+ $this->cache->incrWithInit( $throttleKey, $expiry, 1 );
}
}
+
return false;
}
*/
public function incrMissesRecent( WebRequest $request ) {
if ( mt_rand( 0, self::MISS_FACTOR - 1 ) == 0 ) {
- $cache = ObjectCache::getLocalClusterInstance();
# Get a large IP range that should include the user even if that
# person's IP address changes
$ip = $request->getIP();
if ( !IP::isValid( $ip ) ) {
return;
}
+
$ip = IP::isIPv6( $ip )
? IP::sanitizeRange( "$ip/32" )
: IP::sanitizeRange( "$ip/16" );
# Bail out if a request already came from this range...
+ $cache = ObjectCache::getLocalClusterInstance();
$key = $cache->makeKey( static::class, 'attempt', $this->mType, $this->mKey, $ip );
- if ( $cache->get( $key ) ) {
+ if ( !$cache->add( $key, 1, self::MISS_TTL_SEC ) ) {
return; // possibly the same user
}
- $cache->set( $key, 1, self::MISS_TTL_SEC );
# Increment the number of cache misses...
- $key = $this->cacheMissKey( $cache );
- if ( $cache->get( $key ) === false ) {
- $cache->set( $key, 1, self::MISS_TTL_SEC );
- } else {
- $cache->incr( $key );
- }
+ $cache->incrWithInit( $this->cacheMissKey( $cache ), self::MISS_TTL_SEC );
}
}
$summary = "(limit $max in {$period}s)";
$count = $cache->get( $key );
// Already pinged?
- if ( $count ) {
- if ( $count >= $max ) {
- wfDebugLog( 'ratelimit', "User '{$this->getName()}' " .
- "(IP {$this->getRequest()->getIP()}) tripped $key at $count $summary" );
- $triggered = true;
- } else {
- wfDebug( __METHOD__ . ": ok. $key at $count $summary\n" );
- }
+ if ( $count && $count >= $max ) {
+ wfDebugLog( 'ratelimit', "User '{$this->getName()}' " .
+ "(IP {$this->getRequest()->getIP()}) tripped $key at $count $summary" );
+ $triggered = true;
} else {
wfDebug( __METHOD__ . ": adding record for $key $summary\n" );
if ( $incrBy > 0 ) {
}
}
if ( $incrBy > 0 ) {
- $cache->incr( $key, $incrBy );
+ $cache->incrWithInit( $key, (int)$period, $incrBy, $incrBy );
}
}