4. HTTP 交換 (The HTTP Exchange)
4.1. HTTP リクエスト (The HTTP Request)
DoH クライアントは HTTP GET または POST メソッドと本節のその他の要件を使用して、単一の DNS クエリを HTTP リクエストとしてエンコードします。DoH サーバーは URI テンプレートを使用してリクエストが使用する URI を定義します。
本文書で定義された URI テンプレートは、HTTP メソッドが POST の場合は変数なしで処理されます。HTTP メソッドが GET の場合、単一の変数「dns」が DNS リクエストの内容(第 6 節で説明)として定義され、base64url [RFC4648] エンコーディングを使用します。
DoH サーバーは POST と GET の両方のメソッドを実装しなければなりません (MUST)。
POST メソッドを使用する場合、DNS クエリは HTTP リクエストのメッセージボディとして含まれ、Content-Type リクエストヘッダーフィールドがメッセージのメディアタイプを示します。
DoH クライアントは、応答で理解できるコンテンツタイプを示すために HTTP Accept リクエストヘッダーフィールドを含めるべきです (SHOULD)。
HTTP キャッシュの親和性を最大化するために、DNS メッセージヘッダーの ID フィールドを含むメディアフォーマット(例:「application/dns-message」)を使用する DoH クライアントは、各 DNS リクエストで DNS ID として 0 を使用すべきです (SHOULD)。
4.1.1. HTTP リクエストの例 (HTTP Request Examples)
これらの例は [RFC7540] の HTTP/2 スタイルフォーマットを使用します。
GET メソッドを使用した www.example.com のクエリの例:
:method = GET
:scheme = https
:authority = dnsserver.example.net
:path = /dns-query?dns=AAABAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB
accept = application/dns-message
POST メソッドを使用した同じクエリの例:
:method = POST
:scheme = https
:authority = dnsserver.example.net
:path = /dns-query
accept = application/dns-message
content-type = application/dns-message
content-length = 33
<33 bytes represented by the following hex encoding>
00 00 01 00 00 01 00 00 00 00 00 00 03 77 77 77
07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 00 01 00
01
4.2. HTTP レスポンス (The HTTP Response)
本文書で定義された唯一のレスポンスタイプは「application/dns-message」ですが、将来他のレスポンスフォーマットが定義される場合があります。
DoH サーバーは「application/dns-message」リクエストメッセージを処理できなければなりません (MUST)。
DoH サーバーは「application/dns-message」レスポンスを提供できるべきです (SHOULD)。
「application/dns-message」コンテンツタイプを使用する場合、レスポンスメッセージボディには完全な DNS レスポンス(すべてのヘッダーフィールドを含む)が含まれます。DoH サーバーはレスポンスの DNS ヘッダーの「クエリ識別子」(QID) フィールドをゼロに設定しなければなりません (MUST)。DoH クライアントは DNS レスポンスの QID フィールドを無視しなければなりません (MUST)。
4.2.1. DNS と HTTP エラーの処理 (Handling DNS and HTTP Errors)
DNS レスポンスが成功しない場合でも、DoH サーバーは DNS レスポンスとともに HTTP 成功ステータスコード(2xx)を返します。
サーバーがリクエストを解決できない場合、通常 HTTP 4xx エラーを返します。クライアントはこれを DNS SERVFAIL レスポンスとして扱うべきです (SHOULD)。
DoH クライアントは HTTP リダイレクトを処理しなければなりません (MUST)。
4.2.2. HTTP レスポンスの例 (HTTP Response Example)
:status = 200
content-type = application/dns-message
content-length = 64
cache-control = max-age=128
<64 bytes represented by the following hex encoding>
00 00 81 80 00 01 00 01 00 00 00 00 03 77 77 77
07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 00 01 00
01 03 77 77 77 07 65 78 61 6d 70 6c 65 03 63 6f
6d 00 00 01 00 01 00 00 00 80 00 04 5d b8 d8 22
この例の DNS レスポンスは www.example.com の IPv4 アドレスが 93.184.216.34 であり、この情報の TTL が 128 秒であることを示しています。