예제 #1
0
 /**
  * Called when a request receives a redirect response
  *
  * @param puzzle_event_CompleteEvent $event Event emitted
  * @throws puzzle_exception_TooManyRedirectsException
  */
 public function onComplete(puzzle_event_CompleteEvent $event)
 {
     $response = $event->getResponse();
     if (substr($response->getStatusCode(), 0, 1) != '3' || !$response->hasHeader('Location')) {
         return;
     }
     $redirectCount = 0;
     $redirectRequest = $event->getRequest();
     $redirectResponse = $response;
     $max = $redirectRequest->getConfig()->getPath('redirect/max') ? $redirectRequest->getConfig()->getPath('redirect/max') : 5;
     do {
         if (++$redirectCount > $max) {
             throw new puzzle_exception_TooManyRedirectsException("Will not follow more than {$redirectCount} redirects", $redirectRequest);
         }
         $redirectRequest = $this->createRedirectRequest($redirectRequest, $redirectResponse);
         $redirectResponse = $event->getClient()->send($redirectRequest);
     } while (substr($redirectResponse->getStatusCode(), 0, 1) == '3' && $redirectResponse->hasHeader('Location'));
     if ($redirectResponse !== $response) {
         $event->intercept($redirectResponse);
     }
 }