[BrowserKit] should not follow redirects if status code is not 30x
This commit is contained in:
parent
6d64c9a990
commit
8f54da73dd
@ -263,3 +263,17 @@ Console
|
||||
```
|
||||
if (OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { ... }
|
||||
```
|
||||
|
||||
BrowserKit
|
||||
----------
|
||||
|
||||
* If you are receiving responses with non-3xx Status Code and Location header
|
||||
please be aware that you won't be able to use auto-redirects on these kind
|
||||
of responses.
|
||||
|
||||
If you are correctly passing 3xx Status Code with Location header, you
|
||||
don't have to worry about the change.
|
||||
|
||||
If you were using responses with Location header and non-3xx Status Code,
|
||||
you have to update your code to manually create another request to URL
|
||||
grabbed from the Location header.
|
@ -4,6 +4,10 @@ CHANGELOG
|
||||
2.3.0
|
||||
-----
|
||||
|
||||
* [BC BREAK] `Client::followRedirect()` won't redirect responses with
|
||||
a non-3xx Status Code and `Location` header anymore, as per
|
||||
http://tools.ietf.org/html/rfc2616#section-14.30
|
||||
|
||||
* added `Client::getInternalRequest()` and `Client::getInternalResponse()` to
|
||||
have access to the BrowserKit internal request and response objects
|
||||
|
||||
|
@ -328,7 +328,13 @@ abstract class Client
|
||||
|
||||
$this->cookieJar->updateFromResponse($this->internalResponse, $uri);
|
||||
|
||||
$this->redirect = $this->internalResponse->getHeader('Location');
|
||||
$status = $this->internalResponse->getStatus();
|
||||
|
||||
if ($status >= 300 && $status < 400) {
|
||||
$this->redirect = $this->internalResponse->getHeader('Location');
|
||||
} else {
|
||||
$this->redirect = null;
|
||||
}
|
||||
|
||||
if ($this->followRedirects && $this->redirect) {
|
||||
return $this->crawler = $this->followRedirect();
|
||||
|
@ -348,6 +348,24 @@ class ClientTest extends \PHPUnit_Framework_TestCase
|
||||
$client->request('GET', 'http://www.example.com/foo/foobar');
|
||||
|
||||
$this->assertEquals('http://www.example.com/redirected', $client->getRequest()->getUri(), '->followRedirect() automatically follows redirects if followRedirects is true');
|
||||
|
||||
$client = new TestClient();
|
||||
$client->setNextResponse(new Response('', 201, array('Location' => 'http://www.example.com/redirected')));
|
||||
$client->request('GET', 'http://www.example.com/foo/foobar');
|
||||
|
||||
$this->assertEquals('http://www.example.com/foo/foobar', $client->getRequest()->getUri(), '->followRedirect() does not follow redirect if HTTP Code is not 30x');
|
||||
|
||||
$client = new TestClient();
|
||||
$client->setNextResponse(new Response('', 201, array('Location' => 'http://www.example.com/redirected')));
|
||||
$client->followRedirects(false);
|
||||
$client->request('GET', 'http://www.example.com/foo/foobar');
|
||||
|
||||
try {
|
||||
$client->followRedirect();
|
||||
$this->fail('->followRedirect() throws a \LogicException if the request did not respond with 30x HTTP Code');
|
||||
} catch (\Exception $e) {
|
||||
$this->assertInstanceof('LogicException', $e, '->followRedirect() throws a \LogicException if the request did not respond with 30x HTTP Code');
|
||||
}
|
||||
}
|
||||
|
||||
public function testFollowRedirectWithMaxRedirects()
|
||||
|
Reference in New Issue
Block a user