Calocybe: HTTP - Header Encoding

Beitrag lesen

Moin!

mit ist nicht ganz klar, wie bei einem HTTP Request / Response das Encoding des Message Headers herausgefunden werden kann.
Mit "Content-Type: text/html; charset=utf-8" kann man ja nur das Encoding des Contents erhalten/festlegen.

Zunaechst mal: Der Begriff "Encoding" bezieht sich in HTTP darauf, wie (bzw. ob) der Inhalt nochmal zusaetzlich irgendwie anders dargestellt wird. Das gaengigste Encoding ist "gzip", mit dem Inhalte komprimiert transportiert werden, also auch ganz normale HTML-Files. Der Browser, der das Encoding verstehen muss, macht das Encoding noch vor jeder weiteren Verarbeitung rueckgaengig, im Fall von gzip wird der Inhalt also "entpackt".

Was Du meinst ist ganz einfach der Zeichensatz, der im Content-Type mit angegeben wird. (In anderen Zusammenhaengen ist dafuer das Wort "Encoding" durchaus richtig.)

Sowohl fuer das Encoding als auch den Zeichensatz gilt, dass sich diese nicht auf die HTTP-Header beziehen, sondern immer nur auf den transportierten Inhalt (also gewoehnlich das uebertragene HTML-Dokument).

Wenn nun aber beispielsweise  "Authorization" im HTTP Header angegeben wird, so wird unter Umstaendern ja auch Username/Password mitgeschickt. In welchem Encoding sind denn nun der Username/Password  ?

Ich hab mir jetzt mal ein paar RFCs reingezogen und muss sagen, dass ist beim ersten Lesen nicht ganz einfach zu durchschauen, daher will ich folgendes nicht als verbindliche Information verkaufen. Das RFC-Paar 2616/2617 schreibt:

basic-credentials = base64-user-pass
  base64-user-pass  = <base64 encoding of user-pass, except not limited to 76 char/line>
  user-pass   = userid ":" password
  userid      = *<TEXT excluding ":">
  password    = *TEXT

TEXT        = <any OCTET except CTLs, but including LWS>
  OCTET       = <any 8-bit sequence of data>
  CTL         = <any US-ASCII control character (octets 0 - 31) and DEL (127)>
  LWS         = [CRLF] 1*( SP | HT )
  CRLF        = CR LF
  CR          = <US-ASCII CR, carriage return (13)>
  LF          = <US-ASCII LF, linefeed (10)>
  SP          = <US-ASCII SP, space (32)>
  HT          = <US-ASCII HT, horizontal-tab (9)>

und notiert (unter anderem) dazu:

"The TEXT rule is only used for descriptive field contents and values that are not intended to be interpreted by the message parser. Words of *TEXT MAY contain characters from character sets other than ISO-8859-1 only when encoded according to the rules of RFC 2047."

In RFC 2047 ist dann beschrieben, wie einzelne Woerter in einem Zeichensatz kodiert werden koennen. Das ist das, was man im Sourcetext von EMails sehen kann, wenn man im Subject oder im Absendernamen z.B. Umlaute verwendet. Sieht ungefaehr so aus:
  =?ISO-8859-1?Q?Andr=E9?= Pirard
Das =E9 steht hier fuer das Zeichen, welches in HTML mit é niedergeschrieben wird. Das ist die Kodierung als "quoted printable". Das Q zwischen den zwei Fragezeichen steht fuer diese Art der Kodierung. Ausserdem waere an dieser Stell schon die Base64-Codierung moeglich (aber unabhaengig vom Base64 fuer user-pass); statt Q muesste dann ein B stehen.

Insgesamt fasse ich das also so auf: Wenn die Username/Passwoerter in ISO-8859-1 geschrieben sind, kein Problem, einfach mit ":" aneinanderkleben, base64 drueber und dann ab die Post. Werden andere Zeichen verwendet, die in Latin1 nicht vorkommen, muss man diese zunaechst *separat* entsprechend RFC 2047 als quoted printable oder base64 kodieren, dann mit ":" zusammenkleben, und dann (nochmal) base64-kodieren. Die Dekodierung geht dann entsprechend umgekehrt. Das ist sicher sehr lustig, wenn man dann Passwoerter in Shift-JIS reinkriegt. *g* Und ich frage mich, wieviele Browser diese Kodierung korrekt vornehmen...

Na dann viel Spass!

So long

--
Bier trinken fetzt!!!