Здравствуйте, столкнулся с следующей задачей:<br>необходимо фильтровать HTTP запросы на уровне nginx, нужно пропускать GET запросы и POST запросы в теле которых валидный XML.<div>Написал на перле следующий модуль (в конце сообщения).</div>
<div>Всё отлично работает, проверяет валидность, адекватно реагирует, НО... в случае валидности POST запроса с XML он не возвращается на обработку nginx'у (не происходит выдача нужного контента ни через proxy_pass, ни через fastcgi_pass, ни через root), возвращает <span style="font-style:inherit;background-color:rgb(255,255,255);color:rgb(34,34,34);line-height:13px">405 Not Allowed.<br>
Пожалуйста подскажите как сделать что-бы продолжалась обработка запроса после проверки перловым модулем?</span></div><div><span style="font-style:inherit;background-color:rgb(255,255,255);color:rgb(34,34,34);line-height:13px"><br>
</span></div><div><span style="font-style:inherit;background-color:rgb(255,255,255);color:rgb(34,34,34);line-height:13px">Модуль:</span></div><div><br></div><div><div>package onlyxml;</div><div><br></div><div>use nginx;</div>
<div>use strict;</div><div>use XML::Simple;</div><div><br></div><div><br></div><div>sub test {</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>my $r = shift;</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre"> </span>if ($r->request_method eq "POST") {</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>if ($r->has_request_body(\&post)) {</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>return 400; # не валидный XML</div><div>
<span class="Apple-tab-span" style="white-space:pre"> </span>} else {</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>return 401; # пустой запрос</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>} else {</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>return DECLINED; # не GET запросы</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>}</div>
<div><br></div><div>}</div><div><br></div><div>sub post {</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>my $r = shift;</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre"> </span>$r->send_http_header;</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>my $xs = new XML::Simple();</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>my $hash;</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>eval {$hash = $xs->XMLin($r->request_body)};</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>if ($@){</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>return 400; # не валидный</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>} else {</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>### TODO: вернуть запрос nginx'у</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>return DECLINED; # Валидный xml</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>}</div>
<div>}</div><div><br></div><div>1;</div><div>__END__</div></div>