Siechfred: HTTP-Response, Header-Parsing

Beitrag lesen

Dem IE 6 ist es ganz egal ob es sich um "text/plain" oder "text/html" handelt
Unterscheide doch bitte, was dein Browser zugeschickt bekommt, und was der Server macht.

Dieser Hinweis ist hier nicht relevant.

Die Angabe
print "Content-type: text/html\n\n";
erreicht deinen Browser gar nicht. Die gilt für den Perl-Interpreter, der liefert das an den Server aus, und erst der liefert dann irgendwas an deinen Browser.

Sorry, aber das kann so nicht stehen bleiben. Ich gehe davon aus, dass dir HTTP bekannt ist. Ich gehe weiterhin davon aus, das dir bekannt ist, wie ein Webserver die Ausgaben eines serverseitigen Programmes im CGI-Kontext abarbeitet.

Deshalb für's Archiv:

Der Browser sendet einen HTTP-Request an den Server. Dieser wird via CGI-Schnittstelle "verteilt" (es werden insbesondere Umgebungsvariablen gesetzt und die Ein- und Ausgabekanäle STDIN und STDOUT bereitgestellt). Das Perl-Script nimmt den aufbereiteten Request entgegen und verarbeitet ihn.

Nach erfolgter Verarbeitung muss das Script zwingend eine HTTP-Response an den anfragenden Client schicken. Dieser Response ist wie folgt aufgebaut:

1. Statuszeile, bestehend aus HTTP-Version, HTTP-Statuscode als 3-stellige Zahl und die dazu gehörende Erklärung gemäß RFC 2616, Sect. 10. Darauf folgt ein "Zeilenumbruch" (CRLF).

2. Response-Header, bestehend aus verschiedenen Header-Zeilen, einige davon zwingend, andere optional. Welche Header zwingend und welche optional sind, beschreibt wie bereits genannt RFC 2616. Darauf folgen zwei Zeilenumbrüche.

3. Der Body der Antwort, welcher die eigentlichen Daten enthält.

Um nun allen Beteiligten das Leben zu erleichtern, bieten die meisten Webserver so genanntes Header-Parsing an. Das bedeutet, dass man in einem Script lediglich bestimmte Header-Angaben machen muss, nämlich solche, die eine Software nicht eindeutig und ohne den Request zu verfälschen ergänzen kann. Alles andere ergänzt der Webserver automagisch, u.a. auch die HTTP-Statuszeile. Daneben bringt er vom Script gelieferte Headerzeilen in die RFC-gerechte Form. Dann hängt er die Daten an und versendet den bereinigten und ergänzten Request an den Client.

Um das mal am konkreten Beispiel zu demonstrieren:

#! /usr/bin/perl -w  
use strict;  
  
print "content-type:text/html\n\n";  
print 'Hier ich bin!';

Der Header verstößt formal gegen RFC 2616 (Groß-/Kleinschreibung, kein Leerzeichen zwischen ':' und 'text/html'). Jetzt schauen wir mal, was im Zuge des Header-Parsings im Apache herauskommt:

HTTP/1.0 200 OK  
Connection: close  
Date: Thu, 20 Sep 2007 07:45:25 GMT  
Server: Apache  
Content-Type: text/html  
  
Hier ich bin!

Alles Bestens! Und genau diese HTTP-Response kommt auch im Client an, und nicht "irgendwas". Falls du das so gemeint haben solltest (wovon ich ausgehe), dann wäre es schön, wenn du es das nächste Mal auch unmissverständlich zum Ausdruck brächtest :)

Siechfred