Объект HTTP-ответа
Если необходимо изменить HTTP-статусный код (по умолчанию 200), или настроить заголовок, cookie, можно напрямую отправить строку в ответ клиенту.
Примечание
- За исключением ответа в формате chunkилиSSE, не допускается многократная отправка ответа в одном запросе, то есть не разрешается многократный вызов$connection->send().
- Необходимо вызвать $connection->send()один раз для каждого запроса, иначе клиент будет бесконечно ожидать.
Пример
use localzet\Server;
use localzet\Server\Connection\TcpConnection;
use localzet\Server\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
$server = new Server('http://0.0.0.0:8080');
$server->onMessage = function(TcpConnection $connection, Request $request)
{
    // Отправить клиенту сообщение "this is body"
    $connection->send("this is body");
};
// Запуск Server
Server::runAll();
Изменение статусного кода
Если нужно настроить статусный код, заголовок, cookie, необходимо использовать класс ответа localzet\Server\Protocols\Http\Response. Например, в следующем примере при обращении к пути /404 будет возвращен статусный код 404, а в теле ответа будет содержаться текст "
Извините, файл не найден
".Пример
use localzet\Server;
use localzet\Server\Connection\TcpConnection;
use localzet\Server\Protocols\Http\Request;
use localzet\Server\Protocols\Http\Response;
require_once __DIR__ . '/vendor/autoload.php';
$server = new Server('http://0.0.0.0:8080');
$server->onMessage = function(TcpConnection $connection, Request $request)
{
    if ($request->path() === '/404') {
        $connection->send(new Response(404, [], '<h1>Извините, файл не найден</h1>'));
    } else {
        $connection->send('this is body');
    }
};
// Запуск Server
Server::runAll();
После инициализации класса Response для изменения статусного кода можно использовать следующий метод.
$response = new Response(200);
$response->withStatus(404);
$connection->send($response);
Отправка заголовков
Также для отправки заголовков необходимо использовать класс ответа localzet\Server\Protocols\Http\Response.
Пример
use localzet\Server;
use localzet\Server\Connection\TcpConnection;
use localzet\Server\Protocols\Http\Request;
use localzet\Server\Protocols\Http\Response;
require_once __DIR__ . '/vendor/autoload.php';
$server = new Server('http://0.0.0.0:8080');
$server->onMessage = function(TcpConnection $connection, Request $request)
{
    $response = new Response(200, [
        'Content-Type' => 'text/html',
        'X-Header-One' => 'Значение заголовка'
    ], 'this is body');
    $connection->send($response);
};
// Запуск Server
Server::runAll();
После инициализации класса Response для добавления или изменения заголовков можно использовать следующий метод.
$response = new Response(200);
// Добавить или изменить один заголовок
$response->header('Content-Type', 'text/html');
// Добавить или изменить несколько заголовков
$response->withHeaders([
    'Content-Type' => 'application/json',
    'X-Header-One' => 'Значение заголовка'
]);
$connection->send($response);
Перенаправление
use localzet\Server;
use localzet\Server\Connection\TcpConnection;
use localzet\Server\Protocols\Http\Request;
use localzet\Server\Protocols\Http\Response;
require_once __DIR__ . '/vendor/autoload.php';
$server = new Server('http://0.0.0.0:8080');
$server->onMessage = function($connection, $request)
{
    $location = '/test_location';
    $response = new Response(302, ['Location' => $location]);
    $connection->send($response);
};
Server::runAll();
Отправка cookie
Также для отправки cookie необходимо использовать класс ответа localzet\Server\Protocols\Http\Response.
Пример
use localzet\Server;
use localzet\Server\Connection\TcpConnection;
use localzet\Server\Protocols\Http\Request;
use localzet\Server\Protocols\Http\Response;
require_once __DIR__ . '/vendor/autoload.php';
$server = new Server('http://0.0.0.0:8080');
$server->onMessage = function(TcpConnection $connection, Request $request)
{
    $response = new Response(200, [], 'this is body');
    $response->cookie('name', 'tom');
    $connection->send($response);
};
// Запуск Server
Server::runAll();
Отправка файла
Также для отправки файлов необходимо использовать класс ответа localzet\Server\Protocols\Http\Response.
Для отправки файла используйте следующую конструкцию
$response = (new Response())->withFile($file);
$connection->send($response);
- Localzet Server поддерживает отправку очень больших файлов
- Для больших файлов (более 2МБ) Localzet Server не считывает весь файл целиком в память, а вместо этого выбирает правильный момент для поэтапного считывания и отправки файла.
- Localzet Server оптимизирует скорость отправки файла в зависимости от скорости приема клиентом, обеспечивая максимальную скорость отправки файла при минимальном использовании памяти.
- Передача данных не блокируется и не влияет на обработку других запросов
- При отправке файла автоматически добавляется заголовок Last-Modified, чтобы сервер мог в следующий раз определить, отправлять ли ответ 304, сэкономив трафик и повысив производительность.
- Отправляемый файл автоматически отправляется с правильным заголовком Content-Typeдля браузера
- Если файла не существует, он автоматически отправляется как ответ 404
Пример
use localzet\Server;
use localzet\Server\Connection\TcpConnection;
use localzet\Server\Protocols\Http\Request;
use localzet\Server\Protocols\Http\Response;
require_once __DIR__ . '/vendor/autoload.php';
$server = new Server('http://0.0.0.0:8080');
$server->onMessage = function(TcpConnection $connection, Request $request)
{
    $file = '/your/path/of/file';
    // Проверка заголовка if-modified-since для определения, менялся ли файл
    if (!empty($if_modified_since = $request->header('if-modified-since'))) {
        $modified_time = date('D, d M Y H:i:s', filemtime($file)) . ' ' . \date_default_timezone_get();
        // Если файл не изменен, возвратить 304
        if ($modified_time === $if_modified_since) {
            $connection->send(new Response(304));
            return;
        }
    }
    // Если файл изменен или заголовок if-modified-since отсутствует, отправить файл
    $response = (new Response())->withFile($file);
    $connection->send($response);
};
// Запуск Server
Server::runAll();
Отправка данных в формате http chunk
- Сначала необходимо отправить ответ Responseс заголовкомTransfer-Encoding: chunkedклиенту
- Далее для отправки дополнительных chunk данных используйте класс localzet\Server\Protocols\Http\Chunk
- В конце необходимо отправить пустой chunk, чтобы завершить ответ
Пример
use localzet\Server;
use localzet\Server\Connection\TcpConnection;
use localzet\Server\Protocols\Http\Request;
use localzet\Server\Protocols\Http\Response;
use localzet\Server\Protocols\Http\Chunk;
require_once __DIR__ . '/vendor/autoload.php';
$server = new Server('http://0.0.0.0:8080');
$server->onMessage = function(TcpConnection $connection, Request $request)
{
    // Сначала отправить ответ с заголовком Transfer-Encoding: chunked
    $connection->send(new Response(200, array('Transfer-Encoding' => 'chunked'), 'hello'));
    // Далее для отправки дополнительных chunk данных используйте класс localzet\Server\Protocols\Http\Chunk
    $connection->send(new Chunk('Первый сегмент данных'));
    $connection->send(new Chunk('Второй сегмент данных'));
    $connection->send(new Chunk('Третий сегмент данных'));
   //  В конце обязательно отправить пустой chunk, чтобы завершить ответ
    $connection->send(new Chunk(''));
};
// Запуск Server
Server::runAll();

