123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- <?php
- namespace GuzzleHttp\Tests;
- use GuzzleHttp\Cookie\CookieJar;
- use GuzzleHttp\Cookie\SetCookie;
- use GuzzleHttp\Exception\RequestException;
- use GuzzleHttp\Handler\MockHandler;
- use GuzzleHttp\HandlerStack;
- use GuzzleHttp\MessageFormatter;
- use GuzzleHttp\Middleware;
- use GuzzleHttp\Promise\PromiseInterface;
- use GuzzleHttp\Psr7\Request;
- use GuzzleHttp\Psr7\Response;
- use Psr\Http\Message\RequestInterface;
- use Psr\Http\Message\ResponseInterface;
- use PHPUnit\Framework\TestCase;
- use Psr\Log\Test\TestLogger;
- class MiddlewareTest extends TestCase
- {
- public function testAddsCookiesToRequests()
- {
- $jar = new CookieJar();
- $m = Middleware::cookies($jar);
- $h = new MockHandler(
- [
- function (RequestInterface $request) {
- return new Response(200, [
- 'Set-Cookie' => new SetCookie([
- 'Name' => 'name',
- 'Value' => 'value',
- 'Domain' => 'foo.com'
- ])
- ]);
- }
- ]
- );
- $f = $m($h);
- $f(new Request('GET', 'http://foo.com'), ['cookies' => $jar])->wait();
- $this->assertCount(1, $jar);
- }
- /**
- * @expectedException \GuzzleHttp\Exception\ClientException
- */
- public function testThrowsExceptionOnHttpClientError()
- {
- $m = Middleware::httpErrors();
- $h = new MockHandler([new Response(404)]);
- $f = $m($h);
- $p = $f(new Request('GET', 'http://foo.com'), ['http_errors' => true]);
- $this->assertSame('pending', $p->getState());
- $p->wait();
- $this->assertSame('rejected', $p->getState());
- }
- /**
- * @expectedException \GuzzleHttp\Exception\ServerException
- */
- public function testThrowsExceptionOnHttpServerError()
- {
- $m = Middleware::httpErrors();
- $h = new MockHandler([new Response(500)]);
- $f = $m($h);
- $p = $f(new Request('GET', 'http://foo.com'), ['http_errors' => true]);
- $this->assertSame('pending', $p->getState());
- $p->wait();
- $this->assertSame('rejected', $p->getState());
- }
- /**
- * @dataProvider getHistoryUseCases
- */
- public function testTracksHistory($container)
- {
- $m = Middleware::history($container);
- $h = new MockHandler([new Response(200), new Response(201)]);
- $f = $m($h);
- $p1 = $f(new Request('GET', 'http://foo.com'), ['headers' => ['foo' => 'bar']]);
- $p2 = $f(new Request('HEAD', 'http://foo.com'), ['headers' => ['foo' => 'baz']]);
- $p1->wait();
- $p2->wait();
- $this->assertCount(2, $container);
- $this->assertSame(200, $container[0]['response']->getStatusCode());
- $this->assertSame(201, $container[1]['response']->getStatusCode());
- $this->assertSame('GET', $container[0]['request']->getMethod());
- $this->assertSame('HEAD', $container[1]['request']->getMethod());
- $this->assertSame('bar', $container[0]['options']['headers']['foo']);
- $this->assertSame('baz', $container[1]['options']['headers']['foo']);
- }
- public function getHistoryUseCases()
- {
- return [
- [[]], // 1. Container is an array
- [new \ArrayObject()] // 2. Container is an ArrayObject
- ];
- }
- public function testTracksHistoryForFailures()
- {
- $container = [];
- $m = Middleware::history($container);
- $request = new Request('GET', 'http://foo.com');
- $h = new MockHandler([new RequestException('error', $request)]);
- $f = $m($h);
- $f($request, [])->wait(false);
- $this->assertCount(1, $container);
- $this->assertSame('GET', $container[0]['request']->getMethod());
- $this->assertInstanceOf(RequestException::class, $container[0]['error']);
- }
- public function testTapsBeforeAndAfter()
- {
- $calls = [];
- $m = function ($handler) use (&$calls) {
- return function ($request, $options) use ($handler, &$calls) {
- $calls[] = '2';
- return $handler($request, $options);
- };
- };
- $m2 = Middleware::tap(
- function (RequestInterface $request, array $options) use (&$calls) {
- $calls[] = '1';
- },
- function (RequestInterface $request, array $options, PromiseInterface $p) use (&$calls) {
- $calls[] = '3';
- }
- );
- $h = new MockHandler([new Response()]);
- $b = new HandlerStack($h);
- $b->push($m2);
- $b->push($m);
- $comp = $b->resolve();
- $p = $comp(new Request('GET', 'http://foo.com'), []);
- $this->assertSame('123', implode('', $calls));
- $this->assertInstanceOf(PromiseInterface::class, $p);
- $this->assertSame(200, $p->wait()->getStatusCode());
- }
- public function testMapsRequest()
- {
- $h = new MockHandler([
- function (RequestInterface $request, array $options) {
- $this->assertSame('foo', $request->getHeaderLine('Bar'));
- return new Response(200);
- }
- ]);
- $stack = new HandlerStack($h);
- $stack->push(Middleware::mapRequest(function (RequestInterface $request) {
- return $request->withHeader('Bar', 'foo');
- }));
- $comp = $stack->resolve();
- $p = $comp(new Request('PUT', 'http://www.google.com'), []);
- $this->assertInstanceOf(PromiseInterface::class, $p);
- }
- public function testMapsResponse()
- {
- $h = new MockHandler([new Response(200)]);
- $stack = new HandlerStack($h);
- $stack->push(Middleware::mapResponse(function (ResponseInterface $response) {
- return $response->withHeader('Bar', 'foo');
- }));
- $comp = $stack->resolve();
- $p = $comp(new Request('PUT', 'http://www.google.com'), []);
- $p->wait();
- $this->assertSame('foo', $p->wait()->getHeaderLine('Bar'));
- }
- public function testLogsRequestsAndResponses()
- {
- $h = new MockHandler([new Response(200)]);
- $stack = new HandlerStack($h);
- $logger = new TestLogger();
- $formatter = new MessageFormatter();
- $stack->push(Middleware::log($logger, $formatter));
- $comp = $stack->resolve();
- $p = $comp(new Request('PUT', 'http://www.google.com'), []);
- $p->wait();
- $this->assertCount(1, $logger->records);
- $this->assertContains('"PUT / HTTP/1.1" 200', $logger->records[0]['message']);
- }
- public function testLogsRequestsAndResponsesCustomLevel()
- {
- $h = new MockHandler([new Response(200)]);
- $stack = new HandlerStack($h);
- $logger = new TestLogger();
- $formatter = new MessageFormatter();
- $stack->push(Middleware::log($logger, $formatter, 'debug'));
- $comp = $stack->resolve();
- $p = $comp(new Request('PUT', 'http://www.google.com'), []);
- $p->wait();
- $this->assertCount(1, $logger->records);
- $this->assertContains('"PUT / HTTP/1.1" 200', $logger->records[0]['message']);
- $this->assertSame('debug', $logger->records[0]['level']);
- }
- public function testLogsRequestsAndErrors()
- {
- $h = new MockHandler([new Response(404)]);
- $stack = new HandlerStack($h);
- $logger = new TestLogger();
- $formatter = new MessageFormatter('{code} {error}');
- $stack->push(Middleware::log($logger, $formatter));
- $stack->push(Middleware::httpErrors());
- $comp = $stack->resolve();
- $p = $comp(new Request('PUT', 'http://www.google.com'), ['http_errors' => true]);
- $p->wait(false);
- $this->assertCount(1, $logger->records);
- $this->assertContains('PUT http://www.google.com', $logger->records[0]['message']);
- $this->assertContains('404 Not Found', $logger->records[0]['message']);
- }
- }
|