| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 | 
							- <?php
 
- namespace 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;
 
-     }
 
- }
 
 
  |