Курс 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!

Це обробляє один-єдиний запит і зупиняється. Щоб обслуговувати багато запитів, ви обгорнули б кроки .accept—читання—відповідь у цикл і зазвичай обробляли б кожне з’єднання у власному потоці виконання чи обіцянці, щоб повільні клієнти не блокували інших. Але суть вебсервера — рівно в цьому: прийми з’єднання, прочитай запит, напиши HTTP-відповідь.

Наступна сторінка робить саме це — сервер, що лишається живим і в циклі відповідає на запит за запитом, а не зупиняється після першого.

Навігація курсом

Тест — Очікування з’єднань   |   Обслуговування багатьох запитів


💪 Або перейдіть одразу до вправи цього розділу.