Понимание этой реализации 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".

Другие вопросы по тегам