对于不存在的对象,Amazon S3 HEAD请求返回空响应而不是404

时间:2013-10-31 01:00:22

标签: c++ http amazon-s3 boost-asio

我正在使用boost::asio在C ++中编写Amazon S3客户端库,并编写HEADGET个请求来查询和下载文件。一切正常,直到我发送HEAD请求我的桶中不存在的对象。对不存在的对象的GET请求返回带有404状态代码的礼貌响应头(正如预期的那样!)但是对同一对象的HEAD请求绝对没有返回! (当我的代码尝试从响应中读取标题时,我发现了这一点,并且没有任何内容可供阅读。)

我正在关注文档和各种示例,包括这个......

http://docs.aws.amazon.com/AmazonS3/latest/dev/RetMetaOfObjVersion.html

我的请求看起来像这样......

HEAD /does_not_exist.txt HTTP/1.1
Host: my_bucket.s3.amazonaws.com
Date: Wed, 30 Oct 2013 22:32:00 GMT
Authorization: AWS MY_KEY:...ETC...
Connection: close

最奇怪的是,对于有效文件,一切都有效 - HEADGET请求,而GET适用于不存在的文件(正确返回报告错误代码的标头) ,但我对一个不存在的文件的HEAD请求绝对没有响应(0字节!)。我没有在网上找到任何人报告任何类似的问题。我是唯一一个吗?

----更新----

我发现当我的代码在办公室防火墙之外执行时,一切行为都正确:对不存在的文件的HEAD请求返回指示404结果的漂亮的HTTP标头。现在来调查我的防火墙对我做了什么... :(

2 个答案:

答案 0 :(得分:1)

如果您有防火墙,请检查您的设置。您的防火墙很可能会过滤掉亚马逊的某些响应。

答案 1 :(得分:-1)

根据RFC2616第9.4段: “HEAD methodGET相同,只是服务器不能在响应中返回消息体。响应HEAD请求的HTTP头中包含的元信息应该是相同的响应GET请求发送的信息。“

因此对HEAD请求的响应必须不包含消息体,而头可以包含非零内容长度,并且您的代码不应该在这种情况下抛出异常。

HEAD被视为“在您跳跃前先看”请求。它的目的是允许您的客户端在发送GET请求之前确定它是否可以接收GET请求的正文。