如何获取POST请求的正确Content-Length

时间:2008-09-05 17:48:00

标签: perl google-app-engine https

我正在使用perl脚本POST到Google Appengine应用程序。我使用-F选项发布包含一些XML的文本文件。

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脚本以某种方式破坏它。

更新: 感谢Erickson的正确答案。我使用printf将字符附加到文件的末尾,它总是截断文件中的行数。我想我可以通过迭代服务器端的每个字符来弄清楚添加的内容但不值得。在为app引擎设置的Google群组中,甚至没有回答这个问题!

3 个答案:

答案 0 :(得分:3)

您需要的额外字节数是否等于文件中的行数?我问,因为也许它可能以某种方式引入了回车但不计算在内。

答案 1 :(得分:1)

我之前遇到过类似的问题。

我假设您正在使用length()函数来确定文件的大小?如果是这样,那么您发布的数据很可能是UTF-8编码,而不是ASCII。

要获得正确的计数,您可能需要添加“使用字节数”; pragma到脚本的顶部,或者将长度调用包装在一个块中:

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

来自perlfunc手册页:

“注意字符:如果EXPR是Unicode格式,您将获得字符数,而不是字节数。”

答案 2 :(得分:0)

你是如何获得字节数的? ..通过查看文件系统上文件的大小?

您可以使用“-s”来获取文件的大小。

或者,如果您想要做更多,可以使用File::Stat