HTTP-Server Update #1

Hallo.

Nachdem ich vorgestern meinen Webserver mit Threads ausgestattet habe und die Threads per Linux-Semaphoren blockbar gemacht habe, habe ich noch einige weitere Änderungen hinzugefügt. Zum einen wird nun der Content-Type und die Content-Length ordnungsgemäß zurückgegeben. Die Content-Length gibt die Länge des HTTP-Bodies an, der Content-Type gibt den MIME-Typ des Bodies an (zum Beispiel text/html oder image/png). Da im Moment fast nur statische HTML-Dateien unterstützt werden, ergibt sich der MIME-Type des Inhalts aus der Dateiendung der zu lesenden Datei, und die Länge ist die Dateigröße. Eine Abweichung gibt es allerdings, so wird PHP de facto bereits gerufen und die Ausgabe von PHP durch den Socket zurückgeschrieben. Allerdings geben die PHP-Testskripte keine Ausgaben zurück, die auch mit anderen Webservern wie Apache2 reproduzierbar wären, sondern werden offenbar teilweise nicht ausgeführt sondern Teilskripte werden übertragen. Das sollte natürlich auf garkeinen Fall passieren.

Im aktuellen Zustand des Servers kann er bereits gespeicherte Websiten (getestet habe ich das mit der Startseite der Homepage der Technischen Universität Chemnitz), welche fast komplett richtig angezeigt wurde, allerdings konnten offenbar die Javascript-Dateien nicht übertragen werden, was zu kleineren Problemen führte. Es wurden aber die CSS, sowie die Bilddateien erfolgreich übertragen und konnten vom Browser angezeigt werden.

Wie wird der Content-Type ermittelt? Ich habe mir ein simples Dateiformat überlegt, welches den Dateiendungen den entsprechenden MIME-Types zuordnet. Beim Start des Servers wird die Datei eingelesen und alphabetisch sortiert (wie in der Datei) in ein Array geschrieben. Über dieses Array ist nun eine binäre Suche möglich, was es mir ermöglicht relativ schnell auch bei großen Datenmengen und verschiedenen Dateitypen die richtige Zuordnung zu finden.

Als nächtes versuche ich die HTTP-Aktionen (GET, POST, HEAD, DELETE, ... ) zu unterstützen und so vielleicht sogar einen kleinen Dateimanager über HTTP zu implementieren. Desweiteren soll der Server HTCPCP (Hypertext Coffeepot Control-Protocol) unterstützen. Langfristiges Ziel soll es sein, einen generischen Webserver zu implementieren, der sowohl Interpreter wie Python oder PHP starten kann, als auch C-Programme, die für irgendwelche Funktionen zuständig sind. So soll es mir möglich werden, C-Programme zu schreiben, die HTML zurückliefern, sodass der Server diesen Code zurückgeben kann. Damit erhoffe ich mir einen erheblichen Geschwindigkeitsgewinn in der Seitenauslieferung als mit PHP oder Python. Außerdem muss am Speichermanagment des Servers gearbeitet werden, da er nicht den gesamten angeforderten Speicher ordentlich wieder freigibt. Dafür wird sich sicherlich noch eine Lösung finden.

Letzte Bearbeitung: 03.08.2014 18:32