Skip to content
Snippets Groups Projects
Commit 2ff46f23 authored by Nicolas Grekas's avatar Nicolas Grekas
Browse files

[HttpClient] Fix option "bindto" with IPv6 addresses

parent 3a6213bd
No related branches found
No related tags found
No related merge requests found
......@@ -12,20 +12,26 @@ if (!$_POST) {
$_POST['content-type'] = $_SERVER['HTTP_CONTENT_TYPE'] ?? '?';
}
$headers = [
'SERVER_PROTOCOL',
'SERVER_NAME',
'REQUEST_URI',
'REQUEST_METHOD',
'PHP_AUTH_USER',
'PHP_AUTH_PW',
'REMOTE_ADDR',
'REMOTE_PORT',
];
foreach ($headers as $k) {
if (isset($_SERVER[$k])) {
$vars[$k] = $_SERVER[$k];
}
}
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;
if (0 === strpos($k, 'HTTP_')) {
$vars[$k] = $v;
}
}
......
......@@ -36,6 +36,7 @@ abstract class HttpClientTestCase extends TestCase
{
TestHttpServer::stop(8067);
TestHttpServer::stop(8077);
TestHttpServer::stop(8087);
}
abstract protected function getHttpClient(string $testCase): HttpClientInterface;
......@@ -1152,4 +1153,30 @@ abstract class HttpClientTestCase extends TestCase
$response = $client2->request('GET', '/');
$this->assertSame(200, $response->getStatusCode());
}
public function testBindToPort()
{
$client = $this->getHttpClient(__FUNCTION__);
$response = $client->request('GET', 'http://localhost:8057', ['bindto' => '127.0.0.1:9876']);
$response->getStatusCode();
$vars = $response->toArray();
self::assertSame('127.0.0.1', $vars['REMOTE_ADDR']);
self::assertSame('9876', $vars['REMOTE_PORT']);
}
public function testBindToPortV6()
{
TestHttpServer::start(8087, '[::1]');
$client = $this->getHttpClient(__FUNCTION__);
$response = $client->request('GET', 'http://[::1]:8087', ['bindto' => '[::1]:9876']);
$response->getStatusCode();
$vars = $response->toArray();
self::assertSame('::1', $vars['REMOTE_ADDR']);
self::assertSame('9876', $vars['REMOTE_PORT']);
}
}
......@@ -21,7 +21,7 @@ class TestHttpServer
/**
* @return Process
*/
public static function start(int $port = 8057)
public static function start(int $port = 8057, $ip = '127.0.0.1')
{
if (isset(self::$process[$port])) {
self::$process[$port]->stop();
......@@ -32,14 +32,14 @@ class TestHttpServer
}
$finder = new PhpExecutableFinder();
$process = new Process(array_merge([$finder->find(false)], $finder->findArguments(), ['-dopcache.enable=0', '-dvariables_order=EGPCS', '-S', '127.0.0.1:'.$port]));
$process = new Process(array_merge([$finder->find(false)], $finder->findArguments(), ['-dopcache.enable=0', '-dvariables_order=EGPCS', '-S', $ip.':'.$port]));
$process->setWorkingDirectory(__DIR__.'/Fixtures/web');
$process->start();
self::$process[$port] = $process;
do {
usleep(50000);
} while (!@fopen('http://127.0.0.1:'.$port, 'r'));
} while (!@fopen('http://'.$ip.':'.$port, 'r'));
return $process;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment