Курс языка программирования Raku / Функциональное, конкурентное, реактивное и веб-программирование / Веб-программирование / Простой HTTP-сервер

Ответ на запрос

Когда клиент подключился, вы читаете его запрос и отправляете ответ. Для веб-браузера ответ должен быть корректным HTTP: строка состояния, необязательные заголовки, пустая строка, а затем тело.

my $listener = IO::Socket::INET.new(
    :listen,
    :localhost('127.0.0.1'),
    :localport(8080),
);

my $conn = $listener.accept;
my $request = $conn.recv;

$conn.print("HTTP/1.0 200 OK\r\nContent-Type: text/plain\r\n\r\nHello, web!\n");
$conn.close;
$listener.close;

Ответ повторяет формат запроса, который вы видели на стороне клиента. HTTP/1.0 200 OK — строка состояния, Content-Type: text/plain — заголовок, пустая строка (\r\n\r\n) завершает заголовки, а Hello, web! — тело, которое отображает браузер.

Запустите эту программу, затем постучитесь к ней из другого терминала с помощью curl (или откройте http://127.0.0.1:8080/ в браузере) — и она напечатает тело прямо на экран:

$ curl http://127.0.0.1:8080/
Hello, web!

Так обрабатывается один запрос, после чего программа останавливается. Чтобы обслуживать много запросов, шаги «принять соединение — прочитать — ответить» заворачивают в цикл и обычно обрабатывают каждое соединение в отдельном потоке или промисе, чтобы медленные клиенты не задерживали остальных. Но суть веб-сервера именно в этом: принять соединение, прочитать запрос, записать HTTP-ответ.

Следующая страница как раз это и делает: сервер, который остаётся в живых и в цикле отвечает на запрос за запросом, а не останавливается после первого.

Навигация по курсу

Тест — Ожидание соединений   |   Обслуживание множества запросов


💪 Или перейдите сразу к упражнению этого раздела.