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

时间:2020-03-05 18:48:24  来源:igfitidea点击:

我正在使用Perl脚本发布到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将字符追加到文件的末尾,并且它总是精确地截断文件中的行数。我想我可以通过遍历服务器端的每个字符来弄清楚所添加的内容,但不值得。为应用引擎设置的Google网上论坛甚至还没有回答!

解决方案

回答

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

回答

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

我们可以使用" -s"来获取文件的大小。

或者,如果我们想做更多事情,可以使用File :: Stat

回答

我以前也遇到过类似的问题。

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

为了获得正确的计数,我们可能需要添加" use bytes;"。编译到脚本顶部,或者将length调用包装在一个块中:

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

在perlfunc手册页中:

"注意字符:如果EXPR是Unicode,则将得到字符数,而不是字节数。"