<?php
/**
* TEST: CGI worker.
*/
declare(strict_types=1);
use AmK\FastCGI;
use AmK\Server\CGI\Worker;
use React\EventLoop;
use React\Http;
use Tester\Assert;
require(__DIR__ . '/../../bootstrap.php');
$loop = EventLoop\Factory::create();
$connector = new FastCGI\Connector($loop);
$worker = new Worker($loop, $connector, null, __DIR__ . '/../../www', ['-n']);
register_shutdown_function([$worker, 'stop']);
$request = new Http\Io\ServerRequest(
'DELETE',
'/info',
[
'Host' => 'example.com',
],
null,
'1.1',
[
'SCRIPT_FILENAME' => 'info.php',
]
);
$worker->handle($request)
->then(function(Http\Response $r) use(&$response, &$content, $worker): void {
$response = $r;
$content = '';
/** @var $stream Http\Io\HttpBodyStream */
$stream = $r->getBody();
$stream->on('data', function(string $data) use(&$content): void {
$content .= $data;
});
$stream->on('end', function() use($worker): void {
if (DIRECTORY_SEPARATOR === '\\') {
exec("taskkill /F /PID {$worker->pid()}");
} else {
exec("kill {$worker->pid()}");
}
});
}, function(Http\Response $r) use(&$response): void {
$response = $r;
});
$worker->on('start', function() use(&$start): void {
$start = true;
});
$worker->on('exit', function() use(&$exit): void {
$exit = true;
});
$loop->run();
Assert::true($start);
Assert::true($exit);
/** @var $response Http\Response */
Assert::same(418, $response->getStatusCode());
$info = json_decode($content);
Assert::truthy($info);
Assert::same('info.php', $info->SCRIPT_FILENAME);
Assert::same('/info', $info->REQUEST_URI);
Assert::same('example.com', $info->HTTP_HOST);
Assert::same('DELETE', $info->REQUEST_METHOD);