Очень просто, вы, вероятно, не должны.Все, что вы делаете из кода плагина для прерывания обработки, выбивает способность пользовательского кода хорошо справляться с ситуацией (например, путем выдачи ошибки проверки или приятной страницы ошибки вместо страницы исключения Catalyst).
Однако еще не все потеряно.Почему бы не попробовать что-то вроде этого?
around 'prepare_body' => sub {
my ($orig, $self) = (shift, shift);
my ($c) = @_;
my $max_length = $c->config->{'Plugin::WhateverMyNameIs'}->{max_request_size};
$max_length = 1_000_000 unless defined $max_length; # default
my $length = $c->engine->read_length;
if ($length <= $max_length) { # ok, go ahead
$self->$orig(@_);
} else {
$c->stash->{request_body_aborted} = 1;
}
};
Это остановит чтение, если ваш запрос слишком большой, но это позволит отправке продолжаться как обычно - это означает, что вы захотите написать некоторый код в вашемдействие, или в действии begin
, или в корне цепочки, которое проверяет наличие $c->stash->{request_body_aborted}
и делает что-то подходящее - устанавливает ли это ошибку проверки формы, или вызывает $c->error("Request too large"); $c->detach
или что-то еще.Он также настраивается, как и любой плагин.