Add max redirections limit

This commit is contained in:
Joseph Bielawski 2013-04-23 12:49:58 +02:00 committed by Fabien Potencier
parent 6bbcb21fc9
commit c8bc9533e5
2 changed files with 39 additions and 0 deletions

View File

@ -41,6 +41,8 @@ abstract class Client
protected $insulated;
protected $redirect;
protected $followRedirects;
protected $maxRedirects = -1;
protected $redirectCount = 0;
/**
* Constructor.
@ -71,6 +73,16 @@ abstract class Client
{
$this->followRedirects = (Boolean) $followRedirect;
}
/**
* Sets the maximum number of requests that crawler can follow.
*
* @param integer $maxRedirects
*/
public function setMaxRedirects($maxRedirects)
{
$this->maxRedirects = $maxRedirects < 0 ? -1 : $maxRedirects;
}
/**
* Sets the insulated flag.
@ -455,6 +467,14 @@ abstract class Client
if (empty($this->redirect)) {
throw new \LogicException('The request was not redirected.');
}
if (-1 !== $this->maxRedirects) {
if ($this->redirectCount === $this->maxRedirects) {
throw new \LogicException(sprintf('The maximum number (%d) of redirections was reached.', $this->maxRedirects));
}
++$this->redirectCount;
}
return $this->request('get', $this->redirect);
}

View File

@ -349,6 +349,25 @@ class ClientTest extends \PHPUnit_Framework_TestCase
$this->assertEquals('http://www.example.com/redirected', $client->getRequest()->getUri(), '->followRedirect() automatically follows redirects if followRedirects is true');
}
public function testFollowRedirectWithMaxRedirects()
{
$client = new TestClient();
$client->setMaxRedirects(1);
$client->setNextResponse(new Response('', 302, array('Location' => 'http://www.example.com/redirected')));
$client->request('GET', 'http://www.example.com/foo/foobar');
$this->assertEquals('http://www.example.com/redirected', $client->getRequest()->getUri(), '->followRedirect() follows a redirect if any');
$client->setNextResponse(new Response('', 302, array('Location' => 'http://www.example.com/redirected2')));
try {
$client->followRedirect();
$this->fail('->followRedirect() throws a \LogicException if the request was redirected and limit of redirections were reached');
} catch (\Exception $e) {
$this->assertInstanceof('LogicException', $e, '->followRedirect() throws a \LogicException if the request was redirected and limit of redirections were reached');
}
}
public function testFollowRedirectWithCookies()
{