Курс по 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 отговор.

Следващата страница прави точно това — сървър, който остава жив и в цикъл отговаря на заявка след заявка, вместо да спре след първата.

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

Тест — Слушане   |   Обслужване на много заявки


💪 Или преминете направо към упражнението към този раздел.