【问题标题】:How to get the correct Content-Length for a POST request如何为 POST 请求获取正确的 Content-Length
【发布时间】:2010-09-07 23:09:42
【问题描述】:

我正在使用 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 将字符附加到文件末尾,它总是截断文件中的行数。我想我可以通过遍历服务器端的每个字符来弄清楚添加了什么,但不值得。为应用引擎设置的谷歌群组甚至没有回答这个问题!

【问题讨论】:

    标签: perl google-app-engine https


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      来自 perlfunc 手册页:

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2021-11-28
          • 2012-01-22
          • 2020-02-05
          • 1970-01-01
          • 1970-01-01
          • 2010-09-24
          • 1970-01-01
          • 2015-04-13
          • 2020-09-21
          相关资源
          最近更新 更多