Appendix B. Implementation Notes (Note di implementazione)
Questa appendice fornisce consigli pratici e migliori pratiche per implementare RFC 8941.
Architettura di implementazione generica
Le implementazioni generiche dovrebbero (SHOULD) esporre funzioni serialize (sezione 4.1) e parse (sezione 4.2) di livello superiore.
// API funzionale
const result = parseList(input);
const output = serializeDict(dict);
// API orientata agli oggetti
const parser = new StructuredFieldParser();
const result = parser.parseList(input);
Completezza e coerenza
Per l'interoperabilità, le implementazioni generiche devono (MUST) essere complete e seguire rigorosamente gli algoritmi (sezione 1.1).
Suite di test della comunità
URL: https://github.com/httpwg/structured-field-tests
Copertura: serializzazione, parsing, casi limite, condizioni di errore, test di interoperabilità.
Mappature ordinate
I Dictionaries e i Parameters sono mappature che preservano l'ordine. Le implementazioni dovrebbero (SHOULD) mantenere quest'ordine.
// ✓ Buono - preserva l'ordine
class OrderedDict {
constructor() {
this.items = []; // [{key, value}, ...]
}
}
// ✗ Cattivo - non garantisce l'ordine
const dict = {};
Distinzione Token vs String
Le implementazioni dovrebbero (SHOULD) mantenere la distinzione tra Token e String.
// ✓ Buono - preserva il tipo
const value = {type: 'token', value: 'text/html'};
const value2 = {type: 'string', value: 'text/html'};
Gestione degli errori
In caso di fallimento del parsing, le implementazioni devono (MUST) ignorare l'intero campo.
function parseStructuredField(input, type) {
try {
return parse(input, type);
} catch (error) {
return null; // Ignora l'intero campo
}
}
Lista di controllo della sicurezza
- Limitare la dimensione massima dei campi
- Limitare il numero di membri List/Dictionary
- Limitare la lunghezza delle stringhe
- Convalidare rigorosamente tutti i tipi
- Rifiutare le chiavi duplicate
- Fallire correttamente in caso di errore
Migliori pratiche di test
- Utilizzare la suite di test della comunità
- Testare i casi limite
- Testare i casi di errore
- Test di andata e ritorno: serialize(parse(x)) == x
- Test di interoperabilità
Punti chiave
- Seguire gli algoritmi: Aderire rigorosamente alle specifiche
- Utilizzare la suite di test: Convalidare con i test della comunità
- Preservare l'ordine: Mantenere l'ordine di Dictionary e Parameter
- Distinguere i tipi: Token vs String
- Fallire correttamente: Ignorare l'intero campo in caso di errore
- Limiti di sicurezza: Implementare limiti di dimensione ragionevoli