Passa al contenuto principale

2. Defining New Structured Fields

Per specificare un campo HTTP come Structured Field, l'autore deve:

Passi Obbligatori​

1. Fare riferimento normativo a questa specifica​

I destinatari e i produttori del campo devono sapere che si applicano i requisiti di questo documento.

Esempio di testo di riferimento:
"Questo campo e uno Structured Field [RFC8941]."

2. Identificare il tipo di campo​

Determinare se il campo e:

  • Structured Header: puo essere usato solo nella sezione header, il caso comune
  • Structured Trailer: puo essere usato solo nella sezione trailer
  • Structured Field: puo essere usato in entrambe

3. Specificare il tipo di dato di primo livello​

Scegliere uno dei seguenti tipi:

  • List - Sezione 3.1
  • Dictionary - Sezione 3.2
  • Item - Sezione 3.3

4. Definire la semantica del valore del campo​

Spiegare il significato e lo scopo del campo.

5. Specificare vincoli aggiuntivi​

Definire i vincoli sul valore del campo e le conseguenze della loro violazione.


Modello di Definizione​

Di solito, una definizione di campo specifica il tipo di primo livello, List, Dictionary o Item, e poi definisce i tipi ammessi e i vincoli applicabili.

Esempi di vincoli​

Campo di tipo List:

  • Tutti i membri sono Integer
  • Oppure sono ammessi tipi misti

Campo di tipo Item:

  • Sono ammesse solo String
  • Ed e ammessa solo una stringa che inizi con la lettera "Q"
  • Oppure sono ammesse solo stringhe minuscole

Nota importante: le Inner Lists, Sezione 3.1.1, sono valide solo quando la definizione del campo le consente esplicitamente.


Gestione degli Errori​

Quando il parsing fallisce, l'intero campo viene ignorato, vedere la Sezione 4.2; nella maggior parte dei casi, la violazione di vincoli specifici del campo dovrebbe produrre lo stesso effetto.

Comportamento predefinito​

Scenario: il campo e definito come Item e deve essere Integer, ma viene ricevuta una String

Comportamento predefinito: ignorare il campo

Se serve una gestione degli errori diversa, deve essere specificata esplicitamente.

Estensibilita​

Parameters - meccanismo di estensione​

Sia Item sia Inner List consentono Parameters come meccanismo di estensione; questo significa che in futuro i valori possono essere estesi per contenere più informazioni.

Per mantenere la compatibilita in avanti: le specifiche dei campi sono discouraged dal definire la presenza di parametri non riconosciuti come condizione di errore.

"Grease" Parameters​

Per assicurare ulteriormente l'estensibilita futura e incoraggiare i consumatori a usare implementazioni complete del parser, una definizione di campo puo specificare che i mittenti aggiungano parametri "grease".

Strategia di esempio:
--------------------
Una specifica puo stabilire che tutti i parametri conformi allo schema di definizione
siano riservati a questo scopo,
e poi incoraggiarne l'invio in alcune richieste.

Scopo:
------
Questo aiuta a scoraggiare i destinatari dallo scrivere parser
che non considerano i parametri.

Compatibilita in avanti dei Dictionary​

Anche le specifiche che usano Dictionary possono ottenere compatibilita in avanti richiedendo che siano ignorati i membri sconosciuti, insieme ai loro valori e tipi associati. Specifiche successive possono aggiungere altri membri e specificare vincoli appropriati per essi.

Un'estensione di uno Structured Field puo quindi richiedere che, se un destinatario che comprende l'estensione rileva che un valore da essa definito non soddisfa i vincoli, l'intero valore del campo sia ignorato.


Regole sui Vincoli​

Non si possono allentare i requisiti​

Le definizioni dei campi cannot allentare i requisiti di questa specifica, perché ciò ostacolerebbe l'elaborazione da parte di software generico; possono solo aggiungere vincoli ulteriori.

