Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Странное чтение из STDIN

2 views
Skip to first unread message

Gennadij Pastuhov

unread,
Jun 8, 2022, 10:01:02 AM6/8/22
to
Рад всех приветствовать! А особенно - All!

Есть модуль для работы с вебом, чтение из потока там реализовано так:

elsif ($ENV{'CONTENT_TYPE'} =~ m|^\s*application/json|i) {
read(STDIN, my $form_data, $ENV{CONTENT_LENGTH})
or die "$!\n";
print STDERR "\n" . PACKAGE . LINE . " form_data " . Dumper $form_data;
my $requestData = from_json $form_data;
}

Для проверки хожу в этот модуль курлом и вот что вижу в логах:

$ curl '172.25.0.5:8080/preset-add' -H 'Content-Type: application/json' --data
'{"name":"пресет1","name_en":"preset1"}'

FM::Common::WebIn155 form_data $VAR1 =
"{\"name\":\"\x{43f}\x{440}\x{435}\x{441}\x{435}\x{442}1\",\"name_en\":\"preset1\"}";


$ curl '172.25.0.5:8080/preset-add' -H 'Content-Type: application/json' --data
'{"name":"пресет2","name_en":"preset2"}'

FM::Common::WebIn155 form_data $VAR1 =
"{\"name\":\"\x{43f}\x{440}\x{435}\x{441}\x{435}\x{442}2\",\"name_en\":\"preset2\"}";


$ curl '172.25.0.5:8080/preset-add' -H 'Content-Type: application/json' --data
'{"name":"пресет3","name_en":"preset3"}'

FM::Common::WebIn155 form_data $VAR1 =
"{\"name\":\"\x{43f}\x{440}\x{435}\x{441}\x{435}\x{442}3\",\"name_en\":\"preset3\"}";


$ curl '172.25.0.5:8080/preset-add' -H 'Content-Type: application/json' --data
'{"name":"пресет4","name_en":"preset4"}'

FM::Common::WebIn155 form_data $VAR1 =
"{\"name\":\"\x{43f}\x{440}\x{435}\x{441}\x{435}\x{442}4\",\"name_en\":\"preset4\"}";


А потом вдруг всё ломается и переходит на чтение побайтово:
$ curl '172.25.0.5:8080/preset-add' -H 'Content-Type: application/json' --data
'{"name":"пресет5","name_en":"preset5"}'

FM::Common::WebIn155 form_data $VAR1 =
'{"name":"??N?чN?чN5","name_en":"preset5"}';

И последующие запросы идут только в таком формате. Что это может быть?

... Jonny wanna live

Eugene Grosbein

unread,
Jun 8, 2022, 3:01:02 PM6/8/22
to
08 июня 2022, среда, в 16:00 NOVT, Gennadij Pastuhov написал(а):

GP> $ curl '172.25.0.5:8080/preset-add' -H 'Content-Type: application/json'
GP> --data
GP> '{"name":"пресет4","name_en":"preset4"}'
GP> FM::Common::WebIn155 form_data $VAR1 =
GP> "{\"name\":\"\x{43f}\x{440}\x{435}\x{441}\x{435}\x{442}4\",\"name_en\":\"preset4\"}";
GP> А потом вдруг всё ломается и переходит на чтение побайтово:
GP> $ curl '172.25.0.5:8080/preset-add' -H 'Content-Type: application/json'
GP> --data
GP> '{"name":"пресет5","name_en":"preset5"}'
GP> FM::Common::WebIn155 form_data $VAR1 =
GP> '{"name":"??N?чN?чN5","name_en":"preset5"}';
GP> И последующие запросы идут только в таком формате. Что это может быть?

Воообще говоря, так делать не положено - задавать
Content-Type с данными не в ASCII без указания кодировки.

Hа стороне сервера при этом возможны разнообразные глюки и формально,
сервер имеет на это право. Может пытаться или не пытаться продетектить
Byte Order Mark (BOM: 0xEF, 0xBB,0xBF), может полагаться на дефолты и т.д.

По нормальному положено указывать кодировку:

... -H 'Content-Type: application/json; charset=utf-8' --data-urlencode ...

Потому что --data предназначено для передачи параметров в CGI
и использует application/x-www-form-urlencoded,
а тебе надо --data-urlencode.

Eugene

Gennadij Pastuhov

unread,
Jun 9, 2022, 6:01:02 AM6/9/22
to
Рад всех приветствовать! А особенно - Eugene!

Четверг июня 09 22 01:26 Eugene Grosbein писал к Gennadij Pastuhov:

GP>> $ curl '172.25.0.5:8080/preset-add' -H 'Content-Type:
GP>> application/json' --data
GP>> '{"name":"пресет4","name_en":"preset4"}'
GP>> FM::Common::WebIn155 form_data $VAR1 =
GP>> "{\"name\":\"\x{43f}\x{440}\x{435}\x{441}\x{435}\x{442}4\",\"name
GP>> _en\":\"preset4\"}";
GP>> А потом вдруг всё ломается и переходит на чтение побайтово:
GP>> $ curl '172.25.0.5:8080/preset-add' -H 'Content-Type:
GP>> application/json' --data
GP>> '{"name":"пресет5","name_en":"preset5"}'
GP>> FM::Common::WebIn155 form_data $VAR1 =
GP>> '{"name":"??N?чN?чN5","name_en":"preset5"}';
GP>> И последующие запросы идут только в таком формате. Что это может
GP>> быть?
EG> Воообще говоря, так делать не положено - задавать
EG> Content-Type с данными не в ASCII без указания кодировки.

В наше время вряд ли можно ждать что-то, кроме utf-8.

EG> Hа стороне сервера при этом возможны разнообразные глюки и формально,
EG> сервер имеет на это право. Может пытаться или не пытаться продетектить
EG> Byte Order Mark (BOM: 0xEF, 0xBB,0xBF), может полагаться на дефолты и
EG> т.д.

Сервер - это апач? В этой системе он стоит перед бэкендом.

EG> По нормальному положено указывать кодировку:

EG> ... -H 'Content-Type: application/json; charset=utf-8'
EG> --data-urlencode ...

EG> Потому что --data предназначено для передачи параметров в CGI
EG> и использует application/x-www-form-urlencoded,
EG> а тебе надо --data-urlencode.

С последним пришло
FM::Common::WebIn154 form_data $VAR1 =
'%7B%22name%22%3A%22%D0%BF%D1%80%D0%B5%D1%81%D0%B5%D1%820%22%2C%22name_en%22%3A%22preset0%22%7D';

Теперь нужно разurlencodить. В результате utf вытащить не удалось. В-общем,
поставил принудительный decode_utf8 на все входящие данные, вроде все
вышенаписанные команды стали отрабатывать корректно. Спасибо!

... Jonny wanna live
0 new messages