Как получить правильную длину содержимого для запроса POST - PullRequest
2 голосов
/ 05 сентября 2008

Я использую 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, настроенные для движка приложений, это даже не ответили!

Ответы [ 3 ]

3 голосов
/ 05 сентября 2008

Соответствует ли количество дополнительных байтов нужному количеству строк в файле? Я спрашиваю, потому что, возможно, возможно, что каким-то образом возврат каретки вводится, но не учитывается.

1 голос
/ 05 сентября 2008

Я уже сталкивался с подобными проблемами.

Я полагаю, вы используете функцию length () для определения размера файла? Если это так, то, скорее всего, данные, которые вы публикуете, имеют кодировку UTF-8, а не ASCII.

Чтобы получить правильное количество, вам может потребоваться добавить «использовать байты»; прагму в начало вашего скрипта или оберните вызов длины в блок:

my $size;
do {use bytes; $size = length($file_data)}

Со страницы руководства perlfunc:

«Обратите внимание на символы: если EXPR в Unicode, вы получите количество символов, а не количество байтов.»

0 голосов
/ 05 сентября 2008

Как вы получаете количество байтов? .. глядя на размер файла в файловой системе?

Вы можете использовать "-s", чтобы получить размер файла.

Или, если вы хотите сделать больше, вы можете использовать File :: Stat

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...