| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 | <?phpnamespace Qiniu\Http\Middleware;use Qiniu\Http\Request;use Qiniu\Http\Response;class RetryDomainsMiddleware implements Middleware{    /**     * @var array<string> backup domains.     */    private $backupDomains;    /**     * @var numeric max retry times for each backup domains.     */    private $maxRetryTimes;    /**     * @var callable args response and request; returns bool; If true will retry with backup domains.     */    private $retryCondition;    /**     * @param array<string> $backupDomains     * @param numeric $maxRetryTimes     */    public function __construct($backupDomains, $maxRetryTimes = 2, $retryCondition = null)    {        $this->backupDomains = $backupDomains;        $this->maxRetryTimes = $maxRetryTimes;        $this->retryCondition = $retryCondition;    }    private function shouldRetry($resp, $req)    {        if (is_callable($this->retryCondition)) {            return call_user_func($this->retryCondition, $resp, $req);        }        return !$resp || $resp->needRetry();    }    /**     * @param Request $request     * @param callable(Request): Response $next     * @return Response     */    public function send($request, $next)    {        $response = null;        $urlComponents = parse_url($request->url);        foreach (array_merge(array($urlComponents["host"]), $this->backupDomains) as $backupDomain) {            $urlComponents["host"] = $backupDomain;            $request->url = \Qiniu\unparse_url($urlComponents);            $retriedTimes = 0;            while ($retriedTimes < $this->maxRetryTimes) {                $response = $next($request);                $retriedTimes += 1;                if (!$this->shouldRetry($response, $request)) {                    return $response;                }            }        }        if (!$response) {            $response = $next($request);        }        return $response;    }}
 |