Perl CGI проблема
Я занимаюсь разработкой, которая использует встроенный Linux для ОС и Boa для веб-сервера. У меня есть веб-страница, которая публикует сценарий CGI, обрабатывает данные формы и отвечает. Моя среда разработки была Ubuntu, и все работало нормально, но когда я перенес свой код на встроенный Linux, модуль CGI не был создан (или, по крайней мере, не был создан). Вот урезанный раздел моего кода. Оператор print жалуется на неинициализированную переменную.
use CGI;
use strict;
use warnings;
my $cgiObj = CGI->new();
print $cgiObj->param('wlanPort');
Опять же, это прекрасно работает в моей среде разработки, но не работает во встроенной среде. CGI.pm установлен, и в команде CGI->new() нет ошибок. Я также проверил, что данные формы отправляются, но, очевидно, не могу гарантировать, что они получены сценарием Perl.
У меня есть ощущение, что это проблема конфигурации Боа, и это то, что я буду смотреть дальше. Я довольно новичок в Perl, поэтому я не уверен, что еще делать. Есть идеи?
РЕДАКТИРОВАТЬ: Определенно не проблема конфигурации Боа. Все еще смотрю на это.
ОБНОВЛЕНИЕ: я упростил мой код до следующего:
#!/usr/bin/perl
use CGI qw(:standard);
$data = param('wlanPort') || '<i>(No Input)</i>';
print header;
print <<END;
<title>Echoing user input</title>
<p>wlanPort: $data</p>
END
Как и ожидалось, он печатает (без ввода)
Я также должен указать, что форма enctype="multipart/form-data", потому что у меня должна быть возможность загрузки файла, и я использую метод "POST".
Я использовал плагин HttpFox для проверки почтовых данных и проверил значение wlanPort:
----------------------------- 132407047814270795471206851178 Содержание-Расположение: форма-данные; имя = "wlanPort"
eth1
Так что это почти наверняка отправляется...
ОБНОВЛЕНИЕ 2: Я установил ту же версию Perl и Boa, которая используется во встроенной системе, на моем ноутбуке Ubuntu. Работает на ноутбуке, а не на устройстве, что является тем же результатом. Я сказал своему работодателю, что исчерпал все возможности, кроме того, как Boa и (Micro) Perl построены на устройстве по сравнению с Ubuntu.
2 ответа
CGI - это очень простой протокол, и хотя я не могу ответить на ваш вопрос напрямую, я могу предложить несколько методов, которые помогут изолировать проблему.
Если ваша форма отправляется через POST, то содержимое этой формы будет отображаться в виде строки с кодированием URL в содержимом HTTP-запроса, который получает ваш скрипт. Если вы вообще не используете модуль CGI, вы сможете прочитать запрос из STDIN:
my $request = "";
while (<STDIN>) {
$request .= $_;
}
if (open my $out, ">>/tmp/myapp.log") {
print $out $request;
close $out;
}
Затем вы можете просмотреть /tmp/myapp.log, чтобы узнать, получаете ли вы всю информацию из запроса, который вы считаете нужным.
Для полноты, если ваша форма отправляется через GET, аргументы будут в переменной среды QUERY_STRING, которую вы можете посмотреть в Perl с помощью $ENV{'QUERY_STRING'}.
Не должно быть никакой разницы в том, как объектный интерфейс CGI и функциональный интерфейс анализируют запрос. Я не знаком с боа, но не представляю, как он нарушает базовый протокол CGI.
Распространенная проблема заключается в том, что вы назвали параметр формы одним словом и ищете другое имя параметра в сценарии CGI. Это всегда смех.
Удачи и надеюсь, что это поможет некоторым.
Я знаю, что это очень старая статья, и OP может не интересоваться какой-либо новой информацией, связанной с этим, но общий вопрос о том, как отлаживать CGI-скрипты, все еще имеет некоторое значение. У меня были похожие проблемы с средами разработки и разработки. Чтобы помочь тем, кто наткнулся на эту ветку, я публикую свой опыт работы с этой ситуацией. Мой простой ответ - использовать модули Log::Log4perl и Data::Dumper для демистификации этого (при условии, что есть способ доступа к журналам в вашей среде prod). Таким образом, с незначительными накладными расходами, вы можете включить трассировку, когда возникают проблемы (даже если код работал раньше, но из-за изменений со временем он начал давать сбой). Регистрируйте каждый соответствующий бит информации на соответствующем уровне журнала (трассировка, отладка, информация, предупреждение, ошибка, фатальный) и настройте, какой уровень подходит для операций. Без этих механизмов будет очень трудно понять производственные операции. Надеюсь это поможет.
use CGI;
use Log::Log4perl qw(easy);
use Data::Dumper;
use strict;
use warnings;
my $cgiObj = CGI->new();
my $log = Log::Log4perl::get_logger();
$log->trace("CGI Data: " . Dumper($cgiObj));
print $cgiObj->param('wlanPort');