1
0
mirror of https://github.com/guzzle/guzzle.git synced 2025-02-24 18:13:00 +01:00

Adding the ability to disable redirects per-request

This commit is contained in:
Michael Dowling 2012-10-30 22:32:20 -07:00
parent fd8515cd92
commit 138eac1840
4 changed files with 31 additions and 4 deletions

View File

@ -23,7 +23,7 @@ class Client extends AbstractHasDispatcher implements ClientInterface
const REQUEST_PARAMS = 'request.params';
const CURL_OPTIONS = 'curl.options';
const SSL_CERT_AUTHORITY = 'ssl.certificate_authority';
const DISABLE_REDIRECTS = 'client.disable_redirects';
const DISABLE_REDIRECTS = RedirectPlugin::DISABLE;
/**
* @var Collection Default HTTP headers to set on each request

View File

@ -19,6 +19,7 @@ class RedirectPlugin implements EventSubscriberInterface
const MAX_REDIRECTS = 'redirect.max';
const STRICT_REDIRECTS = 'redirect.strict';
const PARENT_REQUEST = 'redirect.parent_request';
const DISABLE = 'redirect.disable';
/**
* @var int Default number of redirects allowed when no setting is supplied by a request
@ -54,12 +55,15 @@ class RedirectPlugin implements EventSubscriberInterface
public function onRequestSent(Event $event)
{
$response = $event['response'];
$request = $event['request'];
// Only act on redirect requests with Location headers
if (!$response || !$response->isRedirect() || !$response->hasHeader('Location')) {
if (!$response || !$response->isRedirect() || !$response->hasHeader('Location')
|| $request->getParams()->get(self::DISABLE)
) {
return;
}
$request = $event['request'];
$orignalRequest = $this->prepareRedirection($request);
// Create a redirect request based on the redirect rules set on the request

View File

@ -12,7 +12,7 @@ use Guzzle\Http\Message\RequestInterface;
use Guzzle\Http\Message\Request;
use Guzzle\Http\Message\Response;
use Guzzle\Http\Message\RequestFactory;
use Guzzle\Http\Exception\RequestException;
use Guzzle\Http\RedirectPlugin;
use Guzzle\Http\Exception\BadResponseException;
/**
@ -832,4 +832,17 @@ class RequestTest extends \Guzzle\Tests\GuzzleTestCase
$this->assertEquals(200, $request->getResponse()->getStatusCode());
$this->assertEquals(303, $request->getResponse()->getPreviousResponse()->getStatusCode());
}
public function testUnresolvedRedirectsReturnResponse()
{
$this->getServer()->flush();
$this->getServer()->enqueue(array(
"HTTP/1.1 303 SEE OTHER\r\nContent-Length: 0\r\n\r\n",
"HTTP/1.1 301 Foo\r\nLocation: /foo\r\nContent-Length: 0\r\n\r\n"
));
$request = $this->request;
$this->assertEquals(303, $request->send()->getStatusCode());
$request->getParams()->set(RedirectPlugin::DISABLE, true);
$this->assertEquals(301, $request->send()->getStatusCode());
}
}

View File

@ -153,4 +153,14 @@ class RedirectPluginTest extends \Guzzle\Tests\GuzzleTestCase
$body->read(1);
$request->setBody($body)->send();
}
public function testRedirectsCanBeDisabledPerRequest()
{
$this->getServer()->flush();
$this->getServer()->enqueue(array("HTTP/1.1 301 Foo\r\nLocation: /foo\r\nContent-Length: 0\r\n\r\n"));
$client = new Client($this->getServer()->getUrl());
$request = $client->put();
$request->getParams()->set(RedirectPlugin::DISABLE, true);
$this->assertEquals(301, $request->send()->getStatusCode());
}
}