Мне нужно запустить очень упрощенный фрагмент кода Perl в ответ на HTTP-запрос. Конфигурация nginx:
http {
perl_modules perl/lib;
perl_require errors.pm;
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
location / {
perl errors::response;
}
}
}
Код, который я пытаюсь запустить:
package errors;
use strict;
use warnings;
use nginx;
my $errors = {
ThisIsNotOK => {
'code' => '409',
'amzcode' => 'NOK',
'message' => 'Something went really wrong'
},
ItsOK => {
'code' => '200',
'amzcode' => 'OK',
'message' => 'Okay'
},
};
my $fmt =<<ENDFMT;
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>%s</Code>
<Message>%s</Message>
<Resource>/mybucket/whatever.1</Resource>
<RequestId>DEADBEEFBEDAEDA</RequestId>
</Error>
ENDFMT
sub response() {
my $r = shift();
my $curr_err = (keys %$errors)[rand keys %$errors];
$r->send_http_header("application/xml");
$r->status($errors->{$curr_err}{'code'});
$r->print(sprintf($fmt,$errors->{$curr_err}{'amzcode'}, $errors->{$curr_err}{'message'}));
return $errors->{$curr_err}{'code'};
}
1;
__END__
Проблема в том, что когда этот код возвращает что-то, кроме 200 / OK, я получаю ошибку пустого ответа:
% curl -iX GET localhost
curl: (52) Пустой ответ от сервера
версия nginx: nginx / 1.14.1
построено gcc 8.2.1 20180905 (Red Hat 8.2.1-3) (GCC)
построено с OpenSSL 1.1.1 FIPS 11 сентября 2018 г. (работает с OpenSSL 1.1.1c FIPS 28 мая 2019 г.)
Включена поддержка TLS SNI
Что я делаю не так?