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機能し、存在しないファイルに対して機能することです(エラーコードを報告するヘッダーを正しく返します)がHEAD、非-既存のファイル。Web 上で同様の問題を報告しているを見つけたことがありません。私だけですか?

- - アップデート - -

私のコードがオフィスのファイアウォールの外側で実行されると、すべてが正しく動作することがわかりましたHEAD。存在しないファイルに対する要求は、404 の結果を示す適切な HTTP ヘッダーを返します。今、私のファイアウォールが私に何をしているのかを調査するために... :(

4

2 に答える 2

1

ファイアウォールがある場合は、設定を確認してください。ファイアウォールが amazon からの特定の応答を除外している可能性は十分にあります。

于 2014-03-31T21:09:37.840 に答える
-1

RFC2616パラ 9.4によると: 「サーバーが応答でメッセージ本文を返してはならないことHEAD methodを除いて、これは と同じですGET。要求に応答して HTTP ヘッダーに含まれるメタ情報は、要求HEADに応答して送信された情報と同一である必要があります (SHOULD)。GET."

したがって、HEADリクエストへの応答にはメッセージ本文を含めてはなりませんが、ヘッダーにはゼロ以外の Content-Length を含めることができ、この状況ではコードで例外をスローしてはなりません。

HEADは「Look Before You Leap」リクエストと見なされます。その目的は、クライアントが GET リクエストの本文を送信する前に受信できるかどうかを判断できるようにすることです。

于 2013-10-31T21:36:33.670 に答える