push(Middleware::redirect()); $handler = $stack->resolve(); $request = new Request('GET', 'http://example.com'); $promise = $handler($request, []); $response = $promise->wait(); $this->assertEquals(200, $response->getStatusCode()); } public function testIgnoresWhenNoLocation() { $response = new Response(304); $stack = new HandlerStack(new MockHandler([$response])); $stack->push(Middleware::redirect()); $handler = $stack->resolve(); $request = new Request('GET', 'http://example.com'); $promise = $handler($request, []); $response = $promise->wait(); $this->assertEquals(304, $response->getStatusCode()); } public function testRedirectsWithAbsoluteUri() { $mock = new MockHandler([ new Response(302, ['Location' => 'http://test.com']), new Response(200) ]); $stack = new HandlerStack($mock); $stack->push(Middleware::redirect()); $handler = $stack->resolve(); $request = new Request('GET', 'http://example.com?a=b'); $promise = $handler($request, [ 'allow_redirects' => ['max' => 2] ]); $response = $promise->wait(); $this->assertEquals(200, $response->getStatusCode()); $this->assertEquals('http://test.com', $mock->getLastRequest()->getUri()); } public function testRedirectsWithRelativeUri() { $mock = new MockHandler([ new Response(302, ['Location' => '/foo']), new Response(200) ]); $stack = new HandlerStack($mock); $stack->push(Middleware::redirect()); $handler = $stack->resolve(); $request = new Request('GET', 'http://example.com?a=b'); $promise = $handler($request, [ 'allow_redirects' => ['max' => 2] ]); $response = $promise->wait(); $this->assertEquals(200, $response->getStatusCode()); $this->assertEquals('http://example.com/foo', $mock->getLastRequest()->getUri()); } /** * @expectedException \GuzzleHttp\Exception\TooManyRedirectsException * @expectedExceptionMessage Will not follow more than 3 redirects */ public function testLimitsToMaxRedirects() { $mock = new MockHandler([ new Response(301, ['Location' => 'http://test.com']), new Response(302, ['Location' => 'http://test.com']), new Response(303, ['Location' => 'http://test.com']), new Response(304, ['Location' => 'http://test.com']) ]); $stack = new HandlerStack($mock); $stack->push(Middleware::redirect()); $handler = $stack->resolve(); $request = new Request('GET', 'http://example.com'); $promise = $handler($request, ['allow_redirects' => ['max' => 3]]); $promise->wait(); } /** * @expectedException \GuzzleHttp\Exception\BadResponseException * @expectedExceptionMessage Redirect URI, */ public function testEnsuresProtocolIsValid() { $mock = new MockHandler([ new Response(301, ['Location' => 'ftp://test.com']) ]); $stack = new HandlerStack($mock); $stack->push(Middleware::redirect()); $handler = $stack->resolve(); $request = new Request('GET', 'http://example.com'); $handler($request, ['allow_redirects' => ['max' => 3]])->wait(); } public function testAddsRefererHeader() { $mock = new MockHandler([ new Response(302, ['Location' => 'http://test.com']), new Response(200) ]); $stack = new HandlerStack($mock); $stack->push(Middleware::redirect()); $handler = $stack->resolve(); $request = new Request('GET', 'http://example.com?a=b'); $promise = $handler($request, [ 'allow_redirects' => ['max' => 2, 'referer' => true] ]); $promise->wait(); $this->assertEquals( 'http://example.com?a=b', $mock->getLastRequest()->getHeaderLine('Referer') ); } public function testDoesNotAddRefererWhenGoingFromHttpsToHttp() { $mock = new MockHandler([ new Response(302, ['Location' => 'http://test.com']), new Response(200) ]); $stack = new HandlerStack($mock); $stack->push(Middleware::redirect()); $handler = $stack->resolve(); $request = new Request('GET', 'https://example.com?a=b'); $promise = $handler($request, [ 'allow_redirects' => ['max' => 2, 'referer' => true] ]); $promise->wait(); $this->assertFalse($mock->getLastRequest()->hasHeader('Referer')); } }