Как получить правильную длину контента для запроса POST

StackOverflow https://stackoverflow.com/questions/46387

  •  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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top