Using “lib” version

This commit is contained in:
pezcurrel 2024-08-27 20:00:32 +02:00
parent 9b3e2cb1d8
commit 718b359b74

View file

@ -1,36 +1,26 @@
<?php <?php
function ckratelimit($headers,$echofun,$onlyret=false,$verbose=false) {//$echofun has to be the name of a defined function to pass messages to function ckratelimit($headers) {
$ret=null; $aaheaders=[];
if (is_array($headers)) {
//echo "ckratelimit: {$headers}: ".print_r($headers,true));
$buff=[];
array_shift($headers); array_shift($headers);
foreach ($headers as $header) foreach ($headers as $header)
if (preg_match('/^([^:]+):(.*)$/Uu',$header,$matches)===1) if (preg_match('#^([^:]+): (.*)$#',$header,$matches)===1)
$buff[$matches[1]]=trim($matches[2]); $aaheaders[strtolower($matches[1])]=$matches[2];
$headers=$buff; //$aaheaders['x-ratelimit-remaining']=0;
//print_r($headers); //print_r($aaheaders);
if (isset($headers['Date']) && isset($headers['X-RateLimit-Reset']) && isset($headers['X-RateLimit-Remaining'])) { if (!isset($aaheaders['date'])) return ['ok'=>false,'error'=>'no «date» header'];
//Wed, 30 Mar 2022 21:27:22 GMT if (!isset($aaheaders['x-ratelimit-reset'])) return ['ok'=>false,'error'=>'no «x-ratelimit-reset» header'];
$srvnow=strtotime($headers['Date']); if (!isset($aaheaders['x-ratelimit-remaining'])) return ['ok'=>false,'error'=>'no «x-ratelimit-remaining» header'];
//2022-03-31T04:05:00.058705Z if (preg_match('#^\d+$#',$aaheaders['x-ratelimit-remaining'])!==1) return ['ok'=>false,'error'=>'«x-ratelimit-remaining» header is not an integer'];
$srvrlreset=strtotime($headers['X-RateLimit-Reset']); $remaining=$aaheaders['x-ratelimit-remaining']+0;
$srvrlremain=$headers['X-RateLimit-Remaining']; $date=@strtotime($aaheaders['date']);
$secstoreset=$srvrlreset-$srvnow; if (!is_int($date)) return ['ok'=>false,'error'=>'«date» header could not be converted to a unix timestamp'];
$ret=['remaining'=>$srvrlremain,'secstoreset'=>$secstoreset]; $reset=@strtotime($aaheaders['x-ratelimit-reset']);
if ($onlyret) if (!is_int($reset)) return ['ok'=>false,'error'=>'«x-ratelimit-reset» header could not be converted to a unix timestamp'];
return $ret; // don't do the one on the line below, since it happens lots of times
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 ($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 ($srvrlremain==0) { if ($remaining==0)
$echofun("Reached rate limit, waiting {$secstoreset} seconds for rate limit reset ...\n"); return ['ok'=>true,'sleep'=>$reset-$date+1,'remaining'=>$remaining];
sleep($secstoreset); else
} return ['ok'=>true,'sleep'=>0,'remaining'=>$remaining];
} 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;
} }
?> ?>