diff --git a/lib/ckratelimit.php b/lib/ckratelimit.php index 184bbfd..b8ae8b1 100644 --- a/lib/ckratelimit.php +++ b/lib/ckratelimit.php @@ -1,36 +1,26 @@ $srvrlremain,'secstoreset'=>$secstoreset]; - if ($onlyret) - return $ret; - if ($verbose) $echofun("ckratelimit: X-RateLimit-Remaining: {$srvrlremain}; server time: {$srvnow}: ".gmdate('c',$srvnow).'; X-RateLimit-Reset: '.gmdate('c',$srvrlreset).'; current seconds before reset: '.$secstoreset.".\n"); - if ($srvrlremain==0) { - $echofun("Reached rate limit, waiting {$secstoreset} seconds for rate limit reset ...\n"); - sleep($secstoreset); - } - } else { - if ($verbose) $echofun("ckratelimit: no «Date» / «X-RateLimit-Reset» / «X-RateLimit-Remaining» header(s)!\n"); - } - } else { - if ($verbose) $echofun("ckratelimit: headers is not an array!\n"); - } - return $ret; +function ckratelimit($headers) { + $aaheaders=[]; + array_shift($headers); + foreach ($headers as $header) + if (preg_match('#^([^:]+): (.*)$#',$header,$matches)===1) + $aaheaders[strtolower($matches[1])]=$matches[2]; + //$aaheaders['x-ratelimit-remaining']=0; + //print_r($aaheaders); + if (!isset($aaheaders['date'])) return ['ok'=>false,'error'=>'no «date» header']; + if (!isset($aaheaders['x-ratelimit-reset'])) return ['ok'=>false,'error'=>'no «x-ratelimit-reset» header']; + if (!isset($aaheaders['x-ratelimit-remaining'])) return ['ok'=>false,'error'=>'no «x-ratelimit-remaining» header']; + if (preg_match('#^\d+$#',$aaheaders['x-ratelimit-remaining'])!==1) return ['ok'=>false,'error'=>'«x-ratelimit-remaining» header is not an integer']; + $remaining=$aaheaders['x-ratelimit-remaining']+0; + $date=@strtotime($aaheaders['date']); + if (!is_int($date)) return ['ok'=>false,'error'=>'«date» header could not be converted to a unix timestamp']; + $reset=@strtotime($aaheaders['x-ratelimit-reset']); + if (!is_int($reset)) return ['ok'=>false,'error'=>'«x-ratelimit-reset» header could not be converted to a unix timestamp']; + // don't do the one on the line below, since it happens lots of times + //if ($reset<$date) return ['ok'=>false,'error'=>'the unix timestamp parsed from «x-ratelimit-reset» header is less than the unix timestamp parsed from «date» header']; + if ($remaining==0) + return ['ok'=>true,'sleep'=>$reset-$date+1,'remaining'=>$remaining]; + else + return ['ok'=>true,'sleep'=>0,'remaining'=>$remaining]; } ?>