4. Lo scambio HTTP (The HTTP Exchange)
4.1. La richiesta HTTP (The HTTP Request)
Il client DoH usa i metodi HTTP GET o POST, insieme agli altri requisiti di questa sezione, per codificare una singola query DNS come richiesta HTTP. Il server DoH definisce l'URI usato dalla richiesta tramite un modello URI (URI Template).
Il modello URI definito in questo documento non usa variabili quando il metodo HTTP è POST. Quando il metodo HTTP è GET, la singola variabile dns è definita come il contenuto della richiesta DNS, come descritto nella Sezione 6, codificato con base64url [RFC4648].
Le future specifiche di nuovi tipi di media DoH devono (MUST) definire le variabili da usare con questo protocollo per l'elaborazione del modello URI.
I server DoH devono (MUST) implementare entrambi i metodi POST e GET.
Quando si usa POST, la query DNS è inclusa nel corpo del messaggio della richiesta HTTP, e il campo di intestazione Content-Type indica il tipo di media del messaggio. Una richiesta POST è in genere più piccola della richiesta GET equivalente.
L'uso di GET è più favorevole per molte implementazioni di cache HTTP.
Il client DoH dovrebbe (SHOULD) includere il campo di intestazione HTTP Accept per indicare i tipi di contenuto che comprende nella risposta. Indipendentemente dal valore di Accept, il client deve (MUST) essere preparato a gestire risposte application/dns-message, come descritto nella Sezione 6, e può (MAY) gestire altri tipi di media relativi al DNS che riceve.
Per massimizzare la compatibilità con le cache HTTP, un client DoH che usa un formato di media contenente il campo ID dell'intestazione DNS, come application/dns-message, dovrebbe (SHOULD) usare un DNS ID pari a 0 in ogni richiesta DNS. HTTP associa richieste e risposte, eliminando così la necessità di usare l'ID in tipi di media come application/dns-message. L'uso di DNS ID variabili può far sì che query DNS semanticamente equivalenti vengano memorizzate separatamente nella cache.
Il client DoH può usare, o non usare, il padding e la compressione di HTTP/2 [RFC7540] nello stesso modo degli altri client HTTP/2.
4.1.1. Esempi di richieste HTTP (HTTP Request Examples)
Questi esempi usano il formato in stile HTTP/2 di [RFC7540].
Gli esempi usano un servizio DoH con modello URI https://dnsserver.example.net/dns-query{?dns} per risolvere un record IN A.
La richiesta è rappresentata con un corpo di tipo di media application/dns-message.
Il primo esempio mostra una query per www.example.com usando il metodo GET:
:method = GET
:scheme = https
:authority = dnsserver.example.net
:path = /dns-query?dns=AAABAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB
accept = application/dns-message
I dati della query DNS sono nella variabile dns. Alcuni dettagli di codifica dei caratteri e padding sono stati omessi.
Il secondo esempio mostra la stessa query usando il metodo 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
Infine, un esempio mostra come interrogare il record A di www.example.com usando JSON [RFC8259], noto anche come tipo di media application/json. Questo non è compatibile con DoH, ma illustra l'uso della negoziazione del contenuto:
:method = GET
:scheme = https
:authority = dnsserver.example.net
:path = /dns-query?dns=AAABAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB
accept = application/dns-json
4.2. La risposta HTTP (The HTTP Response)
L'unico tipo di risposta definito in questo documento è application/dns-message, ma in futuro potrebbero essere definiti altri formati di risposta.
Il server DoH deve (MUST) essere in grado di gestire messaggi di richiesta application/dns-message.
Il server DoH dovrebbe (SHOULD) essere in grado di fornire risposte application/dns-message.
Il server DoH può (MAY) fornire risposte negoziate per contenuto a richieste effettuate con il metodo GET.
Il campo di intestazione di risposta HTTP Content-Type di una risposta HTTP riuscita indica il tipo di media della risposta. La risposta può contenere una risposta DNS nel formato application/dns-message definito nella Sezione 6, oppure un altro tipo fornito tramite negoziazione del contenuto.
Quando è presente una risposta HTTP, i campi di intestazione HTTP indicano il formato della risposta. Il tipo di media della risposta determina come analizzarla ed elaborarla. Il client DoH deve (MUST) essere in grado di gestire risposte nel formato application/dns-message e può (MAY) essere in grado di gestire altri formati.
Quando si usa il tipo di contenuto application/dns-message, il corpo del messaggio di risposta contiene la risposta DNS completa, inclusi tutti i campi di intestazione, salvo che il codice di risposta HTTP indichi che la richiesta non è riuscita, come descritto sotto. Il server DoH deve (MUST) impostare a zero il campo "query identifier" (QID) nell'intestazione DNS della risposta. Il client DoH deve (MUST) ignorare il campo QID nella risposta DNS.
4.2.1. Gestione degli errori DNS e HTTP (Handling DNS and HTTP Errors)
Se la risposta DNS non ha esito positivo, il server DoH restituisce comunque un codice di stato HTTP riuscito (2xx) con la risposta DNS. La risposta DNS stessa indica l'errore a livello DNS.
Se il server non è in grado di analizzare la richiesta, di solito restituisce un errore HTTP 4xx. Il client dovrebbe (SHOULD) trattarlo come una risposta DNS SERVFAIL.
Se il server rifiuta il servizio, può (MAY) usare un reindirizzamento HTTP, cioè un codice di stato 3xx. Il client DoH deve (MUST) gestire i reindirizzamenti HTTP. Il client DoH dovrebbe (SHOULD) imporre un limite al numero di reindirizzamenti per evitare cicli, in modo simile ai normali client HTTP.
Se nella richiesta manca la query DNS o il server DoH non riesce ad analizzarla, il server dovrebbe (SHOULD) restituire un errore HTTP 400 (Bad Request).
Se il server DoH incontra un problema tecnico non correlato al DNS, dovrebbe (SHOULD) restituire un errore HTTP 500 (Internal Server Error).
Se il server DoH non fornisce servizio DoH sul percorso URI configurato, dovrebbe (SHOULD) restituire un errore HTTP 404 (Not Found).
Se il server DoH non supporta il tipo di media inviato dal client, dovrebbe (SHOULD) restituire un errore HTTP 415 (Unsupported Media Type).
4.2.2. Esempio di risposta HTTP (HTTP Response Example)
Questo mostra una risposta al primo esempio di query della Sezione 4.1.1:
: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
La risposta DNS in questo esempio indica che l'indirizzo IPv4 di www.example.com è 93.184.216.34, con TTL pari a 128 secondi.