Понимание этой реализации Plack
Я смотрю на странную реализацию веб-сервиса, использующего Plack, и не могу понять, как все эти части объединяются (коллега скопировал и изменил его из учебника, но больше не может найти учебник).
Во-первых, этот код работает, как ни странно.
Вот что я знаю: на высоком уровне этот код реализует веб-сервис. Из-за соглашений Plack этот файл должен возвращать метод, который принимает параметры запроса в качестве входных данных, а затем возвращает HTTP-код и тело. Вот почему есть "my $app = sub {". Предполагая, что это последняя строка в файле (это app.psgi), это будет возвращаемое значение файла.
Я не понимаю, некоторые вещи, начинающиеся с "возврат суб". Я полагаю, что это по существу переопределяет "my $app = sub {", потому что теперь это функция, которую файл будет возвращать.
Тем не менее, это может быть неправильно, потому что, кажется, принимать разные аргументы. Вместо того, чтобы брать $env (который является информацией о запросе, включая GET-параметры), он принимает аргумент $responseder. Когда я распечатываю тип этого, это КОД. Я не знаю, что это значит.
Затем следующая строка, кажется, одновременно возвращает HTTP-код (начиная с нашего ответа) и получает средство записи для записи дополнительных данных. Все после этого имеет смысл.
Итак, в заключение мне нужна помощь в понимании того, что делает этот второй метод, и какова природа его аргументов. Большое спасибо заранее.
use strict;
use warnings;
use Plack::Request;
use POSIX ":sys_wait_h";
use IO::Handle;
STDOUT->autoflush(1);
my $app = sub {
my $env = shift;
my $req = Plack::Request->new($env);
print "Worker PID: $$\n";
my $params = $req->parameters();
return sub {
my $responder = shift;
#this will print "responder type: CODE"
print "responder type: " . (ref $responder) . "\n";
my $writer = $responder->(
[ 200, [ 'Content-Type', 'application/html' ]]);
$writer->write("some content");
$writer->close();
}
}
1 ответ
С помощью return
в подпрограмме вступает в силу только тогда, когда подпрограмма запускается, а не когда она возвращается.
Вместо прямого возврата ответа приложение может вернуть ссылку на код:
Приложения ДОЛЖНЫ возвращать ответ как ссылку на массив из трех элементов или ссылку на код для ответа с задержкой / потоковой передачей.
Подробности описаны в разделе " Задержка ответа и потоковая передача в PSGI".