first commit
This commit is contained in:
		
							
								
								
									
										162
									
								
								vendor/symfony/contracts/HttpClient/Test/Fixtures/web/index.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										162
									
								
								vendor/symfony/contracts/HttpClient/Test/Fixtures/web/index.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,162 @@ | ||||
| <?php | ||||
|  | ||||
| if ('cli-server' !== \PHP_SAPI) { | ||||
|     // safe guard against unwanted execution | ||||
|     throw new \Exception("You cannot run this script directly, it's a fixture for TestHttpServer."); | ||||
| } | ||||
|  | ||||
| $vars = []; | ||||
|  | ||||
| if (!$_POST) { | ||||
|     $_POST = json_decode(file_get_contents('php://input'), true); | ||||
|     $_POST['content-type'] = $_SERVER['HTTP_CONTENT_TYPE'] ?? '?'; | ||||
| } | ||||
|  | ||||
| foreach ($_SERVER as $k => $v) { | ||||
|     switch ($k) { | ||||
|         default: | ||||
|             if (0 !== strpos($k, 'HTTP_')) { | ||||
|                 continue 2; | ||||
|             } | ||||
|             // no break | ||||
|         case 'SERVER_NAME': | ||||
|         case 'SERVER_PROTOCOL': | ||||
|         case 'REQUEST_URI': | ||||
|         case 'REQUEST_METHOD': | ||||
|         case 'PHP_AUTH_USER': | ||||
|         case 'PHP_AUTH_PW': | ||||
|             $vars[$k] = $v; | ||||
|     } | ||||
| } | ||||
|  | ||||
| $json = json_encode($vars, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); | ||||
|  | ||||
| switch ($vars['REQUEST_URI']) { | ||||
|     default: | ||||
|         exit; | ||||
|  | ||||
|     case '/head': | ||||
|         header('Content-Length: '.strlen($json), true); | ||||
|         break; | ||||
|  | ||||
|     case '/': | ||||
|     case '/?a=a&b=b': | ||||
|     case 'http://127.0.0.1:8057/': | ||||
|     case 'http://localhost:8057/': | ||||
|         ob_start('ob_gzhandler'); | ||||
|         break; | ||||
|  | ||||
|     case '/103': | ||||
|         header('HTTP/1.1 103 Early Hints'); | ||||
|         header('Link: </style.css>; rel=preload; as=style', false); | ||||
|         header('Link: </script.js>; rel=preload; as=script', false); | ||||
|         flush(); | ||||
|         usleep(1000); | ||||
|         echo "HTTP/1.1 200 OK\r\n"; | ||||
|         echo "Date: Fri, 26 May 2017 10:02:11 GMT\r\n"; | ||||
|         echo "Content-Length: 13\r\n"; | ||||
|         echo "\r\n"; | ||||
|         echo 'Here the body'; | ||||
|         exit; | ||||
|  | ||||
|     case '/404': | ||||
|         header('Content-Type: application/json', true, 404); | ||||
|         break; | ||||
|  | ||||
|     case '/301': | ||||
|         if ('Basic Zm9vOmJhcg==' === $vars['HTTP_AUTHORIZATION']) { | ||||
|             header('Location: http://127.0.0.1:8057/302', true, 301); | ||||
|         } | ||||
|         break; | ||||
|  | ||||
|     case '/301/bad-tld': | ||||
|         header('Location: http://foo.example.', true, 301); | ||||
|         break; | ||||
|  | ||||
|     case '/301/invalid': | ||||
|         header('Location: //?foo=bar', true, 301); | ||||
|         break; | ||||
|  | ||||
|     case '/302': | ||||
|         if (!isset($vars['HTTP_AUTHORIZATION'])) { | ||||
|             header('Location: http://localhost:8057/', true, 302); | ||||
|         } | ||||
|         break; | ||||
|  | ||||
|     case '/302/relative': | ||||
|         header('Location: ..', true, 302); | ||||
|         break; | ||||
|  | ||||
|     case '/304': | ||||
|         header('Content-Length: 10', true, 304); | ||||
|         echo '12345'; | ||||
|  | ||||
|         return; | ||||
|  | ||||
|     case '/307': | ||||
|         header('Location: http://localhost:8057/post', true, 307); | ||||
|         break; | ||||
|  | ||||
|     case '/length-broken': | ||||
|         header('Content-Length: 1000'); | ||||
|         break; | ||||
|  | ||||
|     case '/post': | ||||
|         $output = json_encode($_POST + ['REQUEST_METHOD' => $vars['REQUEST_METHOD']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); | ||||
|         header('Content-Type: application/json', true); | ||||
|         header('Content-Length: '.strlen($output)); | ||||
|         echo $output; | ||||
|         exit; | ||||
|  | ||||
|     case '/timeout-header': | ||||
|         usleep(300000); | ||||
|         break; | ||||
|  | ||||
|     case '/timeout-body': | ||||
|         echo '<1>'; | ||||
|         @ob_flush(); | ||||
|         flush(); | ||||
|         usleep(500000); | ||||
|         echo '<2>'; | ||||
|         exit; | ||||
|  | ||||
|     case '/timeout-long': | ||||
|         ignore_user_abort(false); | ||||
|         sleep(1); | ||||
|         while (true) { | ||||
|             echo '<1>'; | ||||
|             @ob_flush(); | ||||
|             flush(); | ||||
|             usleep(500); | ||||
|         } | ||||
|         exit; | ||||
|  | ||||
|     case '/chunked': | ||||
|         header('Transfer-Encoding: chunked'); | ||||
|         echo "8\r\nSymfony \r\n5\r\nis aw\r\n6\r\nesome!\r\n0\r\n\r\n"; | ||||
|         exit; | ||||
|  | ||||
|     case '/chunked-broken': | ||||
|         header('Transfer-Encoding: chunked'); | ||||
|         echo "8\r\nSymfony \r\n5\r\nis aw\r\n6\r\ne"; | ||||
|         exit; | ||||
|  | ||||
|     case '/gzip-broken': | ||||
|         header('Content-Encoding: gzip'); | ||||
|         echo str_repeat('-', 1000); | ||||
|         exit; | ||||
|  | ||||
|     case '/max-duration': | ||||
|         ignore_user_abort(false); | ||||
|         while (true) { | ||||
|             echo '<1>'; | ||||
|             @ob_flush(); | ||||
|             flush(); | ||||
|             usleep(500); | ||||
|         } | ||||
|         exit; | ||||
| } | ||||
|  | ||||
| header('Content-Type: application/json', true); | ||||
|  | ||||
| echo $json; | ||||
							
								
								
									
										953
									
								
								vendor/symfony/contracts/HttpClient/Test/HttpClientTestCase.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										953
									
								
								vendor/symfony/contracts/HttpClient/Test/HttpClientTestCase.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,953 @@ | ||||
| <?php | ||||
|  | ||||
| /* | ||||
|  * This file is part of the Symfony package. | ||||
|  * | ||||
|  * (c) Fabien Potencier <fabien@symfony.com> | ||||
|  * | ||||
|  * For the full copyright and license information, please view the LICENSE | ||||
|  * file that was distributed with this source code. | ||||
|  */ | ||||
|  | ||||
| namespace Symfony\Contracts\HttpClient\Test; | ||||
|  | ||||
| use PHPUnit\Framework\TestCase; | ||||
| use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface; | ||||
| use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface; | ||||
| use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface; | ||||
| use Symfony\Contracts\HttpClient\HttpClientInterface; | ||||
|  | ||||
| /** | ||||
|  * A reference test suite for HttpClientInterface implementations. | ||||
|  * | ||||
|  * @experimental in 1.1 | ||||
|  */ | ||||
| abstract class HttpClientTestCase extends TestCase | ||||
| { | ||||
|     private static $server; | ||||
|  | ||||
|     public static function setUpBeforeClass(): void | ||||
|     { | ||||
|         TestHttpServer::start(); | ||||
|     } | ||||
|  | ||||
|     abstract protected function getHttpClient(string $testCase): HttpClientInterface; | ||||
|  | ||||
|     public function testGetRequest() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057', [ | ||||
|             'headers' => ['Foo' => 'baR'], | ||||
|             'user_data' => $data = new \stdClass(), | ||||
|         ]); | ||||
|  | ||||
|         $this->assertSame([], $response->getInfo('response_headers')); | ||||
|         $this->assertSame($data, $response->getInfo()['user_data']); | ||||
|         $this->assertSame(200, $response->getStatusCode()); | ||||
|  | ||||
|         $info = $response->getInfo(); | ||||
|         $this->assertNull($info['error']); | ||||
|         $this->assertSame(0, $info['redirect_count']); | ||||
|         $this->assertSame('HTTP/1.1 200 OK', $info['response_headers'][0]); | ||||
|         $this->assertSame('Host: localhost:8057', $info['response_headers'][1]); | ||||
|         $this->assertSame('http://localhost:8057/', $info['url']); | ||||
|  | ||||
|         $headers = $response->getHeaders(); | ||||
|  | ||||
|         $this->assertSame('localhost:8057', $headers['host'][0]); | ||||
|         $this->assertSame(['application/json'], $headers['content-type']); | ||||
|  | ||||
|         $body = json_decode($response->getContent(), true); | ||||
|         $this->assertSame($body, $response->toArray()); | ||||
|  | ||||
|         $this->assertSame('HTTP/1.1', $body['SERVER_PROTOCOL']); | ||||
|         $this->assertSame('/', $body['REQUEST_URI']); | ||||
|         $this->assertSame('GET', $body['REQUEST_METHOD']); | ||||
|         $this->assertSame('localhost:8057', $body['HTTP_HOST']); | ||||
|         $this->assertSame('baR', $body['HTTP_FOO']); | ||||
|  | ||||
|         $response = $client->request('GET', 'http://localhost:8057/length-broken'); | ||||
|  | ||||
|         $this->expectException(TransportExceptionInterface::class); | ||||
|         $response->getContent(); | ||||
|     } | ||||
|  | ||||
|     public function testHeadRequest() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('HEAD', 'http://localhost:8057/head', [ | ||||
|             'headers' => ['Foo' => 'baR'], | ||||
|             'user_data' => $data = new \stdClass(), | ||||
|             'buffer' => false, | ||||
|         ]); | ||||
|  | ||||
|         $this->assertSame([], $response->getInfo('response_headers')); | ||||
|         $this->assertSame(200, $response->getStatusCode()); | ||||
|  | ||||
|         $info = $response->getInfo(); | ||||
|         $this->assertSame('HTTP/1.1 200 OK', $info['response_headers'][0]); | ||||
|         $this->assertSame('Host: localhost:8057', $info['response_headers'][1]); | ||||
|  | ||||
|         $headers = $response->getHeaders(); | ||||
|  | ||||
|         $this->assertSame('localhost:8057', $headers['host'][0]); | ||||
|         $this->assertSame(['application/json'], $headers['content-type']); | ||||
|         $this->assertTrue(0 < $headers['content-length'][0]); | ||||
|  | ||||
|         $this->assertSame('', $response->getContent()); | ||||
|     } | ||||
|  | ||||
|     public function testNonBufferedGetRequest() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057', [ | ||||
|             'buffer' => false, | ||||
|             'headers' => ['Foo' => 'baR'], | ||||
|         ]); | ||||
|  | ||||
|         $body = $response->toArray(); | ||||
|         $this->assertSame('baR', $body['HTTP_FOO']); | ||||
|  | ||||
|         $this->expectException(TransportExceptionInterface::class); | ||||
|         $response->getContent(); | ||||
|     } | ||||
|  | ||||
|     public function testBufferSink() | ||||
|     { | ||||
|         $sink = fopen('php://temp', 'w+'); | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057', [ | ||||
|             'buffer' => $sink, | ||||
|             'headers' => ['Foo' => 'baR'], | ||||
|         ]); | ||||
|  | ||||
|         $body = $response->toArray(); | ||||
|         $this->assertSame('baR', $body['HTTP_FOO']); | ||||
|  | ||||
|         rewind($sink); | ||||
|         $sink = stream_get_contents($sink); | ||||
|         $this->assertSame($sink, $response->getContent()); | ||||
|     } | ||||
|  | ||||
|     public function testConditionalBuffering() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057'); | ||||
|         $firstContent = $response->getContent(); | ||||
|         $secondContent = $response->getContent(); | ||||
|  | ||||
|         $this->assertSame($firstContent, $secondContent); | ||||
|  | ||||
|         $response = $client->request('GET', 'http://localhost:8057', ['buffer' => function () { return false; }]); | ||||
|         $response->getContent(); | ||||
|  | ||||
|         $this->expectException(TransportExceptionInterface::class); | ||||
|         $response->getContent(); | ||||
|     } | ||||
|  | ||||
|     public function testReentrantBufferCallback() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|  | ||||
|         $response = $client->request('GET', 'http://localhost:8057', ['buffer' => function () use (&$response) { | ||||
|             $response->cancel(); | ||||
|  | ||||
|             return true; | ||||
|         }]); | ||||
|  | ||||
|         $this->assertSame(200, $response->getStatusCode()); | ||||
|  | ||||
|         $this->expectException(TransportExceptionInterface::class); | ||||
|         $response->getContent(); | ||||
|     } | ||||
|  | ||||
|     public function testThrowingBufferCallback() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|  | ||||
|         $response = $client->request('GET', 'http://localhost:8057', ['buffer' => function () { | ||||
|             throw new \Exception('Boo'); | ||||
|         }]); | ||||
|  | ||||
|         $this->assertSame(200, $response->getStatusCode()); | ||||
|  | ||||
|         $this->expectException(TransportExceptionInterface::class); | ||||
|         $this->expectExceptionMessage('Boo'); | ||||
|         $response->getContent(); | ||||
|     } | ||||
|  | ||||
|     public function testUnsupportedOption() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|  | ||||
|         $this->expectException(\InvalidArgumentException::class); | ||||
|         $client->request('GET', 'http://localhost:8057', [ | ||||
|             'capture_peer_cert' => 1.0, | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function testHttpVersion() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057', [ | ||||
|             'http_version' => 1.0, | ||||
|         ]); | ||||
|  | ||||
|         $this->assertSame(200, $response->getStatusCode()); | ||||
|         $this->assertSame('HTTP/1.0 200 OK', $response->getInfo('response_headers')[0]); | ||||
|  | ||||
|         $body = $response->toArray(); | ||||
|  | ||||
|         $this->assertSame('HTTP/1.0', $body['SERVER_PROTOCOL']); | ||||
|         $this->assertSame('GET', $body['REQUEST_METHOD']); | ||||
|         $this->assertSame('/', $body['REQUEST_URI']); | ||||
|     } | ||||
|  | ||||
|     public function testChunkedEncoding() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057/chunked'); | ||||
|  | ||||
|         $this->assertSame(['chunked'], $response->getHeaders()['transfer-encoding']); | ||||
|         $this->assertSame('Symfony is awesome!', $response->getContent()); | ||||
|  | ||||
|         $response = $client->request('GET', 'http://localhost:8057/chunked-broken'); | ||||
|  | ||||
|         $this->expectException(TransportExceptionInterface::class); | ||||
|         $response->getContent(); | ||||
|     } | ||||
|  | ||||
|     public function testClientError() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057/404'); | ||||
|  | ||||
|         $client->stream($response)->valid(); | ||||
|  | ||||
|         $this->assertSame(404, $response->getInfo('http_code')); | ||||
|  | ||||
|         try { | ||||
|             $response->getHeaders(); | ||||
|             $this->fail(ClientExceptionInterface::class.' expected'); | ||||
|         } catch (ClientExceptionInterface $e) { | ||||
|         } | ||||
|  | ||||
|         try { | ||||
|             $response->getContent(); | ||||
|             $this->fail(ClientExceptionInterface::class.' expected'); | ||||
|         } catch (ClientExceptionInterface $e) { | ||||
|         } | ||||
|  | ||||
|         $this->assertSame(404, $response->getStatusCode()); | ||||
|         $this->assertSame(['application/json'], $response->getHeaders(false)['content-type']); | ||||
|         $this->assertNotEmpty($response->getContent(false)); | ||||
|  | ||||
|         $response = $client->request('GET', 'http://localhost:8057/404'); | ||||
|  | ||||
|         try { | ||||
|             foreach ($client->stream($response) as $chunk) { | ||||
|                 $this->assertTrue($chunk->isFirst()); | ||||
|             } | ||||
|             $this->fail(ClientExceptionInterface::class.' expected'); | ||||
|         } catch (ClientExceptionInterface $e) { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public function testIgnoreErrors() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057/404'); | ||||
|  | ||||
|         $this->assertSame(404, $response->getStatusCode()); | ||||
|     } | ||||
|  | ||||
|     public function testDnsError() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057/301/bad-tld'); | ||||
|  | ||||
|         try { | ||||
|             $response->getStatusCode(); | ||||
|             $this->fail(TransportExceptionInterface::class.' expected'); | ||||
|         } catch (TransportExceptionInterface $e) { | ||||
|             $this->addToAssertionCount(1); | ||||
|         } | ||||
|  | ||||
|         try { | ||||
|             $response->getStatusCode(); | ||||
|             $this->fail(TransportExceptionInterface::class.' still expected'); | ||||
|         } catch (TransportExceptionInterface $e) { | ||||
|             $this->addToAssertionCount(1); | ||||
|         } | ||||
|  | ||||
|         $response = $client->request('GET', 'http://localhost:8057/301/bad-tld'); | ||||
|  | ||||
|         try { | ||||
|             foreach ($client->stream($response) as $r => $chunk) { | ||||
|             } | ||||
|             $this->fail(TransportExceptionInterface::class.' expected'); | ||||
|         } catch (TransportExceptionInterface $e) { | ||||
|             $this->addToAssertionCount(1); | ||||
|         } | ||||
|  | ||||
|         $this->assertSame($response, $r); | ||||
|         $this->assertNotNull($chunk->getError()); | ||||
|  | ||||
|         $this->expectException(TransportExceptionInterface::class); | ||||
|         foreach ($client->stream($response) as $chunk) { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public function testInlineAuth() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://foo:bar%3Dbar@localhost:8057'); | ||||
|  | ||||
|         $body = $response->toArray(); | ||||
|  | ||||
|         $this->assertSame('foo', $body['PHP_AUTH_USER']); | ||||
|         $this->assertSame('bar=bar', $body['PHP_AUTH_PW']); | ||||
|     } | ||||
|  | ||||
|     public function testBadRequestBody() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|  | ||||
|         $this->expectException(TransportExceptionInterface::class); | ||||
|  | ||||
|         $response = $client->request('POST', 'http://localhost:8057/', [ | ||||
|             'body' => function () { yield []; }, | ||||
|         ]); | ||||
|  | ||||
|         $response->getStatusCode(); | ||||
|     } | ||||
|  | ||||
|     public function test304() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057/304', [ | ||||
|             'headers' => ['If-Match' => '"abc"'], | ||||
|             'buffer' => false, | ||||
|         ]); | ||||
|  | ||||
|         $this->assertSame(304, $response->getStatusCode()); | ||||
|         $this->assertSame('', $response->getContent(false)); | ||||
|     } | ||||
|  | ||||
|     public function testRedirects() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('POST', 'http://localhost:8057/301', [ | ||||
|             'auth_basic' => 'foo:bar', | ||||
|             'body' => function () { | ||||
|                 yield 'foo=bar'; | ||||
|             }, | ||||
|         ]); | ||||
|  | ||||
|         $body = $response->toArray(); | ||||
|         $this->assertSame('GET', $body['REQUEST_METHOD']); | ||||
|         $this->assertSame('Basic Zm9vOmJhcg==', $body['HTTP_AUTHORIZATION']); | ||||
|         $this->assertSame('http://localhost:8057/', $response->getInfo('url')); | ||||
|  | ||||
|         $this->assertSame(2, $response->getInfo('redirect_count')); | ||||
|         $this->assertNull($response->getInfo('redirect_url')); | ||||
|  | ||||
|         $expected = [ | ||||
|             'HTTP/1.1 301 Moved Permanently', | ||||
|             'Location: http://127.0.0.1:8057/302', | ||||
|             'Content-Type: application/json', | ||||
|             'HTTP/1.1 302 Found', | ||||
|             'Location: http://localhost:8057/', | ||||
|             'Content-Type: application/json', | ||||
|             'HTTP/1.1 200 OK', | ||||
|             'Content-Type: application/json', | ||||
|         ]; | ||||
|  | ||||
|         $filteredHeaders = array_values(array_filter($response->getInfo('response_headers'), function ($h) { | ||||
|             return \in_array(substr($h, 0, 4), ['HTTP', 'Loca', 'Cont'], true) && 'Content-Encoding: gzip' !== $h; | ||||
|         })); | ||||
|  | ||||
|         $this->assertSame($expected, $filteredHeaders); | ||||
|     } | ||||
|  | ||||
|     public function testInvalidRedirect() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057/301/invalid'); | ||||
|  | ||||
|         $this->assertSame(301, $response->getStatusCode()); | ||||
|         $this->assertSame(['//?foo=bar'], $response->getHeaders(false)['location']); | ||||
|         $this->assertSame(0, $response->getInfo('redirect_count')); | ||||
|         $this->assertNull($response->getInfo('redirect_url')); | ||||
|  | ||||
|         $this->expectException(RedirectionExceptionInterface::class); | ||||
|         $response->getHeaders(); | ||||
|     } | ||||
|  | ||||
|     public function testRelativeRedirects() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057/302/relative'); | ||||
|  | ||||
|         $body = $response->toArray(); | ||||
|  | ||||
|         $this->assertSame('/', $body['REQUEST_URI']); | ||||
|         $this->assertNull($response->getInfo('redirect_url')); | ||||
|  | ||||
|         $response = $client->request('GET', 'http://localhost:8057/302/relative', [ | ||||
|             'max_redirects' => 0, | ||||
|         ]); | ||||
|  | ||||
|         $this->assertSame(302, $response->getStatusCode()); | ||||
|         $this->assertSame('http://localhost:8057/', $response->getInfo('redirect_url')); | ||||
|     } | ||||
|  | ||||
|     public function testRedirect307() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|  | ||||
|         $response = $client->request('POST', 'http://localhost:8057/307', [ | ||||
|             'body' => function () { | ||||
|                 yield 'foo=bar'; | ||||
|             }, | ||||
|             'max_redirects' => 0, | ||||
|         ]); | ||||
|  | ||||
|         $this->assertSame(307, $response->getStatusCode()); | ||||
|  | ||||
|         $response = $client->request('POST', 'http://localhost:8057/307', [ | ||||
|             'body' => 'foo=bar', | ||||
|         ]); | ||||
|  | ||||
|         $body = $response->toArray(); | ||||
|  | ||||
|         $this->assertSame(['foo' => 'bar', 'REQUEST_METHOD' => 'POST'], $body); | ||||
|     } | ||||
|  | ||||
|     public function testMaxRedirects() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057/301', [ | ||||
|             'max_redirects' => 1, | ||||
|             'auth_basic' => 'foo:bar', | ||||
|         ]); | ||||
|  | ||||
|         try { | ||||
|             $response->getHeaders(); | ||||
|             $this->fail(RedirectionExceptionInterface::class.' expected'); | ||||
|         } catch (RedirectionExceptionInterface $e) { | ||||
|         } | ||||
|  | ||||
|         $this->assertSame(302, $response->getStatusCode()); | ||||
|         $this->assertSame(1, $response->getInfo('redirect_count')); | ||||
|         $this->assertSame('http://localhost:8057/', $response->getInfo('redirect_url')); | ||||
|  | ||||
|         $expected = [ | ||||
|             'HTTP/1.1 301 Moved Permanently', | ||||
|             'Location: http://127.0.0.1:8057/302', | ||||
|             'Content-Type: application/json', | ||||
|             'HTTP/1.1 302 Found', | ||||
|             'Location: http://localhost:8057/', | ||||
|             'Content-Type: application/json', | ||||
|         ]; | ||||
|  | ||||
|         $filteredHeaders = array_values(array_filter($response->getInfo('response_headers'), function ($h) { | ||||
|             return \in_array(substr($h, 0, 4), ['HTTP', 'Loca', 'Cont'], true); | ||||
|         })); | ||||
|  | ||||
|         $this->assertSame($expected, $filteredHeaders); | ||||
|     } | ||||
|  | ||||
|     public function testStream() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|  | ||||
|         $response = $client->request('GET', 'http://localhost:8057'); | ||||
|         $chunks = $client->stream($response); | ||||
|         $result = []; | ||||
|  | ||||
|         foreach ($chunks as $r => $chunk) { | ||||
|             if ($chunk->isTimeout()) { | ||||
|                 $result[] = 't'; | ||||
|             } elseif ($chunk->isLast()) { | ||||
|                 $result[] = 'l'; | ||||
|             } elseif ($chunk->isFirst()) { | ||||
|                 $result[] = 'f'; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         $this->assertSame($response, $r); | ||||
|         $this->assertSame(['f', 'l'], $result); | ||||
|  | ||||
|         $chunk = null; | ||||
|         $i = 0; | ||||
|  | ||||
|         foreach ($client->stream($response) as $chunk) { | ||||
|             ++$i; | ||||
|         } | ||||
|  | ||||
|         $this->assertSame(1, $i); | ||||
|         $this->assertTrue($chunk->isLast()); | ||||
|     } | ||||
|  | ||||
|     public function testAddToStream() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|  | ||||
|         $r1 = $client->request('GET', 'http://localhost:8057'); | ||||
|  | ||||
|         $completed = []; | ||||
|  | ||||
|         $pool = [$r1]; | ||||
|  | ||||
|         while ($pool) { | ||||
|             $chunks = $client->stream($pool); | ||||
|             $pool = []; | ||||
|  | ||||
|             foreach ($chunks as $r => $chunk) { | ||||
|                 if (!$chunk->isLast()) { | ||||
|                     continue; | ||||
|                 } | ||||
|  | ||||
|                 if ($r1 === $r) { | ||||
|                     $r2 = $client->request('GET', 'http://localhost:8057'); | ||||
|                     $pool[] = $r2; | ||||
|                 } | ||||
|  | ||||
|                 $completed[] = $r; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         $this->assertSame([$r1, $r2], $completed); | ||||
|     } | ||||
|  | ||||
|     public function testCompleteTypeError() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|  | ||||
|         $this->expectException(\TypeError::class); | ||||
|         $client->stream(123); | ||||
|     } | ||||
|  | ||||
|     public function testOnProgress() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('POST', 'http://localhost:8057/post', [ | ||||
|             'headers' => ['Content-Length' => 14], | ||||
|             'body' => 'foo=0123456789', | ||||
|             'on_progress' => function (...$state) use (&$steps) { $steps[] = $state; }, | ||||
|         ]); | ||||
|  | ||||
|         $body = $response->toArray(); | ||||
|  | ||||
|         $this->assertSame(['foo' => '0123456789', 'REQUEST_METHOD' => 'POST'], $body); | ||||
|         $this->assertSame([0, 0], \array_slice($steps[0], 0, 2)); | ||||
|         $lastStep = \array_slice($steps, -1)[0]; | ||||
|         $this->assertSame([57, 57], \array_slice($lastStep, 0, 2)); | ||||
|         $this->assertSame('http://localhost:8057/post', $steps[0][2]['url']); | ||||
|     } | ||||
|  | ||||
|     public function testPostJson() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|  | ||||
|         $response = $client->request('POST', 'http://localhost:8057/post', [ | ||||
|             'json' => ['foo' => 'bar'], | ||||
|         ]); | ||||
|  | ||||
|         $body = $response->toArray(); | ||||
|  | ||||
|         $this->assertStringContainsString('json', $body['content-type']); | ||||
|         unset($body['content-type']); | ||||
|         $this->assertSame(['foo' => 'bar', 'REQUEST_METHOD' => 'POST'], $body); | ||||
|     } | ||||
|  | ||||
|     public function testPostArray() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|  | ||||
|         $response = $client->request('POST', 'http://localhost:8057/post', [ | ||||
|             'body' => ['foo' => 'bar'], | ||||
|         ]); | ||||
|  | ||||
|         $this->assertSame(['foo' => 'bar', 'REQUEST_METHOD' => 'POST'], $response->toArray()); | ||||
|     } | ||||
|  | ||||
|     public function testPostResource() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|  | ||||
|         $h = fopen('php://temp', 'w+'); | ||||
|         fwrite($h, 'foo=0123456789'); | ||||
|         rewind($h); | ||||
|  | ||||
|         $response = $client->request('POST', 'http://localhost:8057/post', [ | ||||
|             'body' => $h, | ||||
|         ]); | ||||
|  | ||||
|         $body = $response->toArray(); | ||||
|  | ||||
|         $this->assertSame(['foo' => '0123456789', 'REQUEST_METHOD' => 'POST'], $body); | ||||
|     } | ||||
|  | ||||
|     public function testPostCallback() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|  | ||||
|         $response = $client->request('POST', 'http://localhost:8057/post', [ | ||||
|             'body' => function () { | ||||
|                 yield 'foo'; | ||||
|                 yield ''; | ||||
|                 yield '='; | ||||
|                 yield '0123456789'; | ||||
|             }, | ||||
|         ]); | ||||
|  | ||||
|         $this->assertSame(['foo' => '0123456789', 'REQUEST_METHOD' => 'POST'], $response->toArray()); | ||||
|     } | ||||
|  | ||||
|     public function testCancel() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057/timeout-header'); | ||||
|  | ||||
|         $response->cancel(); | ||||
|         $this->expectException(TransportExceptionInterface::class); | ||||
|         $response->getHeaders(); | ||||
|     } | ||||
|  | ||||
|     public function testInfoOnCanceledResponse() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|  | ||||
|         $response = $client->request('GET', 'http://localhost:8057/timeout-header'); | ||||
|  | ||||
|         $this->assertFalse($response->getInfo('canceled')); | ||||
|         $response->cancel(); | ||||
|         $this->assertTrue($response->getInfo('canceled')); | ||||
|     } | ||||
|  | ||||
|     public function testCancelInStream() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057/404'); | ||||
|  | ||||
|         foreach ($client->stream($response) as $chunk) { | ||||
|             $response->cancel(); | ||||
|         } | ||||
|  | ||||
|         $this->expectException(TransportExceptionInterface::class); | ||||
|  | ||||
|         foreach ($client->stream($response) as $chunk) { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public function testOnProgressCancel() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057/timeout-body', [ | ||||
|             'on_progress' => function ($dlNow) { | ||||
|                 if (0 < $dlNow) { | ||||
|                     throw new \Exception('Aborting the request'); | ||||
|                 } | ||||
|             }, | ||||
|         ]); | ||||
|  | ||||
|         try { | ||||
|             foreach ($client->stream([$response]) as $chunk) { | ||||
|             } | ||||
|             $this->fail(ClientExceptionInterface::class.' expected'); | ||||
|         } catch (TransportExceptionInterface $e) { | ||||
|             $this->assertSame('Aborting the request', $e->getPrevious()->getMessage()); | ||||
|         } | ||||
|  | ||||
|         $this->assertNotNull($response->getInfo('error')); | ||||
|         $this->expectException(TransportExceptionInterface::class); | ||||
|         $response->getContent(); | ||||
|     } | ||||
|  | ||||
|     public function testOnProgressError() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057/timeout-body', [ | ||||
|             'on_progress' => function ($dlNow) { | ||||
|                 if (0 < $dlNow) { | ||||
|                     throw new \Error('BUG'); | ||||
|                 } | ||||
|             }, | ||||
|         ]); | ||||
|  | ||||
|         try { | ||||
|             foreach ($client->stream([$response]) as $chunk) { | ||||
|             } | ||||
|             $this->fail('Error expected'); | ||||
|         } catch (\Error $e) { | ||||
|             $this->assertSame('BUG', $e->getMessage()); | ||||
|         } | ||||
|  | ||||
|         $this->assertNotNull($response->getInfo('error')); | ||||
|         $this->expectException(TransportExceptionInterface::class); | ||||
|         $response->getContent(); | ||||
|     } | ||||
|  | ||||
|     public function testResolve() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://symfony.com:8057/', [ | ||||
|             'resolve' => ['symfony.com' => '127.0.0.1'], | ||||
|         ]); | ||||
|  | ||||
|         $this->assertSame(200, $response->getStatusCode()); | ||||
|         $this->assertSame(200, $client->request('GET', 'http://symfony.com:8057/')->getStatusCode()); | ||||
|  | ||||
|         $response = null; | ||||
|         $this->expectException(TransportExceptionInterface::class); | ||||
|         $client->request('GET', 'http://symfony.com:8057/', ['timeout' => 1]); | ||||
|     } | ||||
|  | ||||
|     public function testNotATimeout() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057/timeout-header', [ | ||||
|             'timeout' => 0.9, | ||||
|         ]); | ||||
|         sleep(1); | ||||
|         $this->assertSame(200, $response->getStatusCode()); | ||||
|     } | ||||
|  | ||||
|     public function testTimeoutOnAccess() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057/timeout-header', [ | ||||
|             'timeout' => 0.1, | ||||
|         ]); | ||||
|  | ||||
|         $this->expectException(TransportExceptionInterface::class); | ||||
|         $response->getHeaders(); | ||||
|     } | ||||
|  | ||||
|     public function testTimeoutOnStream() | ||||
|     { | ||||
|         usleep(300000); // wait for the previous test to release the server | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057/timeout-body'); | ||||
|  | ||||
|         $this->assertSame(200, $response->getStatusCode()); | ||||
|         $chunks = $client->stream([$response], 0.2); | ||||
|  | ||||
|         $result = []; | ||||
|  | ||||
|         foreach ($chunks as $r => $chunk) { | ||||
|             if ($chunk->isTimeout()) { | ||||
|                 $result[] = 't'; | ||||
|             } else { | ||||
|                 $result[] = $chunk->getContent(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         $this->assertSame(['<1>', 't'], $result); | ||||
|  | ||||
|         $chunks = $client->stream([$response]); | ||||
|  | ||||
|         foreach ($chunks as $r => $chunk) { | ||||
|             $this->assertSame('<2>', $chunk->getContent()); | ||||
|             $this->assertSame('<1><2>', $r->getContent()); | ||||
|  | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         $this->fail('The response should have completed'); | ||||
|     } | ||||
|  | ||||
|     public function testUncheckedTimeoutThrows() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057/timeout-body'); | ||||
|         $chunks = $client->stream([$response], 0.1); | ||||
|  | ||||
|         $this->expectException(TransportExceptionInterface::class); | ||||
|  | ||||
|         foreach ($chunks as $r => $chunk) { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public function testDestruct() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|  | ||||
|         $start = microtime(true); | ||||
|         $client->request('GET', 'http://localhost:8057/timeout-long'); | ||||
|         $client = null; | ||||
|         $duration = microtime(true) - $start; | ||||
|  | ||||
|         $this->assertGreaterThan(1, $duration); | ||||
|         $this->assertLessThan(4, $duration); | ||||
|     } | ||||
|  | ||||
|     public function testProxy() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057/', [ | ||||
|             'proxy' => 'http://localhost:8057', | ||||
|         ]); | ||||
|  | ||||
|         $body = $response->toArray(); | ||||
|         $this->assertSame('localhost:8057', $body['HTTP_HOST']); | ||||
|         $this->assertRegexp('#^http://(localhost|127\.0\.0\.1):8057/$#', $body['REQUEST_URI']); | ||||
|  | ||||
|         $response = $client->request('GET', 'http://localhost:8057/', [ | ||||
|             'proxy' => 'http://foo:b%3Dar@localhost:8057', | ||||
|         ]); | ||||
|  | ||||
|         $body = $response->toArray(); | ||||
|         $this->assertSame('Basic Zm9vOmI9YXI=', $body['HTTP_PROXY_AUTHORIZATION']); | ||||
|     } | ||||
|  | ||||
|     public function testNoProxy() | ||||
|     { | ||||
|         putenv('no_proxy='.$_SERVER['no_proxy'] = 'example.com, localhost'); | ||||
|  | ||||
|         try { | ||||
|             $client = $this->getHttpClient(__FUNCTION__); | ||||
|             $response = $client->request('GET', 'http://localhost:8057/', [ | ||||
|                 'proxy' => 'http://localhost:8057', | ||||
|             ]); | ||||
|  | ||||
|             $body = $response->toArray(); | ||||
|  | ||||
|             $this->assertSame('HTTP/1.1', $body['SERVER_PROTOCOL']); | ||||
|             $this->assertSame('/', $body['REQUEST_URI']); | ||||
|             $this->assertSame('GET', $body['REQUEST_METHOD']); | ||||
|         } finally { | ||||
|             putenv('no_proxy'); | ||||
|             unset($_SERVER['no_proxy']); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @requires extension zlib | ||||
|      */ | ||||
|     public function testAutoEncodingRequest() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057'); | ||||
|  | ||||
|         $this->assertSame(200, $response->getStatusCode()); | ||||
|  | ||||
|         $headers = $response->getHeaders(); | ||||
|  | ||||
|         $this->assertSame(['Accept-Encoding'], $headers['vary']); | ||||
|         $this->assertStringContainsString('gzip', $headers['content-encoding'][0]); | ||||
|  | ||||
|         $body = $response->toArray(); | ||||
|  | ||||
|         $this->assertStringContainsString('gzip', $body['HTTP_ACCEPT_ENCODING']); | ||||
|     } | ||||
|  | ||||
|     public function testBaseUri() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', '../404', [ | ||||
|             'base_uri' => 'http://localhost:8057/abc/', | ||||
|         ]); | ||||
|  | ||||
|         $this->assertSame(404, $response->getStatusCode()); | ||||
|         $this->assertSame(['application/json'], $response->getHeaders(false)['content-type']); | ||||
|     } | ||||
|  | ||||
|     public function testQuery() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057/?a=a', [ | ||||
|             'query' => ['b' => 'b'], | ||||
|         ]); | ||||
|  | ||||
|         $body = $response->toArray(); | ||||
|         $this->assertSame('GET', $body['REQUEST_METHOD']); | ||||
|         $this->assertSame('/?a=a&b=b', $body['REQUEST_URI']); | ||||
|     } | ||||
|  | ||||
|     public function testInformationalResponse() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057/103'); | ||||
|  | ||||
|         $this->assertSame('Here the body', $response->getContent()); | ||||
|         $this->assertSame(200, $response->getStatusCode()); | ||||
|     } | ||||
|  | ||||
|     public function testInformationalResponseStream() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057/103'); | ||||
|  | ||||
|         $chunks = []; | ||||
|         foreach ($client->stream($response) as $chunk) { | ||||
|             $chunks[] = $chunk; | ||||
|         } | ||||
|  | ||||
|         $this->assertSame(103, $chunks[0]->getInformationalStatus()[0]); | ||||
|         $this->assertSame(['</style.css>; rel=preload; as=style', '</script.js>; rel=preload; as=script'], $chunks[0]->getInformationalStatus()[1]['link']); | ||||
|         $this->assertTrue($chunks[1]->isFirst()); | ||||
|         $this->assertSame('Here the body', $chunks[2]->getContent()); | ||||
|         $this->assertTrue($chunks[3]->isLast()); | ||||
|         $this->assertNull($chunks[3]->getInformationalStatus()); | ||||
|  | ||||
|         $this->assertSame(['date', 'content-length'], array_keys($response->getHeaders())); | ||||
|         $this->assertContains('Link: </style.css>; rel=preload; as=style', $response->getInfo('response_headers')); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @requires extension zlib | ||||
|      */ | ||||
|     public function testUserlandEncodingRequest() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057', [ | ||||
|             'headers' => ['Accept-Encoding' => 'gzip'], | ||||
|         ]); | ||||
|  | ||||
|         $headers = $response->getHeaders(); | ||||
|  | ||||
|         $this->assertSame(['Accept-Encoding'], $headers['vary']); | ||||
|         $this->assertStringContainsString('gzip', $headers['content-encoding'][0]); | ||||
|  | ||||
|         $body = $response->getContent(); | ||||
|         $this->assertSame("\x1F", $body[0]); | ||||
|  | ||||
|         $body = json_decode(gzdecode($body), true); | ||||
|         $this->assertSame('gzip', $body['HTTP_ACCEPT_ENCODING']); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @requires extension zlib | ||||
|      */ | ||||
|     public function testGzipBroken() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057/gzip-broken'); | ||||
|  | ||||
|         $this->expectException(TransportExceptionInterface::class); | ||||
|         $response->getContent(); | ||||
|     } | ||||
|  | ||||
|     public function testMaxDuration() | ||||
|     { | ||||
|         $client = $this->getHttpClient(__FUNCTION__); | ||||
|         $response = $client->request('GET', 'http://localhost:8057/max-duration', [ | ||||
|             'max_duration' => 0.1, | ||||
|         ]); | ||||
|  | ||||
|         $start = microtime(true); | ||||
|  | ||||
|         try { | ||||
|             $response->getContent(); | ||||
|         } catch (TransportExceptionInterface $e) { | ||||
|             $this->addToAssertionCount(1); | ||||
|         } | ||||
|  | ||||
|         $duration = microtime(true) - $start; | ||||
|  | ||||
|         $this->assertLessThan(10, $duration); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										49
									
								
								vendor/symfony/contracts/HttpClient/Test/TestHttpServer.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								vendor/symfony/contracts/HttpClient/Test/TestHttpServer.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | ||||
| <?php | ||||
|  | ||||
| /* | ||||
|  * This file is part of the Symfony package. | ||||
|  * | ||||
|  * (c) Fabien Potencier <fabien@symfony.com> | ||||
|  * | ||||
|  * For the full copyright and license information, please view the LICENSE | ||||
|  * file that was distributed with this source code. | ||||
|  */ | ||||
|  | ||||
| namespace Symfony\Contracts\HttpClient\Test; | ||||
|  | ||||
| use Symfony\Component\Process\PhpExecutableFinder; | ||||
| use Symfony\Component\Process\Process; | ||||
|  | ||||
| /** | ||||
|  * @experimental in 1.1 | ||||
|  */ | ||||
| class TestHttpServer | ||||
| { | ||||
|     private static $server; | ||||
|  | ||||
|     public static function start() | ||||
|     { | ||||
|         if (null !== self::$server) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         $finder = new PhpExecutableFinder(); | ||||
|         $process = new Process(array_merge([$finder->find(false)], $finder->findArguments(), ['-dopcache.enable=0', '-dvariables_order=EGPCS', '-S', '127.0.0.1:8057'])); | ||||
|         $process->setWorkingDirectory(__DIR__.'/Fixtures/web'); | ||||
|         $process->setTimeout(300); | ||||
|         $process->start(); | ||||
|  | ||||
|         self::$server = new class() { | ||||
|             public $process; | ||||
|  | ||||
|             public function __destruct() | ||||
|             { | ||||
|                 $this->process->stop(); | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         self::$server->process = $process; | ||||
|  | ||||
|         sleep('\\' === \DIRECTORY_SEPARATOR ? 10 : 1); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user