193 lines
4.6 KiB
PHP
193 lines
4.6 KiB
PHP
|
<?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 '/404-gzipped':
|
||
|
header('Content-Type: text/plain', true, 404);
|
||
|
ob_start('ob_gzhandler');
|
||
|
@ob_flush();
|
||
|
flush();
|
||
|
usleep(300000);
|
||
|
echo 'some text';
|
||
|
exit;
|
||
|
|
||
|
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;
|
||
|
|
||
|
case '/json':
|
||
|
header('Content-Type: application/json');
|
||
|
echo json_encode([
|
||
|
'documents' => [
|
||
|
['id' => '/json/1'],
|
||
|
['id' => '/json/2'],
|
||
|
['id' => '/json/3'],
|
||
|
],
|
||
|
]);
|
||
|
exit;
|
||
|
|
||
|
case '/json/1':
|
||
|
case '/json/2':
|
||
|
case '/json/3':
|
||
|
header('Content-Type: application/json');
|
||
|
echo json_encode([
|
||
|
'title' => $vars['REQUEST_URI'],
|
||
|
]);
|
||
|
|
||
|
exit;
|
||
|
}
|
||
|
|
||
|
header('Content-Type: application/json', true);
|
||
|
|
||
|
echo $json;
|