class IPstats:
def __init__(self):
+ self.redirected = 0
self.short_total = 0
self.short_api = 0
self.long_total = 0
self.bad_ua = False
def add_long(self, logentry):
+ if logentry.retcode == 301:
+ return
self.long_total += 1
if logentry.request is not None:
self.long_api += 1
def add_short(self, logentry):
self.short_total += 1
+ if logentry.retcode == 301:
+ self.redirected += 1
+ return
if logentry.request is not None:
self.short_api += 1
self.add_long(logentry)
# deblock only if the IP has been really quiet
# (properly catches the ones that simply ignore the HTTP error)
return None if self.long_total < 20 else 'block'
- if self.long_api > BLOCK_UPPER or self.short_api > BLOCK_UPPER / 3:
+ if self.long_api > BLOCK_UPPER \
+ or self.short_api > BLOCK_UPPER / 3 \
+ or self.short_total == self.redirected:
# client totally overdoing it
return 'block'
if was_bulked: