|
Schreiben Sie einen einfachen WWW-Server myhttpd, der auf
HTTP-Anfragen hin Dokumente an Clients liefert.
-
Sie brauchen keine Spezialfähigkeiten einzubauen (wie CGI-Skripte
ausführen o.ä.)! Der Server soll lediglich seinen Port abhören
und, wenn ein GET-Kommando (siehe Aufgabe 17) ankommt, das angegebene
Dokument zurückschicken.
-
Als einziger Aufrufparameter soll die Port-Nummer angegeben werden können,
also beispielsweise "myhttpd 8080" (der übliche Port 80 kann
nur mit root-Rechten verwendet werden, falls er nicht ohnehin schon
für einen "echten" Server vergeben ist). Sie können also (z.B.
zum Testen) mit Ihrem Programm showhttp aus Aufgabe 17 kommunizieren,
wenn beide dieselbe Portnummer verwenden.
-
Verfahren Sie ähnlich wie der Server sserver aus der Vorlesung.
Legen Sie also einen Listen-Socket an, binden Sie ihn mit bind an
den gewünschten Port und initialisieren Sie mit listen die
Warteschlange für Anfragen.
Nehmen Sie danach in einer Endlosschleife Anfragen per accept an.
Lesen Sie dann jeweils aus dem Accept-Socket ein Kommando, bearbeiten
es, wenn es ein "GET" ist (sonst liefern Sie eine Fehlermeldung,
s.u.), und schließen Sie den Accept-Socket. Sie brauchen für die
Bearbeitung der Anfrage keinen neuen Prozeß zu erzeugen.
Geben Sie zur Kontrolle jeweils die Adresse des Clients und das angekommene
Kommando (ohne die Steuerangaben) aus!
-
Beachten Sie, daß hinter dem "GET" nach einem Space der
Dokumentname folgt. Nach einen weiteren Space können allerdings noch
diverse Steuerangaben folgen, die Sie einfach ignorieren sollen!
Wenn Sie wollen, können Sie in den Steuerangaben nach einer Zeile
suchen, die mit "User-Agent:" beginnt - dahinter findet sich
beispielsweise der Name des Browsers, der bei Ihnen anfragt.
-
Bei Fehlern wird normalerweise ein HTTP-Fehlerstatus zurückgegeben.
Sie brauchen sich natürlich nicht an das genaue Protokoll zu halten.
Geben Sie aber zur Orientierung zumindest folgende Fehlernummern und
Fehlermeldungen im Klartext zurück:
| "400 Bad Request" |
(fehlendes/falsch formatiertes Argument),
|
| "403 Forbidden" |
(keine Leserechte auf das Dokument),
|
| "404 Not Found" |
(Dokument existiert nicht),
|
| "501 Method Not Implemented" |
(unbekanntes Kommando, hier: kein GET).
|
Wenn Sie wissen wollen, was "echte" Server zurückliefern, können
Sie das ja jederzeit mit Ihrem showhttp testen.
- Die übliche Konvention, wo Dokumente anhand ihres Pfades gesucht
werden, ist folgende:
Dokumente, deren Pfad mit `~' beginnt, liegen im
public_html-Verzeichnis eines Benutzers, ansonsten in einem
Standardverzeichnis wie "/usr/local/httpd/htdocs". Beginnt der
Pfad beispielsweise mit "~axel/", wechseln Sie nach
"/home/axel/public_html".
Der Rest des Pfads wird wie ein normaler Pfad aus Directories interpretiert.
Wenn ein ".." vorkommen sollte, lehnen Sie aus
Sicherheitsgründen die Lieferung ab (da man sonst an beliebige Stellen im
Dateibaum gelangen könnte)!
Falls der Pfad auf ein `/' endet, liefern Sie die Datei
"index.html" aus dem entsprechenden Verzeichnis. Wenn ansonsten
der Pfad kein File, sondern ein Directory beschreibt, liefern Sie am besten
einen Fehler zurück, da sonst Browser bei nachfolgenden relativenu
Pfadangaben Fehler machen. (Der HTTP-Status wäre
"301 Moved Permanently").
Als Beispiel folgen einige HTTP- und die korrespondierenden
Directory-Pfadangaben mit den oben angenommenen Verzeichnis-Namen:
| /~axel/im/axllogo.gif |
/home/axel/public_html/im/axllogo.gif
|
| /~axel/ |
/home/axel/public_html/index.html
|
| /~axel |
"301 Moved Permanently"
|
| / |
/usr/local/httpd/htdocs/index.html
|
|