Zum Hauptinhalt springen

2. Defining New Structured Fields (Neue strukturierte Felder definieren)

Um ein HTTP-Feld als strukturiertes Feld zu spezifizieren, muss der Autor folgende Schritte durchführen:

Erforderliche Schritte

1. Normative Referenz auf diese Spezifikation

Empfänger und Erzeuger des Feldes müssen wissen, dass die Anforderungen dieses Dokuments gelten.

Beispiel-Referenztext:
"Dieses Feld ist ein strukturiertes Feld [RFC8941]."

2. Feldtyp identifizieren

Festlegen, ob das Feld ein:

  • Strukturierter Header (Structured Header) ist: Nur im Header-Abschnitt verwendbar (häufigster Fall)
  • Strukturierter Trailer (Structured Trailer) ist: Nur im Trailer-Abschnitt verwendbar
  • Strukturiertes Feld (Structured Field) ist: In beiden Abschnitten verwendbar

3. Übergeordneten Datentyp angeben

Einen der folgenden Typen auswählen:

  • List (Liste) – Abschnitt 3.1
  • Dictionary (Wörterbuch) – Abschnitt 3.2
  • Item (Element) – Abschnitt 3.3

4. Semantik des Feldwerts definieren

Bedeutung und Zweck des Feldes beschreiben.

5. Zusätzliche Einschränkungen angeben

Einschränkungen für den Feldwert definieren sowie die Konsequenzen bei Verletzung dieser Einschränkungen.


Definitionsmuster

In der Regel gibt eine Felddefinition den übergeordneten Typ (List, Dictionary oder Item) an und definiert dann die zulässigen Typen und Einschränkungen.

Beispieleinschränkungen

Felder vom Typ List:

  • Alle Mitglieder sind Integer
  • Oder gemischte Typen

Felder vom Typ Item:

  • Nur String erlaubt
  • Und nur Strings, die mit dem Buchstaben „Q" beginnen
  • Oder nur Strings in Kleinbuchstaben

Besonderer Hinweis: Innere Listen (Inner Lists, Abschnitt 3.1.1) sind nur gültig, wenn die Felddefinition dies ausdrücklich erlaubt.


Fehlerbehandlung

Wenn das Parsen fehlschlägt, wird das gesamte Feld ignoriert (siehe Abschnitt 4.2); in den meisten Fällen sollten Verletzungen feldspezifischer Einschränkungen denselben Effekt haben.

Standardverhalten

Szenario: Feld ist als Item definiert und muss ein Integer sein, aber ein String wird empfangen

Standardverhalten: Das Feld wird ignoriert

Wenn ein anderes Fehlerverhalten gewünscht wird, muss dies ausdrücklich angegeben werden.

Erweiterbarkeit

Parameters (Parameter) – Erweiterungsmechanismus

Item und Inner List erlauben Parameter als Erweiterungsmechanismus; das bedeutet, dass Werte in Zukunft erweitert werden können, um mehr Informationen aufzunehmen.

Zur Wahrung der Vorwärtskompatibilität: Feldspezifikationen sollten nicht (discouraged) das Vorhandensein unbekannter Parameter als Fehlerbedingung definieren.

„Grease"-Parameter

Um die zukünftige Erweiterbarkeit weiter sicherzustellen und Konsumenten zur Verwendung vollständiger Parser-Implementierungen zu ermutigen, können Felddefinitionen festlegen, dass Sender „Grease"-Parameter hinzufügen.

Beispielstrategie:
---------
Eine Spezifikation kann festlegen, dass alle Parameter, die einem definierten Muster entsprechen,
für diesen Zweck reserviert sind, und dann empfehlen, sie in einem Teil der Anfragen zu senden.

Zweck:
----
Dies soll Empfänger davon abhalten, Parser zu schreiben, die Parameter nicht berücksichtigen.

Vorwärtskompatibilität bei Dictionary

Spezifikationen, die Dictionary verwenden, können ebenfalls Vorwärtskompatibilität erreichen, indem sie verlangen, dass das Vorhandensein unbekannter Mitglieder sowie deren zugehörige Werte und Typen ignoriert werden. Nachfolgende Spezifikationen können weitere Mitglieder hinzufügen und entsprechende Einschränkungen festlegen.

