3. Il campo di intestazione HTTP Alt-Svc
Un server di origine HTTP(S) può pubblicizzare la disponibilità di servizi alternativi ai client aggiungendo un campo di intestazione Alt-Svc alle risposte.
Alt-Svc = clear / 1#alt-value
clear = %s"clear"; "clear", case-sensitive
alt-value = alternative *( OWS ";" OWS parameter )
alternative = protocol-id "=" alt-authority
protocol-id = token ; nome protocollo ALPN con codifica percentuale
alt-authority = quoted-string ; contenente [ uri-host ] ":" port
parameter = token "=" ( token / quoted-string )
Il valore del campo consiste in un elenco di valori, ognuno dei quali indica un servizio alternativo, oppure nella parola chiave "clear".
Un valore di campo contenente il valore speciale "clear" indica che l'origine richiede che tutte le alternative per quell'origine siano invalidate (incluse quelle specificate nella stessa risposta, in caso di risposta non valida contenente sia "clear" che servizi alternativi).
I nomi dei protocolli ALPN sono sequenze di ottetti senza vincoli aggiuntivi sul formato. Gli ottetti non consentiti nei token ([RFC7230], Sezione 3.2.6) DEVONO essere codificati in percentuale secondo la Sezione 2.1 della [RFC3986]. Di conseguenza, anche l'ottetto che rappresenta il carattere di percentuale "%" (hex 25) DEVE essere codificato in percentuale.
Per avere esattamente un modo per rappresentare qualsiasi nome di protocollo ALPN, si applicano i seguenti vincoli aggiuntivi:
- Gli ottetti nel nome del protocollo ALPN NON DEVONO essere codificati in percentuale se sono caratteri token validi tranne "%", e
- Quando si utilizza la codifica percentuale, DEVONO essere utilizzate cifre esadecimali maiuscole.
Con questi vincoli, i destinatari possono applicare un semplice confronto di stringhe per abbinare gli identificatori di protocollo.
Il componente "alt-authority" è costituito da un uri-host OPZIONALE ("host" nella Sezione 3.2.2 della [RFC3986]), due punti (":") e un numero di porta.
Per esempio:
Alt-Svc: h2=":8000"
Questo indica il protocollo "h2" ([RFC7540]) sullo stesso host utilizzando la porta indicata 8000.
Un esempio che coinvolge un cambio di host:
Alt-Svc: h2="new.example.org:80"
Questo indica il protocollo "h2" sull'host "new.example.org", in esecuzione sulla porta 80. Si noti che la sintassi "quoted-string" deve essere utilizzata perché ":" non è un carattere consentito in "token".
Esempi di escape del nome del protocollo:
| Nome protocollo ALPN | protocol-id | Nota |
|---|---|---|
| h2 | h2 | Nessun escape necessario |
| w=x:y#z | w%3Dx%3Ay#z | "=" e ":" sottoposti a escape |
| x%y | x%25y | "%" richiede l'escape |
Alt-Svc PUÒ apparire in qualsiasi messaggio di risposta HTTP, indipendentemente dal codice di stato. Si noti che i destinatari di Alt-Svc possono ignorare il campo di intestazione (e sono tenuti a farlo in alcune situazioni; vedi Sezioni 2.1 e 6).
Il valore del campo Alt-Svc può avere più valori:
Alt-Svc: h2="alt.example.com:8000", h2=":443"
Quando sono presenti più valori, l'ordine dei valori riflette la preferenza del server (con il primo valore che è l'alternativa più preferita).
Il/i valore/i pubblicizzato/i da Alt-Svc possono essere utilizzati dai client per aprire una nuova connessione a un servizio alternativo. Le richieste successive possono iniziare immediatamente a utilizzare questa nuova connessione oppure possono continuare a utilizzare la connessione esistente mentre viene creata la nuova connessione.
Quando si utilizza HTTP/2 ([RFC7540]), i server DOVREBBERO invece inviare un frame ALTSVC (Sezione 4). Un singolo frame ALTSVC può essere inviato per una connessione; non è necessario un nuovo frame per ogni richiesta. Si noti che, nonostante questa raccomandazione, i campi di intestazione Alt-Svc rimangono validi nelle risposte fornite tramite HTTP/2.
Ogni "alt-value" è seguito da un elenco OPZIONALE separato da punto e virgola di parametri aggiuntivi, ciascuno dei quali comprende un nome e un valore.
Questa specifica definisce due parametri: "ma" e "persist", definiti nella Sezione 3.1. I parametri sconosciuti DEVONO essere ignorati. Cioè, i valori (alt-value) in cui appaiono DEVONO essere elaborati come se il parametro sconosciuto non fosse presente.
Nuovi parametri possono essere definiti nelle specifiche di estensione (vedere la Sezione 7.3 per i dettagli sulla registrazione).
Si noti che tutti gli elementi del campo che consentono la sintassi "quoted-string" DEVONO essere elaborati secondo la Sezione 3.2.6 della [RFC7230].
3.1. Caching dei valori del campo di intestazione Alt-Svc
Quando un servizio alternativo viene pubblicizzato utilizzando Alt-Svc, è considerato fresco per 24 ore dalla generazione del messaggio. Questo può essere modificato con il parametro "ma" (max-age).
Sintassi:
ma = delta-seconds; vedi [RFC7234], Sezione 1.2.1
Il valore delta-seconds indica il numero di secondi dalla generazione della risposta per i quali il servizio alternativo è considerato fresco.
Alt-Svc: h2=":443"; ma=3600
Vedi la Sezione 4.2.3 della [RFC7234] per i dettagli sulla determinazione dell'età della risposta.
Ad esempio, una risposta:
HTTP/1.1 200 OK
Content-Type: text/html
Cache-Control: max-age=600
Age: 30
Alt-Svc: h2=":8000"; ma=60
indica che un servizio alternativo è disponibile e utilizzabile per i prossimi 60 secondi. Tuttavia, la risposta è già stata memorizzata nella cache per 30 secondi (secondo il valore del campo di intestazione Age); pertanto, il servizio alternativo è fresco solo per i 30 secondi successivi alla ricezione di questa risposta, meno il tempo di transito stimato.
Si noti che la durata di freschezza per il caching HTTP (qui, 600 secondi) non influisce sul caching dei valori Alt-Svc.
Quando un campo di intestazione di risposta Alt-Svc viene ricevuto da un'origine, il suo valore invalida e sostituisce tutti i servizi alternativi memorizzati nella cache per quell'origine.
Per impostazione predefinita, i servizi alternativi memorizzati nella cache verranno cancellati quando il client rileva un cambiamento di rete. I servizi alternativi destinati a durare più a lungo (come quelli non specifici per la rete di accesso del client) possono portare il parametro "persist" con valore "1" come suggerimento che il servizio è potenzialmente utile oltre un cambiamento di configurazione di rete.
Sintassi:
persist = "1"
Per esempio:
Alt-Svc: h2=":443"; ma=2592000; persist=1
Questa specifica definisce solo un singolo valore per "persist". I client DEVONO ignorare i parametri "persist" con valori diversi da "1".
Vedi la Sezione 2.2 per i requisiti generali sul caching dei servizi alternativi.