読者です 読者をやめる 読者になる 読者になる

テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

spray: ETagはquoted string

sprayは, HTTPヘッダを表現する抽象として, HttpHeaderを定義している. このサブクラスには, DateやContent-Typeなど, 標準的なHTTPヘッダを表現するクラスがある. x-amz-version-idなどのAmazon特有のものについては, RawHeaderというサブクラスが定義されており, 任意のname-valueペアを表現することが出来る.

sprayのサーバ実装であるspray-canは, 多くのHTTPヘッダについてリクエストの種別やentityの内容などから自動的に設定して返してくれるが, 例えば, HEADリクエストに対するレスポンスで, entityが空であったりした場合, Content-Lengthなどは適切に設定されないこともあり, この時は手動で設定する必要がある. 手動で設定した場合, 自動をオーバーライドする振る舞いになる.

さて, さきほどRawHeaderで指定していたETagを, "sprayで提供されているものについてはそれを使うのが良いだろう"と思って, ETagクラスを使うように切り替えたところ, テストが失敗するようになった. Complete Multipart Uploadで, クライアントから渡されたETagと自分で計算したETagがマッチせずに失敗しているということが分かった. 原因は, ETagクラスを使うようにしたために, ETagクラスはRFCに準じて与えられたETagをquoteしてクライアントに返し, クライアントはそれをそのまま返してきたため, 再計算したquoteされていないETagとマッチしないということである. 以下はRFCから,

Entity tags are used for comparing two or more entities from the same requested resource. HTTP/1.1 uses entity tags in the ETag (section 14.19), If-Match (section 14.24), If-None-Match (section 14.26), and If-Range (section 14.27) header fields. The definition of how they are used and compared as cache validators is in section 13.3.3. An entity tag consists of an opaque quoted string, possibly prefixed by a weakness indicator.

      entity-tag = [ weak ] opaque-tag
      weak       = "W/"
      opaque-tag = quoted-string

この, ETagがquoteされることは自明なことではないので,

するようである. 他にも調べてみると, この扱いをうっかりしたことに起因するバグがぽろぽろ出てくる.

さて, ETagがquoteされている理由はなんだろうか?分かる人は教えてください.

広告を非表示にする