From a18fd6f9ea4eaa90c813f0be16d8302dae1c1dd8 Mon Sep 17 00:00:00 2001 From: Michael Dowling Date: Sun, 6 Oct 2013 12:49:43 -0700 Subject: [PATCH] Adding test for HttpError. Moving subscribers to Subscriber dir. --- src/Guzzle/Http/Message/MessageFactory.php | 18 ++-- src/Guzzle/Http/Message/Request.php | 3 +- .../HttpError.php} | 6 +- .../PrepareRequestBody.php} | 7 +- .../Redirect.php} | 4 +- .../Tests/Http/Message/MessageFactoryTest.php | 6 +- .../Tests/Http/Subscriber/HttpErrorTest.php | 61 ++++++++++++ .../Subscriber/PrepareRequestBodyTest.php | 92 +++++++++++++++++++ .../RedirectTest.php} | 7 +- 9 files changed, 178 insertions(+), 26 deletions(-) rename src/Guzzle/Http/{HttpErrorPlugin.php => Subscriber/HttpError.php} (81%) rename src/Guzzle/Http/{Message/PrepareRequestBodySubscriber.php => Subscriber/PrepareRequestBody.php} (89%) rename src/Guzzle/Http/{RedirectPlugin.php => Subscriber/Redirect.php} (98%) create mode 100644 tests/Guzzle/Tests/Http/Subscriber/HttpErrorTest.php create mode 100644 tests/Guzzle/Tests/Http/Subscriber/PrepareRequestBodyTest.php rename tests/Guzzle/Tests/Http/{RedirectPluginTest.php => Subscriber/RedirectTest.php} (97%) diff --git a/src/Guzzle/Http/Message/MessageFactory.php b/src/Guzzle/Http/Message/MessageFactory.php index 2fc82901..e2744cd8 100644 --- a/src/Guzzle/Http/Message/MessageFactory.php +++ b/src/Guzzle/Http/Message/MessageFactory.php @@ -2,10 +2,10 @@ namespace Guzzle\Http\Message; -use Guzzle\Http\HttpErrorPlugin; +use Guzzle\Http\Subscriber\HttpError; use Guzzle\Http\Message\Post\PostBody; use Guzzle\Http\Message\Post\PostFile; -use Guzzle\Http\RedirectPlugin; +use Guzzle\Http\Subscriber\Redirect; use Guzzle\Stream\Stream; use Guzzle\Url\Url; @@ -14,16 +14,16 @@ use Guzzle\Url\Url; */ class MessageFactory implements MessageFactoryInterface { - /** @var HttpErrorPlugin */ + /** @var HttpError */ private $errorPlugin; - /** @var RedirectPlugin */ + /** @var Redirect */ private $redirectPlugin; public function __construct() { - $this->errorPlugin = new HttpErrorPlugin(); - $this->redirectPlugin = new RedirectPlugin(); + $this->errorPlugin = new HttpError(); + $this->redirectPlugin = new Redirect(); } public function createResponse($statusCode , array $headers = [], $body = null, array $options = []) @@ -132,7 +132,7 @@ class MessageFactory implements MessageFactoryInterface static $methods; static $map = [ 'connect_timeout' => 1, 'timeout' => 1, 'verify' => 1, 'future' => 1, 'ssl_key' => 1, 'ssl_cert' => 1, - 'proxy' => 1, 'debug' => 1, 'save_to' => 1, 'stream' => 1 + 'proxy' => 1, 'debug' => 1, 'save_to' => 1, 'stream' => 1, 'expect' => 1 ]; if (!$methods) { @@ -165,9 +165,9 @@ class MessageFactory implements MessageFactoryInterface { if ($value !== false) { if ($value === 'strict') { - $request->getConfig()[RedirectPlugin::STRICT_REDIRECTS] = true; + $request->getConfig()[Redirect::STRICT_REDIRECTS] = true; } elseif (is_int($value)) { - $request->getConfig()[RedirectPlugin::MAX_REDIRECTS] = $value; + $request->getConfig()[Redirect::MAX_REDIRECTS] = $value; } $request->getEventDispatcher()->addSubscriber($this->redirectPlugin); } diff --git a/src/Guzzle/Http/Message/Request.php b/src/Guzzle/Http/Message/Request.php index 0ab4c63f..29e4c217 100644 --- a/src/Guzzle/Http/Message/Request.php +++ b/src/Guzzle/Http/Message/Request.php @@ -4,6 +4,7 @@ namespace Guzzle\Http\Message; use Guzzle\Common\HasDispatcherTrait; use Guzzle\Common\Collection; +use Guzzle\Http\Subscriber\PrepareRequestBody; use Guzzle\Stream\StreamInterface; use Guzzle\Url\Url; @@ -187,7 +188,7 @@ class Request implements RequestInterface { static $subscriber; if (!$subscriber) { - $subscriber = new PrepareRequestBodySubscriber(); + $subscriber = new PrepareRequestBody(); } $this->getEventDispatcher()->addSubscriber($subscriber); diff --git a/src/Guzzle/Http/HttpErrorPlugin.php b/src/Guzzle/Http/Subscriber/HttpError.php similarity index 81% rename from src/Guzzle/Http/HttpErrorPlugin.php rename to src/Guzzle/Http/Subscriber/HttpError.php index a66a4f33..8cc12303 100644 --- a/src/Guzzle/Http/HttpErrorPlugin.php +++ b/src/Guzzle/Http/Subscriber/HttpError.php @@ -1,6 +1,6 @@ getResponse()->getStatusCode(); // Throw an exception for an unsuccessful response if ($code[0] === '4' || $code[0] === '5') { - $event->intercept(RequestException::create($event->getRequest(), $event->getResponse())); + throw RequestException::create($event->getRequest(), $event->getResponse()); } } } diff --git a/src/Guzzle/Http/Message/PrepareRequestBodySubscriber.php b/src/Guzzle/Http/Subscriber/PrepareRequestBody.php similarity index 89% rename from src/Guzzle/Http/Message/PrepareRequestBodySubscriber.php rename to src/Guzzle/Http/Subscriber/PrepareRequestBody.php index 2eebb63a..d0c645fa 100644 --- a/src/Guzzle/Http/Message/PrepareRequestBodySubscriber.php +++ b/src/Guzzle/Http/Subscriber/PrepareRequestBody.php @@ -1,7 +1,8 @@ getConfig()['expect'])) { $size = $body->getSize(); - $addExpect = $size === null ? true : $size > $expect; + $addExpect = $size === null ? true : $size >= (int) $expect; } elseif (!$body->isSeekable()) { // Always add the Expect 100-Continue header if the body cannot be rewound $addExpect = true; diff --git a/src/Guzzle/Http/RedirectPlugin.php b/src/Guzzle/Http/Subscriber/Redirect.php similarity index 98% rename from src/Guzzle/Http/RedirectPlugin.php rename to src/Guzzle/Http/Subscriber/Redirect.php index 76b05b27..e2b51a78 100644 --- a/src/Guzzle/Http/RedirectPlugin.php +++ b/src/Guzzle/Http/Subscriber/Redirect.php @@ -1,6 +1,6 @@ createRequest('GET', '/', [], null, ['allow_redirects' => 'strict']); - $this->assertTrue($request->getConfig()->get(RedirectPlugin::STRICT_REDIRECTS)); + $this->assertTrue($request->getConfig()->get(Redirect::STRICT_REDIRECTS)); } public function testCanEnableStrictRedirectsWithInt() { $request = (new MessageFactory)->createRequest('GET', '/', [], null, ['allow_redirects' => 10]); - $this->assertEquals(10, $request->getConfig()->get(RedirectPlugin::MAX_REDIRECTS)); + $this->assertEquals(10, $request->getConfig()->get(Redirect::MAX_REDIRECTS)); } public function testCanAddCookies() diff --git a/tests/Guzzle/Tests/Http/Subscriber/HttpErrorTest.php b/tests/Guzzle/Tests/Http/Subscriber/HttpErrorTest.php new file mode 100644 index 00000000..37d988c2 --- /dev/null +++ b/tests/Guzzle/Tests/Http/Subscriber/HttpErrorTest.php @@ -0,0 +1,61 @@ +getEvent(); + $event->intercept(new Response(200)); + (new HttpError())->onRequestAfterSend($event); + } + + /** + * @expectedException \Guzzle\Http\Exception\ClientErrorResponseException + */ + public function testThrowsClientExceptionOnFailure() + { + $event = $this->getEvent(); + $event->intercept(new Response(403)); + (new HttpError())->onRequestAfterSend($event); + } + + /** + * @expectedException \Guzzle\Http\Exception\ServerErrorResponseException + */ + public function testThrowsServerExceptionOnFailure() + { + $event = $this->getEvent(); + $event->intercept(new Response(500)); + (new HttpError())->onRequestAfterSend($event); + } + + private function getEvent() + { + return new RequestAfterSendEvent(new Transaction(new Client(), new Request('PUT', '/'))); + } + + /** + * @expectedException \Guzzle\Http\Exception\ClientErrorResponseException + */ + public function testFullTransaction() + { + $client = new Client(); + $client->getEventDispatcher()->addSubscriber(new MockPlugin([ + new Response(403) + ])); + $client->get('/'); + } +} diff --git a/tests/Guzzle/Tests/Http/Subscriber/PrepareRequestBodyTest.php b/tests/Guzzle/Tests/Http/Subscriber/PrepareRequestBodyTest.php new file mode 100644 index 00000000..90ea8b54 --- /dev/null +++ b/tests/Guzzle/Tests/Http/Subscriber/PrepareRequestBodyTest.php @@ -0,0 +1,92 @@ +getTrans(); + $s->onRequestBeforeSend(new RequestBeforeSendEvent($t)); + $this->assertFalse($t->getRequest()->hasHeader('Expect')); + } + + public function testAppliesPostBody() + { + $s = new PrepareRequestBody(); + $t = $this->getTrans(); + $p = $this->getMockBuilder('Guzzle\Http\Message\Post\PostBody') + ->setMethods(['applyRequestHeaders']) + ->getMockForAbstractClass(); + $p->expects($this->once()) + ->method('applyRequestHeaders'); + $t->getRequest()->setBody($p); + $s->onRequestBeforeSend(new RequestBeforeSendEvent($t)); + } + + public function testAddsExpectHeaderWithTrue() + { + $s = new PrepareRequestBody(); + $t = $this->getTrans(); + $t->getRequest()->getConfig()->set('expect', true); + $t->getRequest()->setBody(Stream::factory('foo', true)); + $s->onRequestBeforeSend(new RequestBeforeSendEvent($t)); + $this->assertEquals('100-Continue', $t->getRequest()->getHeader('Expect')); + } + + public function testAddsExpectHeaderBySize() + { + $s = new PrepareRequestBody(); + $t = $this->getTrans(); + $t->getRequest()->getConfig()->set('expect', 2); + $t->getRequest()->setBody(Stream::factory('foo', true)); + $s->onRequestBeforeSend(new RequestBeforeSendEvent($t)); + $this->assertTrue($t->getRequest()->hasHeader('Expect')); + } + + public function testDoesNotAddExpectHeaderBySize() + { + $s = new PrepareRequestBody(); + $t = $this->getTrans(); + $t->getRequest()->getConfig()->set('expect', 10); + $t->getRequest()->setBody(Stream::factory('foo', true)); + $s->onRequestBeforeSend(new RequestBeforeSendEvent($t)); + $this->assertFalse($t->getRequest()->hasHeader('Expect')); + } + + public function testAddsExpectHeaderForNonSeekable() + { + $s = new PrepareRequestBody(); + $t = $this->getTrans(); + $t->getRequest()->setBody(new NoSeekStream(Stream::factory('foo', true))); + $s->onRequestBeforeSend(new RequestBeforeSendEvent($t)); + $this->assertTrue($t->getRequest()->hasHeader('Expect')); + } + + public function testRemovesContentLengthWhenSendingWithChunked() + { + $s = new PrepareRequestBody(); + $t = $this->getTrans(); + $t->getRequest()->setBody(Stream::factory('foo', true)); + $t->getRequest()->setHeader('Transfer-Encoding', 'chunked'); + $s->onRequestBeforeSend(new RequestBeforeSendEvent($t)); + $this->assertFalse($t->getRequest()->hasHeader('Content-Length')); + } + + private function getTrans() + { + return new Transaction(new Client(), new Request('PUT', '/')); + } +} diff --git a/tests/Guzzle/Tests/Http/RedirectPluginTest.php b/tests/Guzzle/Tests/Http/Subscriber/RedirectTest.php similarity index 97% rename from tests/Guzzle/Tests/Http/RedirectPluginTest.php rename to tests/Guzzle/Tests/Http/Subscriber/RedirectTest.php index 8dfd7448..189ab265 100644 --- a/tests/Guzzle/Tests/Http/RedirectPluginTest.php +++ b/tests/Guzzle/Tests/Http/Subscriber/RedirectTest.php @@ -3,16 +3,13 @@ namespace Guzzle\Tests\Plugin\Redirect; use Guzzle\Http\Client; -use Guzzle\Http\RedirectPlugin; -use Guzzle\Http\Exception\TooManyRedirectsException; use Guzzle\Plugin\History\HistoryPlugin; use Guzzle\Plugin\Mock\MockPlugin; -use Guzzle\Stream\Stream; /** - * @covers Guzzle\Http\RedirectPlugin + * @covers Guzzle\Http\Subscriber\Redirect */ -class RedirectPluginTest extends \PHPUnit_Framework_TestCase +class RedirectTest extends \PHPUnit_Framework_TestCase { public function testRedirectsRequests() {