Perl CGI: получить запрос не работает, если URL-адрес жестко закодирован

Я пытаюсь определить различия между двумя строками во время запроса на получение URL (используя LWP::Simple).
У меня есть URL-адрес, например http://www.example.com?param1=x¶m2=y¶m3=z
Я удостоверяюсь, что все пустые входные данные также учитываются, но на данный момент это не имеет значения, потому что я удостоверяюсь, что все параметры точно такие же.
Кроме того, жестко закодированный URL-адрес копируется и вставляется из сгенерированного URL-адреса.
Этот URL работает, когда я делаю следующее:

my $url = "http://www.example.com?param1=x&param2=y&param3=z";
my $content = get($url);

Тем не менее, когда я создаю URL-адрес из параметров, предоставленных пользователем, запрос на получение не работает (ошибка: 500 с сайта).
Я сравнил два URL-адреса, распечатав их, и не вижу никаких различий. Я попытался удалить все потенциально невидимые символы.

Вывод для сгенерированного кода и статической строки, предполагая, что пользовательский ввод такой же, как и статическая строка (именно это я и делаю) :

http://www.example.com?param1=x&param2=y&param3=z
http://www.example.com?param1=x&param2=y&param3=z

Я предполагаю, что печать выходных данных удаляет символы, которые я не вижу. Я также следил за решением на http://www.perlmonks.org/?node_id=882590 и он указывает на различия, но я не знаю почему, учитывая, что я не вижу их вообще.
Кто-нибудь сталкивался с этой проблемой раньше? Пожалуйста, дайте мне знать, если мне нужно что-то уточнить или предоставить дополнительную информацию.




EDIT: проблема и решение
Итак, после использования предложения моба для выявления различий я обнаружил, что в сгенерированном URL-адресе был нулевой символ, который не печатался. на выходе. То есть:
http://www.example.com?param1=x&param2=y&param3=z на самом деле
http://www.example.com?param1=x&param2=y&param3=\000z.
Я использовал простое регулярное выражение: $url =~ s/\000//g;, чтобы удалить это (и любое другое) нулевое значение.


person Thumper    schedule 10.01.2013    source источник
comment
можете ли вы предоставить свой код для анализа пользовательского ввода, а также вывод, показывающий различия   -  person foundry    schedule 10.01.2013
comment
Я просто передаю значения через POST и беру их по имени. Оказывается, одно из значений POST добавило последовательность NULL, а я даже не рассматривал это.   -  person Thumper    schedule 11.01.2013


Ответы (2)


Используйте функцию сериализации данных, чтобы проверить ваши строки на наличие скрытых символов.

$url1 = "http://www.example.com?param1=x&param2=y";
$url2 = "http://www.example.com?param1=x&param2=y\0";
$url3 = "http://www.example.com?param1=x&param2=y\n";

use JSON;
print JSON->new->pretty(1)->encode( [$url1,$url2,$url3] );
# Result:
# [
#   "http://www.example.com?param1=x&param2=y",
#   "http://www.example.com?param1=x&param2=y\u0000",
#   "http://www.example.com?param1=x&param2=y\n"
# ]


use Data::Dumper;
$Data::Dumper::Useqq = 1;
print Dumper($url1,$url2,$url3);
# Result:
# $VAR1 = "http://www.example.com?param1=x&param2=y";
# $VAR2 = "http://www.example.com?param1=x&param2=y\0";
# $VAR3 = "http://www.example.com?param1=x&param2=y\n";
person mob    schedule 10.01.2013
comment
Что ж, благодаря вам, я нашел разницу... может быть, это главная проблема. В сгенерированном URL-адресе один параметр — value=\000989%20Yakima (которого я не вижу, когда просто распечатываю его. Жестко запрограммированный параметр: value=989%20Yakima. Прогресс! - person Thumper; 11.01.2013

Очевидно, что построенная вами строка отличается от жестко закодированной. Если вы пишете такой код

my $ss = 'http://www.example.com?param1=x&param2=y&param3=z';
print join(' ', map " $_", $ss =~ /./g), "\n";
print join(' ', map sprintf('%02X', ord), $ss =~ /./g), "\n";

тогда вы сможете увидеть шестнадцатеричное значение каждого символа в строке и сможете более точно сравнить их два. Например, приведенный выше код выводит

 h  t  t  p  :  /  /  w  w  w  .  e  x  a  m  p  l  e  .  c  o  m  ?  p  a  r  a  m  1  =  x  &  p  a  r  a  m  2  =  y  &  p  a  r  a  m  3  =  z
68 74 74 70 3A 2F 2F 77 77 77 2E 65 78 61 6D 70 6C 65 2E 63 6F 6D 3F 70 61 72 61 6D 31 3D 78 26 70 61 72 61 6D 32 3D 79 26 70 61 72 61 6D 33 3D 7A
person Borodin    schedule 10.01.2013
comment
Самое смешное, что жестко запрограммированный код копируется и вставляется из сгенерированного, который не работает. - person Thumper; 10.01.2013
comment
Что ж, пока это показало, что есть непосредственная разница. Я свяжусь с вами, когда найду проблему/решение. - person Thumper; 11.01.2013