shoorick: (Default)
shoorick ([personal profile] shoorick) wrote2009-04-23 01:46 pm

Или туда, или сюда

В ходе борьбы с самописными изобретениями лисапедов, унаследованными с каких-то древних времён, стал снова читать передаваемые скрипту аргументы старым добрым модулем CGI. Выяснил, что одновременное чтение аргументов методами POST и GET не получается: если параметры переданы методом POST, то CGI.pm не желает заниматься разбором URL (а писать самому — не наш метод).

[identity profile] porutchik.livejournal.com 2009-04-23 02:11 pm (UTC)(link)
# Some people want to have their cake and eat it too!
# Uncomment this line to have the contents of the query string
# APPENDED to the POST data.
# $query_string .= (length($query_string) ? '&' : '') . $ENV{'QUERY_STRING'} if defined $ENV{'QUERY_STRING'};
last METHOD;


CGI.pm 3.29, line 647
ext_659893: Sapa (Default)

[identity profile] sappa.livejournal.com 2009-04-23 02:28 pm (UTC)(link)
Хакать CGI.pm это плохая магия. Я бы отрывал руки. На крайний случай (если чтение документации не помогает) можно объявить свой класс унаследованный от CGI и написать в нем свой метод init. Но мне таких крайних случаев не попадалось.
ext_659893: Sapa (Default)

[identity profile] sappa.livejournal.com 2009-04-23 02:23 pm (UTC)(link)
> если параметры переданы методом POST, то CGI.pm не желает заниматься разбором URL

Желает. Читаем главу MIXING POST AND URL PARAMETERS в доке perldoc CGI.

my $cgi = new CGI;

if ($cgi->request_method() eq 'POST') {
    my $id_from_body = $cgi->param('id');
    my $id_from_url  = $cgi->url_param('id');
    ...
}


Обычно, если параметр один (в данном примере еще и не пустой и не ноль),
но передается неизвестно где, то достаточно просто написать:

my $session_id = $cgi->param('session_id') || $cgi->url_param('session_id');


uncomment, говоришь?

[identity profile] shoorick.livejournal.com 2009-04-24 05:15 am (UTC)(link)
Не наш метод.

Промахнулся

[identity profile] shoorick.livejournal.com 2009-04-24 05:17 am (UTC)(link)
Коммент про не наш метод, вообще-то, был Роме адресован :-)