我正在使用boost::asio
在C ++中编写Amazon S3客户端库,并编写HEAD
和GET
个请求来查询和下载文件。一切正常,直到我发送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
最奇怪的是,对于有效文件,一切都有效 - HEAD
和GET
请求,而GET
适用于不存在的文件(正确返回报告错误代码的标头) ,但我对一个不存在的文件的HEAD
请求绝对没有响应(0字节!)。我没有在网上找到任何人报告任何类似的问题。我是唯一一个吗?
----更新----
我发现当我的代码在办公室防火墙之外执行时,一切行为都正确:对不存在的文件的HEAD
请求返回指示404结果的漂亮的HTTP标头。现在来调查我的防火墙对我做了什么... :(
答案 0 :(得分:1)
如果您有防火墙,请检查您的设置。您的防火墙很可能会过滤掉亚马逊的某些响应。
答案 1 :(得分:-1)
根据RFC2616第9.4段:
“HEAD method
与GET
相同,只是服务器不能在响应中返回消息体。响应HEAD
请求的HTTP头中包含的元信息应该是相同的响应GET
请求发送的信息。“
因此对HEAD
请求的响应必须不包含消息体,而头可以包含非零内容长度,并且您的代码不应该在这种情况下抛出异常。
HEAD
被视为“在您跳跃前先看”请求。它的目的是允许您的客户端在发送GET请求之前确定它是否可以接收GET请求的正文。