Как получить правильную длину контента для запроса POST
-
09-06-2019 - |
Вопрос
Я использую Perl-скрипт для отправки POST в приложение Google Appengine.Я публикую текстовый файл, содержащий XML, используя опцию -F.
http://www.cpan.org/authors/id/E/EL/ELIJAH/bget-1.1
Существует версия 1.2, уже протестирована и возникла та же проблема.Пост выглядит примерно так.
Host: foo.appspot.com
User-Agent: lwp-request/1.38
Content-Type: text/plain
Content-Length: 202
<XML>
<BLAH>Hello World</BLAH>
</XML>
Я изменил пример, поэтому 202 неправильный, не беспокойтесь об этом.Перейдем к проблеме.Content-Length соответствует количеству байтов в файле, однако, если я вручную не увеличу Content-Length, он не отправит весь файл, несколько байтов будут усечены.Количество усеченных байтов неодинаково для файлов разного размера.Я использовал в сценарии опцию -r и вижу, что он отправляет, и он отправляет весь файл, но Google Appengine self.request.body показывает, что не все получено.Я думаю, что решение состоит в том, чтобы получить правильное число для Content-Length, и, очевидно, оно не так просто, как количество байтов в файле, или Perl-скрипт каким-то образом его искажает.
Обновлять:Спасибо Эриксону за правильный ответ.Я использовал printf для добавления символов в конец файла, и он всегда усекал ровно столько строк в файле.Полагаю, я мог бы выяснить, что добавляется, перебирая каждый символ на стороне сервера, но оно того не стоит.На этот вопрос даже не ответили в группах Google, созданных для движка приложений!
Решение
Соответствует ли количество дополнительных байтов количеству строк в файле?Я спрашиваю, потому что, возможно, возврат каретки каким-то образом вводится, но не учитывается.
Другие советы
Я уже сталкивался с подобными проблемами.
Я предполагаю, что вы используете функцию length() для определения размера файла?Если да, то, скорее всего, данные, которые вы публикуете, имеют кодировку UTF-8, а не ASCII.
Чтобы получить правильный счет, вам может потребоваться добавить «байты использования»; Прагма до вершины вашего сценария или оберните вызов длины в блоке:
my $size;
do {use bytes; $size = length($file_data)}
На странице руководства perfunc:
«Обратите внимание на персонажей:если EXPR находится в Юникоде, вы получите количество символов, а не количество байтов».
Как вы получаете количество байтов?..Посмотрев на размер файла в файловой системе?
Вы можете использовать «-s», чтобы получить размер файла.
Или, если вы хотите сделать больше, вы можете использовать Файл::Stat