Я пытаюсь запустить скрипт CGI в текущей среде из другого модуля Perl. Все работает хорошо, используя стандартные системные вызовы для запросов GET. С POST тоже все в порядке, пока список параметров не станет слишком длинным, затем они будут обрезаны.
Кто-нибудь сталкивался с этой проблемой, или есть какие-либо предложения для других способов решить эту проблему?
Следующее несколько упрощено для ясности. Есть еще проверка ошибок и т. Д.
Для GET-запросов и POST-запросов без параметров , я делаю следующее:
# $query is a CGI object.
my $perl = $^X;
my $cgi = $cgi_script_location; # /path/file.cgi
system {$perl} $cgi;
- Параметры передаются через
Переменная среды QUERY_STRING.
- STDOUT захватывается вызывающим
Сценарий так что бы сценарий CGI
Отпечатки ведут себя как обычно.
- Эта часть работает.
Для POST-запросов с параметрами работает следующее, но, похоже, ограничивает мою доступную длину запроса:
# $query is a CGI object.
my $perl = $^X;
my $cgi = $cgi_script_location; # /path/file.cgi
# Gather parameters into a URL-escaped string suitable
# to pass to a CGI script ran from the command line.
# Null characters are handled properly.
# e.g., param1=This%20is%20a%20string¶m2=42&... etc.
# This works.
my $param_string = $self->get_current_param_string();
# Various ways to do this, but system() doesn't pass any
# parameters (different question).
# Using qx// and printing the return value works as well.
open(my $cgi_pipe, "|$perl $cgi");
print {$cgi_pipe} $param_string;
close($cgi_pipe);
- Этот метод работает для коротких списков параметров, но если вся команда становится близкой к 1000 символов, список параметров сокращается. Вот почему я попытался сохранить параметры в файл; чтобы избежать ограничений оболочки.
- Если я выгружаю список параметров из выполненного скрипта CGI, я получаю что-то вроде следующего:
param1=blah<br>
... a bunch of other parameters ...<br>
paramN=whatever<br>
p <-- cut off after 'p'. There are more parameters.<br>
Другие вещи, которые я сделал, которые не помогли или не помогли
$> perl index.cgi < temp-param-file
- Сохраняет $ param_string в файл, передавая этот файл в CGI-скрипт, как описано выше. Те же ограничения, что и при передаче команд через командную строку; все еще отрезан.
- Удостоверился, что
$CGI::POST_MAX
приемлемо высокий (это -1).
- Убедитесь, что обработка командной строки CGI работает. (: no_debug не установлен)
- Запустите CGI из командной строки с теми же параметрами. Это работает.
Ведет
- Очевидно, это похоже на ограничение количества символов в оболочке, которое Perl использует для выполнения команды, но оно не было разрешено путем передачи параметров через файл.