Esempi di vincoli che possono essere aggiunti:

  • Intervalli numerici per Integer e Decimal
  • Formati per String e Token
  • Tipi ammessi nei valori di Dictionary
  • Numero di Item in una List

Applicazione all'intero campo​

Le definizioni dei campi possono applicare questa specifica solo all'intero valore del campo, non a una sua parte.


Limiti Implementativi​

Valori minimi​

Questa specifica definisce valori minimi per lunghezze o quantità delle varie strutture che le implementazioni devono supportare.

Valori massimi​

Nella maggior parte dei casi non specifica dimensioni massime, ma gli autori devono sapere che le implementazioni HTTP impongono vari limiti su:

  • Dimensione di un singolo campo
  • Numero totale di campi
  • Dimensione dell'intera sezione header o trailer

Convenzioni di Denominazione​

Le specifiche possono chiamare il nome di un campo:

  • "structured header name"
  • "structured trailer name"
  • "structured field name"

Il valore di un campo puo essere chiamato:

  • "structured header value"
  • "structured trailer value"
  • "structured field value"

Uso di ABNF​

Le definizioni dei campi sono encouraged a usare le regole ABNF di questa specifica che iniziano con "sf-"; le altre regole di questa specifica non sono pensate per essere usate nelle definizioni dei campi.


Esempio Completo: Header Foo-Example​

42.  Foo-Example Header

The Foo-Example HTTP header field conveys information about how
much Foo the message has.

Foo-Example is an Item Structured Header [RFC8941]. Its value
MUST be an Integer (Section 3.3.1 of [RFC8941]). Its ABNF is:

Foo-Example = sf-integer

Its value indicates the amount of Foo in the message, and it MUST
be between 0 and 10, inclusive; other values MUST cause the entire
header field to be ignored.

The following parameter is defined:
* A parameter whose key is "foourl", and whose value is a String
(Section 3.3.3 of [RFC8941]), conveying the Foo URL for the
message. See below for processing requirements.

"foourl" contains a URI-reference (Section 4.1 of [RFC3986]). If
its value is not a valid URI-reference, the entire header field
MUST be ignored. If its value is a relative reference
(Section 4.2 of [RFC3986]), it MUST be resolved (Section 5 of
[RFC3986]) before being used.

For example:

Foo-Example: 2; foourl="https://foo.example.com/"

Analisi dell'esempio​

Foo-Example: 2; foourl="https://foo.example.com/"

Parsing:

  • Tipo: Item (Integer)
  • Valore: 2
  • Parametro: foourl="https://foo.example.com/"

Validazione:

  1. Il valore e Integer
  2. Il valore e nell'intervallo 0-10
  3. Il parametro foourl e presente
  4. foourl e un URI valido

Se il valore e 15:

Foo-Example: 15; foourl="https://foo.example.com/"

Risultato: l'intero campo viene ignorato, perché viola il vincolo dell'intervallo 0-10.


Checklist di Definizione​

Quando si definisce un nuovo Structured Field, assicurarsi di:

  • Fare riferimento normativo a RFC 8941
  • Dichiarare chiaramente se il campo e Header, Trailer o Field
  • Specificare il tipo di primo livello, List, Dictionary o Item
  • Definire la semantica del campo
  • Specificare i vincoli di tipo
  • Definire vincoli sull'intervallo dei valori, se applicabile
  • Descrivere i parametri, se presenti
  • Definire la gestione degli errori, se diversa dal comportamento predefinito
  • Considerare la compatibilita in avanti
  • Fornire esempi

Punti Chiave​

  1. Cinque passi obbligatori: riferimento, tipo, tipo dati, semantica, vincoli
  2. Comportamento predefinito rigoroso: fallimento del parsing = campo ignorato
  3. Estensibilita prima di tutto: incoraggiare parametri e ignorare membri sconosciuti
  4. Solo aggiunta di vincoli: non allentare i requisiti di RFC 8941
  5. Campo intero: la specifica si applica all'intero valore del campo
  6. Limiti implementativi: considerare i limiti di dimensione delle implementazioni HTTP