Курс языка программирования 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-ответ.
Следующая страница как раз это и делает: сервер, который остаётся в живых и в цикле отвечает на запрос за запросом, а не останавливается после первого.
Навигация по курсу
← Тест — Ожидание соединений | Обслуживание множества запросов →
💪 Или перейдите сразу к упражнению
этого раздела.