Dieses Projekt wurde im Rahmen eines 42 Kernlehrplans abgeschlossen. Es wurde mit Alouane04 gemacht
Ziel des Projekts ist es, einen C ++ 98 kompatiblen HTTP -Webserver von Grund auf neu zu erstellen. Der Webserver kann HTTP -GET, Kopf-, Post-, Put- und Löschen von Anforderungen verarbeiten und statische Dateien aus einem angegebenen Stammverzeichnis oder dynamischen Inhalt mit CGI bedienen. Es ist auch in der Lage, mehrere Client -Verbindungen mit Hilfe von Select () gleichzeitig zu verarbeiten.
Verwendung
Einführung
Teile eines Webservers
make
./webserv [Config File] # # leave empty to use the default configuration.HTTP (Hypertext Transfer Protocol) ist ein Protokoll zum Senden und Empfangen von Informationen über das Internet. Es ist die Grundlage des World Wide Web und wird von Webbrowsern und Webservern verwendet, um miteinander zu kommunizieren.
Ein HTTP -Webserver ist eine Softwareanwendung, die auf HTTP -Anforderungen von Clients (z. B. Webbrowsern) hört und auf HTTP -Anforderungen reagiert. Der Hauptzweck eines Webservers besteht darin, Webinhalte zu hosten und Benutzern über das Internet zur Verfügung zu stellen.
HTTP besteht aus Anfragen und Antworten. Wenn ein Client (z. B. ein Webbrowser) eine Webseite von einem Server abrufen möchte, sendet er eine HTTP -Anforderung an den Server. Der Server verarbeitet dann die Anforderung und sendet eine HTTP -Antwort zurück.
HTTP -Nachrichtenformat
start-line CRLF
Headers CRLF
CRLF(end of headers)
[message-body]
CRLF are Carriage Return and Line Feed (rn), which is just a new line.
Die HTTP -Nachricht kann entweder eine Anfrage oder eine Antwort sein.
HTTP -Anfrage
Eine HTTP -Anforderung besteht aus einer Anforderungszeile, Headern und einer optionalen Nachrichtenbehörde. Hier ist ein Beispiel für eine HTTP -Anfrage:
GET /index.html HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Die Anforderungslinie besteht aus drei Teilen: der Methode, dem Pfad und der HTTP -Version. Die Methode gibt die Aktion an, die der Client ausführen möchte, z. B. GET (um eine Ressource abzurufen) oder nach dem Übermitteln von Daten an den Server). Der Pfad oder URI gibt den Speicherort der Ressource auf dem Server an. Die HTTP -Version zeigt die Version des verwendeten HTTP -Protokolls an.
Header enthalten zusätzliche Informationen über die Anfrage, z. B. den Hostnamen des Servers und den verwendeten Browsertyp.
Im obigen Beispiel gab es keinen Nachrichtenkörper, da die GET -Methode normalerweise keinen Körper enthält.
HTTP -Antwort
Eine HTTP -Antwort besteht auch aus einer Statuslinie, Headern und einer optionalen Nachrichtenbehörde. Hier ist ein Beispiel für eine HTTP -Antwort:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
<Message Body>
Die Statuszeile besteht aus drei Teilen: der HTTP -Version, dem Statuscode und dem Grundsatz. Der Statuscode gibt das Ergebnis der Anforderung an, wie z. B. 200 OK (erfolgreich) oder 404 nicht gefunden (Ressource nicht gefunden). Der Grundsatz ist eine kurze Beschreibung des Statuscode. Im Folgenden finden Sie eine sehr kurze Zusammenfassung dessen, was ein Statuscode bezeichnet:
1xx zeigt nur eine Informationsnachricht an
2xx zeigt einen Erfolg an
3xx leitet den Client zu einer anderen URL um
4xx zeigt einen Fehler des Clients an
5xx zeigt einen Fehler im Server an
Header enthalten zusätzliche Informationen über die Antwort, z. B. den Typ und die Größe des zurückgegebenen Inhalts. Die Nachrichtenbehörde enthält den tatsächlichen Inhalt der Antwort, wie den HTML -Code für eine Webseite.
HTTP -Methoden
| Verfahren | Beschreibung | Möglicher Körper |
|---|---|---|
GET | Abrufen Sie eine bestimmte Ressource oder eine Sammlung von Ressourcen ab und sollten sich nicht auf die Daten/Ressource auswirken | NEIN |
POST | Führen Sie die ressourcenspezifische Verarbeitung im Anforderungsinhalt durch | Ja |
DELETE | Entfernt die von einem URI angegebene Zielressource | Ja |
PUT | Erstellt eine neue Ressource mit Daten von Message Body, wenn eine Ressource bereits vorhanden ist | Ja |
HEAD | Gleich wie Get, aber den Antwortinhalt nicht übertragen | NEIN |
ERHALTEN
Die HTTP -GET -Methode wird verwendet, um eine Darstellung einer Ressource zu lesen (oder abzurufen). Bei Erfolg (oder Nicht-Fehler) wird eine Darstellung der Ressource als Reaktionsbehörde und HTTP-Antwortstatuscode von 200 (OK) zurückgegeben. In einem Fehlerfall wird am häufigsten ein 404 (nicht gefunden) oder 400 (schlechte Anfrage) zurückgegeben.
POST
Die HTTP -Postmethode wird am häufigsten verwendet, um neue Ressourcen zu erstellen. Bei der erfolgreichen Erstellung wird der HTTP -Antwortcode 201 (erstellt) zurückgegeben.
LÖSCHEN
HTTP Delete ist Stright Forward. Es löscht eine in URI angegebene Ressource. Bei erfolgreichem Löschen wird der HTTP -Antwortstatuscode 204 (kein Inhalt) zurückgegeben.
Lesen Sie mehr über HTTP -Methoden RFC9110#9.1
Ein grundlegender HTTP -Webserver besteht aus mehreren Komponenten, die zusammenarbeiten, um HTTP -Anforderungen von Clients zu empfangen und zu verarbeiten und Antworten zurückzuführen. Unten finden Sie die Hauptteile unseres Webservers.
Der Networking -Teil eines Webservers, der TCP -Verbindungen übernimmt und Aufgaben ausführt, z. B. das Hören auf eingehende Anforderungen und das Senden von Antworten. Es ist verantwortlich für die Networking-Aufgaben auf niedriger Ebene des Webservers, z. B. das Erstellen und Verwalten von Steckdosen, die Bearbeitung von Eingabe- und Ausgabestreams sowie das Verwalten des Datenflusss zwischen Server und Clients.
Vor dem Schreiben Ihres Webservers empfehle ich, diesen fantastischen Leitfaden zum Erstellen eines einfachen TCP -Clients/Servers in C zu lesen, da Sie ein gutes Verständnis dafür erhalten, wie TCP in C/C ++ funktioniert. Außerdem müssten Sie die I/O -Multiplixierung verstehen. Dieses Video hilft Ihnen dabei, die Hauptidee von Select () zu verstehen.
Der E/A -Multiplexing -Prozess in unserem Webserver ist im folgenden Flowdiagramm zusammengefasst. (CGI ist nicht im Flussdiagramm enthalten, kann aber in Zukunft hinzugefügt werden)
Der Parsing -Teil eines Webservers bezieht sich auf den Prozess, der für das Interpretieren und Extrahieren von Informationen aus HTTP -Anforderungen verantwortlich ist. In diesem Webserver wird die Analyse von Anfragen von der HTTPrequest -Klasse durchgeführt. Ein HTTPrequest -Objekt empfängt eine eingehende Anforderung, analysiert sie und extrahiert die relevanten Informationen wie Methode, Pfad, Header und Meldungskörper (falls vorhanden). Wenn bei der Anforderung während der Parsen ein Syntaxfehler gefunden wurde, werden Fehlerflags festgelegt und an Parsen stoppt. Die Anforderung kann über die Methode Feed () entweder vollständig oder teilweise an das Objekt zugeführt werden. Dies ist möglich, da der Parser das Anforderungsbyte gleichzeitig scannt und den Parsing -Status bei Bedarf aktualisiert. Die gleiche Art der Parsen wird von Nginx und NodeJS anfordern, Parsers zu fordern.
Im Folgenden finden Sie einen Überblick darüber, wie der Parser funktioniert.
Der Antwortbauer ist verantwortlich für die Konstruktion und Formatierung der HTTP -Antworten, die als Antwort auf ihre Anfragen an die Kunden zurückgeschickt werden. In diesem Webserver ist die Antwortklasse für das Erstellen und Speichern der HTTP -Antwort, einschließlich der Statuslinie, der Header und der Meldungskörper, verantwortlich. Der Antwortbauer kann auch Aufgaben ausführen, z. B. das Festlegen des entsprechenden Statuscode und der Vernunftphrase basierend auf dem Ergebnis der Anforderung, dem Hinzufügen von Headern zur Antwort, um zusätzliche Informationen über den Inhalt oder den Server bereitzustellen, und das Formatieren der Nachrichtenbehörde entsprechend dem Inhaltstyp und der Codierung der Antwort. Wenn der Server beispielsweise eine Anforderung für eine Webseite von einem Client erhält, analysiert der Server die Anforderung und übergibt sie an ein Antwortobjekt, das den Inhalt der Webseite abreißt und die HTTP-Antwort mit den HTML-Inhalten im Nachrichtenkörper und den entsprechenden Headern erstellt.
Die Konfigurationsdatei ist eine Textdatei, die verschiedene Einstellungen und Anweisungen enthält, die vorschreiben, wie der Webserver funktionieren soll. Diese Einstellungen können Dinge wie die Portnummer enthalten, die der Webserver anhören soll, den Standort des Stammverzeichnisses des Webservers und viele andere Einstellungen.
Hier ist ein Beispiel für Fie, das das Konfigurationsdateiformat und unterstützte Anweisungen anzeigt.
server {
listen 8001 ; # listening port, mandatory parameter
host 127.0.0.1; # host or 127.0.0.1 by default
server_name test; # specify server_name, need to be added into /etc/hosts to work
error_page 404 /error/404.html; # default error page
client_max_body_size 1024 ; # max request body size in bytes
root docs/fusion_web/; # root folder of site directory, full or relative path, mandatory parameter
index index.html; # default page when requesting a directory, index.html by default
location /tours {
root docs/fusion_web; # root folder of the location, if not specified, taken from the server.
# EX: - URI /tours --> docs/fusion_web/tours
# - URI /tours/page.html --> docs/fusion_web/tours/page.html
autoindex on ; # turn on/off directory listing
allow_methods POST GET; # allowed methods in location, GET only by default
index index.html; # default page when requesting a directory, copies root index by default
return abc/index1.html; # redirection
alias docs/fusion_web; # replaces location part of URI.
# EX: - URI /tours --> docs/fusion_web
# - URI /tours/page.html --> docs/fusion_web/page.html
}
location cgi-bin {
root ./; # cgi-bin location, mandatory parameter
cgi_path /usr/bin/python3 /bin/bash; # location of interpreters installed on the current system, mandatory parameter
cgi_ext .py .sh; # extensions for executable files, mandatory parameter
}
}CGI ist ein Standard für die Ausführung externer Programme von einem Webserver. Wenn ein Benutzer eine Webseite anfordert, die von einem CGI -Programm behandelt werden sollte, führt der Webserver das Programm aus und gibt die Ausgabe an den Webbrowser des Benutzers zurück.
CGI -Programme sind einfach Skripte, die in jeder Programmiersprache wie Perl, Python oder Bash geschrieben werden können und in der Regel verwendet werden, um Daten zu verarbeiten, die von einem Benutzer über einen Webbrowser übermittelt werden oder dynamische Inhalte auf einer Webseite generieren.