Pārlūkot izejas kodu

Using “lib” version

pezcurrel 1 mēnesi atpakaļ
vecāks
revīzija
718b359b74
1 mainītis faili ar 23 papildinājumiem un 33 dzēšanām
  1. 23 33
      lib/ckratelimit.php

+ 23 - 33
lib/ckratelimit.php

@@ -1,36 +1,26 @@
 <?php
-function ckratelimit($headers,$echofun,$onlyret=false,$verbose=false) {//$echofun has to be the name of a defined function to pass messages to
-	$ret=null;
-	if (is_array($headers)) {
-		//echo "ckratelimit: {$headers}: ".print_r($headers,true));
-		$buff=[];
-		array_shift($headers);
-		foreach ($headers as $header)
-			if (preg_match('/^([^:]+):(.*)$/Uu',$header,$matches)===1)
-				$buff[$matches[1]]=trim($matches[2]);
-		$headers=$buff;
-		//print_r($headers);
-		if (isset($headers['Date']) && isset($headers['X-RateLimit-Reset']) && isset($headers['X-RateLimit-Remaining'])) {
-			//Wed, 30 Mar 2022 21:27:22 GMT
-			$srvnow=strtotime($headers['Date']);
-			//2022-03-31T04:05:00.058705Z
-			$srvrlreset=strtotime($headers['X-RateLimit-Reset']);
-			$srvrlremain=$headers['X-RateLimit-Remaining'];
-			$secstoreset=$srvrlreset-$srvnow;
-			$ret=['remaining'=>$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];
 }
 ?>