2

我正在用 C++ 编写一个 Amazon S3 客户端库,使用boost::asio和组合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

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

- - 更新 - -

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

4

2 回答 2

1

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

于 2014-03-31T21:09:37.840 回答
-1

根据RFC2616第 9.4 段:“除了服务器不能在响应中返回消息体之外,它HEAD method是相同的。响应请求的 HTTP 标头中包含的元信息应该与响应请求时发送的信息相同。”GETHEADGET

因此,对HEAD请求的响应不得包含消息正文,而标头可能包含非零的 Content-Length,并且您的代码在这种情况下不应抛出异常。

HEAD被认为是“在你跳跃之前先看”请求。其目的是让您的客户端在发送请求之前确定它是否可以接收 GET 请求的主体。

于 2013-10-31T21:36:33.670 回答