Eine Erweiterung strukturierter Felder kann dann verlangen, dass ein Empfänger, der die Erweiterung versteht und feststellt, dass die definierten Werte die Einschränkungen nicht erfüllen, den gesamten Feldwert ignoriert.


Einschränkungsregeln

Anforderungen können nicht gelockert werden

Felddefinitionen können (cannot) die Anforderungen dieser Spezifikation nicht lockern, da dies die Verarbeitung durch allgemeine Software behindern würde; sie können nur zusätzliche Einschränkungen hinzufügen.

Beispiele für zulässige Einschränkungen:

  • Numerische Bereiche für Integer und Decimal
  • Formate für String und Token
  • Zulässige Typen in Dictionary-Werten
  • Anzahl der Items in einer List

Gilt für das gesamte Feld

Felddefinitionen dürfen diese Spezifikation nur für den gesamten Feldwert verwenden, nicht für Teile davon.


Implementierungsgrenzen

Mindestwerte

Diese Spezifikation definiert Mindestwerte für die Länge oder Anzahl der verschiedenen unterstützten Strukturen.

Maximalwerte

In den meisten Fällen werden keine Maximalgrößen angegeben, aber Autoren sollten sich bewusst sein, dass HTTP-Implementierungen verschiedene Grenzen für folgende Aspekte setzen:

  • Größe einzelner Felder
  • Gesamtanzahl der Felder
  • Gesamtgröße des Header- oder Trailer-Abschnitts

Namenskonventionen

Spezifikationen können Feldnamen bezeichnen als:

  • „Strukturierter Header-Name (structured header name)"
  • „Strukturierter Trailer-Name (structured trailer name)"
  • „Strukturierter Feldname (structured field name)"

Feldwerte können bezeichnet werden als:

  • „Strukturierter Header-Wert (structured header value)"
  • „Strukturierter Trailer-Wert (structured trailer value)"
  • „Strukturierter Feldwert (structured field value)"

Verwendung von ABNF

Felddefinitionen werden ermutigt (encouraged), die ABNF-Regeln aus dieser Spezifikation zu verwenden, die mit „sf-" beginnen; andere Regeln in dieser Spezifikation sind nicht für die Verwendung in Felddefinitionen vorgesehen.


Vollständiges Beispiel: Foo-Example-Header

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/"

Beispielanalyse

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

Parsen:

  • Typ: Item (Integer)
  • Wert: 2
  • Parameter: foourl="https://foo.example.com/"

Validierung:

  1. Wert ist Integer ✓
  2. Wert liegt im Bereich 0–10 ✓
  3. Parameter foourl vorhanden ✓
  4. foourl ist eine gültige URI ✓

Wenn der Wert 15 ist:

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

Ergebnis: Das gesamte Feld wird ignoriert (Verletzung der Bereichseinschränkung 0–10)


Checkliste (Checklist)

Beim Definieren eines neuen strukturierten Feldes sicherstellen, dass:

  • RFC 8941 normativ referenziert wird
  • Das Feld klar als Header/Trailer/Field ausgewiesen ist
  • Der übergeordnete Typ (List/Dictionary/Item) angegeben ist
  • Die Feldsemantik definiert ist
  • Typeinschränkungen angegeben sind
  • Wertebereichseinschränkungen definiert sind (falls zutreffend)
  • Parameter beschrieben sind (falls vorhanden)
  • Fehlerbehandlung definiert ist (falls abweichend vom Standard)
  • Vorwärtskompatibilität berücksichtigt wurde
  • Beispiele bereitgestellt wurden

Wesentliche Erkenntnisse (Key Takeaways)

  1. Fünf erforderliche Schritte: Referenz, Typ, Datentyp, Semantik, Einschränkungen
  2. Strenger Standard: Parse-Fehler = Feld ignorieren
  3. Erweiterbarkeit zuerst: Verwendung von Parametern und Ignorieren unbekannter Mitglieder empfohlen
  4. Nur Einschränkungen hinzufügen: Anforderungen von RFC 8941 können nicht gelockert werden
  5. Vollständiges Feld: Spezifikation gilt für den gesamten Feldwert
  6. Implementierungsgrenzen: Größenbeschränkungen von HTTP-Implementierungen beachten