Qgelm

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige ÜberarbeitungVorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
schulung:statischer_http_server [2021/12/02 15:23] Thomasschulung:statischer_http_server [2022/01/11 16:28] (aktuell) – index.html Thomas
Zeile 10: Zeile 10:
 # Allgemeine Defiitionen: # Allgemeine Defiitionen:
 SERVER_HOST = '0.0.0.0' # d.h. alle Netzwerkschnittstellen des Rechners SERVER_HOST = '0.0.0.0' # d.h. alle Netzwerkschnittstellen des Rechners
-SERVER_PORT = 8000 # nur im Beispiel, per Konvention geht http über Port 80+SERVER_PORT = 8000 # nur im Beispiel,  
 +                   # per Konvention geht http über Port 80
  
 # Wir binden uns an einen Socket # Wir binden uns an einen Socket
Zeile 26: Zeile 27:
  
         # da hat einer angebissen, jetzt die Daten des Requests:         # da hat einer angebissen, jetzt die Daten des Requests:
-        request = client_connection.recv(1024).decode()+        request = client_connection.recv(1024).decode("utf-8")
         print(request)         print(request)
  
         # Und unser HTTP Response dazu:         # Und unser HTTP Response dazu:
         response = 'HTTP/1.0 200 OK\n\nHallo Welt\n\n'         response = 'HTTP/1.0 200 OK\n\nHallo Welt\n\n'
-        client_connection.sendall(response.encode())+        
 +        #          \n ist das Sonderzeichen für Zeilenende 
 +        # 
 +        client_connection.sendall(response.encode("utf-8"))
         client_connection.close()         client_connection.close()
  
Zeile 38: Zeile 42:
 </code> </code>
    
-Das ist der allereinfachste statische Webserver. Es wird immer (egal welche Ressource angefordert wurde) Das (Pseudo-)Dokument "Hallo Welt" zurückgeliefert.+Das ist der allereinfachste statische Webserver. Es wird immer (egal welche Ressource angefordert wurde) Das (Pseudo-)Dokument "**Hallo Welt**" zurückgeliefert.
  
-Den Kommunikationsablauf schauen wir uns trotzdem mal in der [[https://qgelm.de/siab/|Konsole]] (wieder mit Rechtskick+Neues Fenster) an:+Den Kommunikationsablauf schauen wir uns trotzdem mal in der [[https://qgelm.de/siab/|Konsole]] (wieder mit Rechtsklick+//Neues Fenster//) an:
  
 Server starten mit Server starten mit
Zeile 60: Zeile 64:
 So, das war nur zu Demonstrationszwecken. Dieser Code prüft nicht einmal auf korrekte Syntax des Requests (warum auch ;-)). So, das war nur zu Demonstrationszwecken. Dieser Code prüft nicht einmal auf korrekte Syntax des Requests (warum auch ;-)).
  
-Diese Bedienung der Socket-Schnittstelle UND die korrekte Behandlung der Requests gibt es in Python auch fertig verpackt zur leichteren Nutzung:+Ein korrekter Web-Server würde die Request-Zeile ("GET /...") auf den geforderten Aufbau hin überprüfen und interpretieren.
  
 +Die eigentliche Aufgabe besteht aber darin, je nach Request-Kommando und der angefragten Ressource den Inhalt nach der Leerzeile des Response zusammenzutragen.
 +
 +Wir nehmen hier immer die einfachste Form des Request, das GET. Der Vollständigkeit halber ein paar Worte zu den anderen Request-Typen:
 +
 +  * **HEAD**: Spezialform des GET, es soll kein Inhalt übertragen werden. Der Browser will hier nur nachschauen, ob sich zwischenzeitlich an der Ressource etwas geändert hat oder ob ein erneutes GET gespart werden kann.
 +  * **POST**: Das ist die Form eines Requests, wenn der Browser dem Server auch noch Daten schicken will. Die können aus Formulareingabefeldern aus der Webseite stammen oder beispielsweise ein Datei zum Hochladen sein. Offensichtlich hat der Server dann etwas mehr zu tun. Die Daten werden auch hier nach der Leerzeile hinter der Requestzeile angehängt. Details dazu spare ich mir hier.
 +  * In späteren HTTP-Versionen kommen weitere Request-Typen dazu: PUT, DELETE, ... Die spielen aber beim Web-Surfen auch keine bedeutende Rolle.
 + 
 +Zu Übungszwecken ersetzen wir den etwas zu einfachen HTTP Server von eben mit dem nächst einfachen Modell, das jede Ressource in der URL als Dateinamen im aktuellen Verzeichnis interpretiert:
 <code> <code>
 +cd ~/Schulung/html
 +echo "Dies ist ein Test." > test.txt
 python3 -m http.server 8000 python3 -m http.server 8000
 </code> </code>
  
-Dabei wird die Ressource nach GET wie folgt interpretiert: +und auf der //Client// Seite verwenden wir jetzt auch mal ein etwas leistungsstärkeres Erprobungstool: **curl** verhält sich wie ein richtiger Browsergibt aber alle Request-Inhalte direkt als Text im Terminal ausBeachte das **-v**! Damit wird die eigentliche http-Kommunikation mit rausgeschrieben, einschließlich aller Header-Zeilen
-  Falls eine Datei in dem aktuellen Verzeichnis existiertderen Name auf die Ressource passt, dann wird ''200 OK'' mit dem Inhalt der Datei als Response zurückgeschickt. +
-  Wenn die Ressource das Zeichen / enthält, dann wird das wie Namen von Unterverzeichnissen behandelt und die passende Datei aus dem Unterverzeichnis gesendet +
-  Wenn die Ressource genau auf ein Verzeichnis (einschließlich / für das aktuelle), dann wird die Datei mit dem Namen index.html als die eigentlich gewünschte Ressource angenommen. +
-  * Ansonsten wird eine Fehlermeldung in den Response gepackt''404 Not found''+
  
 +<code>
 +curl -v http://localhost:8000/test.txt
 +</code>
 +
 +Das Ergebnis sieht dann in Summe etwa so aus:
 +{{:schulung:curl.png?direct}}
 +
 +Aber schon wenn man ein echtes (wenn auch recht einfaches) HTML Dokument auf diesem Weg anzeigen will, dann sieht man nicht viel. Beispiel für so eine Datei:
 +
 +<code html>
 +<!doctype html>
 +
 +<html lang=de>
 +
 +<head>
 +  <meta charset=utf-8>
 +  <title>Schulungsseite</title>
 +</head>
 +
 +<body>
 +  <h1>Willkommen</h1>  
 +  <p>Diese Seite dient nur zu Schulungszwecken.</p>
 +
 +  <img src="nachbarn.png"></img>
 +
 + 
 +  <li> <a href="gollum.jpg">Dies ist ein Link auf ein weiteres Bild...</a> </li>
 +  <li> <a href="existiert.nicht">und dieser Link provoziert eine 404 Fehlermeldung.</a></li>
 +
 +</body>
 +
 +</html>
 +</code>
 +
 +Deshalb schauen wir uns das Ergebnis lieber in einem richtigen Browser an.
 +
 +Im wirklichen Leben macht sich außerdem ein [[Schulung:http_real_server|richtiger Web-Server]] etwas mehr Arbeit bei seinem Response...
 +