Forum Webscript.Ru

Программирование => Perl => Тема начата: teebot от 11 Июня 2003, 16:25:22

Название: я в шоке. CONTENT_LENGTH
Отправлено: teebot от 11 Июня 2003, 16:25:22
Доброе время суток.

использую в форме метод POST, в скрипте хочу получить данные через read(STDIN,$buffer,$ENV{CONTENT_LENGTH});

но $buffer всегда пустой.
Я перенес сайт с одного сервера на другой. И вот такая беда.

Куда смотреть даже не заваю.

Помогите кто чем сможет.
Спасибо.
Название: я в шоке. CONTENT_LENGTH
Отправлено: NeoNox от 11 Июня 2003, 16:55:29
Выложи кусок скрипта где определяется $buffer и эта строчка.
Название: я в шоке. CONTENT_LENGTH
Отправлено: teebot от 11 Июня 2003, 17:11:53
#!/usr/bin/perl

read(STDIN,$st,$ENV{\'CONTENT_LENGTH\'});
@pairs = split(/&/, $st);
 foreach $pair (@pairs)
    {
      ($name, $value) = split(/=/, $pair);
      $value =~ tr/+/ /;
      $value=~ s /%0D%0A/
/g;
      $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(\'C\', hex($1))/eg;
      $FORM{$name} = $value;
  }
..................
на предидущем сервере это работало.
Название: я в шоке. CONTENT_LENGTH
Отправлено: NeoNox от 11 Июня 2003, 17:28:20
Значит пора переходить тебе на модуль CGI
perldoc CGI;

use CGI qw(:standard);

my %FORM;
$FORM{fieldname} = param(fildname);

и далее...
Название: я в шоке. CONTENT_LENGTH
Отправлено: Yaroslav от 11 Июня 2003, 17:29:20
эээээ а где - $buffer = $ENV{\'QUERY_STRING\'}; ?
Название: я в шоке. CONTENT_LENGTH
Отправлено: NeoNox от 11 Июня 2003, 17:35:42
Yaroslav
эээээ а зачем он там нужен???
Название: я в шоке. CONTENT_LENGTH
Отправлено: Yaroslav от 11 Июня 2003, 17:40:18
Цитировать
NeoNox:
эээээ а зачем он там нужен???

так вот же
Цитировать
teebot:
но $buffer всегда пустой.
Название: я в шоке. CONTENT_LENGTH
Отправлено: teebot от 11 Июня 2003, 18:11:46
ну ладно не прикалывайтесь.
нам теперь $buffer не нужна на ее месте теперь $st.
Говорим $buffer подрозумеваем $st.
Название: я в шоке. CONTENT_LENGTH
Отправлено: Phoinix от 11 Июня 2003, 19:26:42
teebot

Может проблема в HTML форме ???

Попробуй все-таки проверить через CGI передаются переменные или нет? Тем более это не так долго...
Название: я в шоке. CONTENT_LENGTH
Отправлено: teebot от 12 Июня 2003, 10:33:58
Ну вот форма, вроде ничего особенного, к тому же на старом месте все работало (вот что меня сбивает с толку).


";

















Автор*:
Тема*:
E-Mail:
Сообщение*:



теги вроде все закрыты.
Название: я в шоке. CONTENT_LENGTH
Отправлено: Yaroslav от 12 Июня 2003, 11:40:02
тут много вопросов и надо все видеть что б понять, а вообще я только этой ночью написал скрипт похожий на тот что сейчас у тебя http://forums.webscript.ru/showthread.php?s=&threadid=12366&pagenumber=2  (правда не знаю что твой делать должен, но думаю тебе нет проблем исправить)
Название: я в шоке. CONTENT_LENGTH
Отправлено: teebot от 12 Июня 2003, 12:34:31
посмотрел, попробовал вставить if ($ENV{\'QUERY_STRING\'}) {$namevalues = $ENV{\'QUERY_STRING\'};}
else {read(STDIN, $namevalues, $ENV{\'CONTENT_LENGTH\'});}
 не помогло.

Вот мой заголовок запроса

POST http://путь/cgi-bin/nt.pl HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, application/pdf, */*
Referer: http://путь/cgi-bin/readtop.pl?dir=linux&page=0
Accept-Language: ru
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)
Host: сервак
Content-Length: 48
Pragma: no-cache
Cookie: phpbb2mysql_data=a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bs%3A0%3A%22%22%3Bs%3A6%3A%22userid%22%3Bs%3A2%3A%2288%22%3B%7D

aname=12&folderdir=linux&topik=2&email=&vopros=2


данные передаються. Значит с формой я так понял все классно.
почему же тогда $st всегда пустая.
Я уже интересовался насчет каких-то ограничений на хостинге, говорят что нет таких.
может есть еще какая нибудь переменная окружения гдежно выцепить передаваемые данные?
Название: я в шоке. CONTENT_LENGTH
Отправлено: teebot от 12 Июня 2003, 12:39:47
посмотрел, попробовал вставить if ($ENV{\'QUERY_STRING\'}) {$namevalues = $ENV{\'QUERY_STRING\'};}
else {read(STDIN, $namevalues, $ENV{\'CONTENT_LENGTH\'});}
 не помогло.

Вот мой заголовок запроса

POST http://путь/cgi-bin/nt.pl HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, application/pdf, */*
Referer: http://путь/cgi-bin/readtop.pl?dir=linux&page=0
Accept-Language: ru
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)
Host: сервак
Content-Length: 48
Pragma: no-cache
Cookie: phpbb2mysql_data=a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bs%3A0%3A%22%22%3Bs%3A6%3A%22userid%22%3Bs%3A2%3A%2288%22%3B%7D

aname=12&folderdir=linux&topik=2&email=&vopros=2


данные передаються. Значит с формой я так понял все классно.
почему же тогда $st всегда пустая.
Я уже интересовался насчет каких-то ограничений на хостинге, говорят что нет таких.
может есть еще какая нибудь переменная окружения гдежно выцепить передаваемые данные?
Название: я в шоке. CONTENT_LENGTH
Отправлено: NCRangeR от 12 Июня 2003, 13:13:08
teebot
У меня такое уже было :(

Попробуй получать данные из POST в самом-самом-самом начале работы скрипта.

Некоторые встроенные функции типа "cookie" делают sysread до тебя, таким образом информация теряется.

Еще попробуй вместо просто sysread сделать вот так:

$PostContent = "";
while (sysread STDIN, $str, $ENV {"CONTENT_LENGTH"})
{
$PostContent .= $str;
};
Название: я в шоке. CONTENT_LENGTH
Отправлено: teebot от 12 Июня 2003, 13:45:42
ничего не изменилось.
пробовал вставить твой кусок.

а sysread  у мен я и так самой первой строчкой стоит,ну после #!/usr/bin/perl, розумеется.
Название: я в шоке. CONTENT_LENGTH
Отправлено: NCRangeR от 12 Июня 2003, 13:53:07
Попробуй просто сервак поиспытывать.
Например, вот такой скрипт будет работать или нет:

#!/usr/local/bin/perl -w
#Имя - x.pl
print "Content-Type: text/html\\n\\n";
print "
";
sysread STDIN, $x, $ENV{\'CONTENT_LENGTH\'};
print $x;
Название: я в шоке. CONTENT_LENGTH
Отправлено: teebot от 12 Июня 2003, 15:12:51
скрипт сам по себе работает, появляется поле для ввода.
набирал туда текст жмакал enter
нифига.
print $x;
ничего не показывает.
Название: я в шоке. CONTENT_LENGTH
Отправлено: NCRangeR от 12 Июня 2003, 16:10:08
teebot
а что возвращает вызов
$a = sysread STDIN, $x, $ENV{\'CONTENT_LENGTH\'}; ?

0 или undef?

if (defined $a) { print $a; } else { print "undef"; };

Кстати, чему равен сам $ENV{\'CONTENT_LENGTH\'}?, вроде бы не обнаружил этого, почитав логи темы..
что будет, если написать
print $ENV{\'CONTENT_LENGTH\'}?

P.S. И всё-таки попробуй модуль CGI..
Название: я в шоке. CONTENT_LENGTH
Отправлено: teebot от 12 Июня 2003, 16:56:47
пишет 0.
я так понимаю это не плохой признак. просто прочитано 0 байт.
(мне кажется провайдер темнит, что-то у них там намучено.)

если написать print $ENV{\'CONTENT_LENGTH\'}; ничего не будет - пусто.
Название: я в шоке. CONTENT_LENGTH
Отправлено: NCRangeR от 12 Июня 2003, 17:05:54
teebot
теекс.. раз ноль (в смысле - не показывает значение $ENV{..}) - значит вызов sysread читает 0 байт не потому, что ничего нет, а потому что так "велено"..
Попробуй так:

$PostContent = "";
while (sysread STDIN, $str, 1)
{
$PostContent .= $str;
};

Почти то же, что я уже предлагал, только с маленьким исправлением..

P.S. Что будет, если написать вот таукую вещь:
print map ("$_: $ENV{$_}
", keys %ENV);
?
(у меня просто выводит всё окружение)
Название: я в шоке. CONTENT_LENGTH
Отправлено: teebot от 12 Июня 2003, 17:15:26
$PostContent пустая. :-(
но обнаружилась интересаня деталь при распечатке окржения. REQUEST_METHOD: GET
Название: я в шоке. CONTENT_LENGTH
Отправлено: NCRangeR от 12 Июня 2003, 18:00:16
teebot
Всегда так? У меня GET выдается только при первом запуске, если скрипту передаются данные, то POST.
А CONTENT_LENGTH согласно распечатке чему равен?

P.S.
попробуй вариант с CGI:
#!/usr/local/bin/perl -w
use CGI;
print "Content-Type: text/html\\n\\n";
print "
";
$cgi = new CGI;
$x = $cgi -> param(\'q\');
print $x;
print map ("$_: $ENV{$_}
", sort keys %ENV);

хотя, боюсь, будет то же самое.. :(
Название: я в шоке. CONTENT_LENGTH
Отправлено: teebot от 12 Июня 2003, 18:30:56
какой жеж CONTENT_LENGTH если метод GET.
там QUERY_STRING: но в нем ничего нет.
Название: я в шоке. CONTENT_LENGTH
Отправлено: teebot от 12 Июня 2003, 18:57:16
Все тема закрыта, я нашел ошибку.
дело в путях к скрипту.
я пишу http://www.ля-ля-ля/cgi-bin/мой_скрипт
но на самом деле запрос идет на home.ля-ля-ля/cgi-bin/мой_скрипт
вот при переходе между www и home запрос POST превращается в GET.
Достаточно мутно, я сам до конца не понял. Я так понял что проблема в настройках сервака провайдера. (Apache, виртуальные домены и т.д.).