Wie man Content-Types zerlegt

the next big thing  –  3 Kommentare

Wer regelmäßig mit HTTP-Requests hantiert, weiß um die Wichtigkeit des Content-Type-Headers. Von Zeit zu Zeit kann es notwendig sein, den Content-Type aus einem Request auszulesen. Das wirkt auf den ersten Blick trivial – ist aber nicht ganz so einfach. Der Teufel liegt im Detail.

Wie vieles andere im Web ist auch das Format des Content-Type-Headers in einem RFC spezifiziert. Konkret handelt es sich in diesem Fall um Abschnitt 3.1.1.5 von RFC 7231. Der darin als Wert verwendete Media-Type ist wiederum in Abschnitt 3.1.1.1 desselben Dokuments beschrieben. Während die Definition des Headers an sich simpel erscheint, wirkt die Beschreibung des Media-Types schon deutlich komplexer.

Auffällig ist hier vor allem, dass neben dem eigentlichen Media-Type, der sich wiederum in einen Typ und einen Subtyp zerlegen lässt, noch weitere Angaben (die sogenannten Parameter) möglich sind. Ein gültiger Media-Type kann daher nicht nur die Form

text/html;charset=utf-8

haben, sondern auch:

text/html; charset="UTF-8"

Leerstellen sind also durchaus zulässig, ebenso Anführungszeichen. Auch die Groß- und Kleinschreibung kann variieren. Leider wird es noch ein bisschen komplexer, denn obwohl Leerzeichen zwar zulässig sind, gilt dies nicht links und rechts des Gleichheitszeichens, mit dem einem Parameter ein Wert zugewiesen wird.

Wer nun einen Content-Type-Header RFC-konform zerlegen muss, muss also einigen Aufwand betreiben, das auf korrekte Art zu erledigen.

Abhilfe schafft, wie so oft, ein passendes npm-Modul. Das Modul content-type stellt für genau den Zweck eine parse-Funktion zur Verfügung, die einen gegebenen Header wie gewünscht zerlegt und die verschiedenen Daten in Form eines Objekts zurückgibt:

'use strict';

const { parse } = require('content-type');

const { type, parameters } = parse('text/html; charset=utf-8');

console.log(type);
// => 'text/html'

console.log(parameters);
// => {
// charset: 'utf-8'
// }

Den Typ und den Subtyp wandelt das Modul ebenso wie die Parameternamen in Kleinschreibung um, sodass die Ergebnisse stets konsistent sind.

Installieren lässt sich das Modul auf dem üblichen Weg per npm:

$ npm install content-type

In diesem Sinne: Happy Parsing :-)

tl;dr: Das npm-Modul content-type stellt eine parse-Funktion zur Verfügung, mit der sich Content-Type-Header RFC-konform analysieren und zerlegen lassen.