{{backlinks>.}} ===== HTTP ===== Hypertext Transfer Protocol: Transfer von Webseiten und Zugemüse (auch einfach Dateien). ==== Aufgabe ==== Programmieren Sie einen minimalen Webserver, der folgende Anforderungen erfüllt: * Es gibt einen Ordner **html**, indem Dateien (und Unterordner) liegen, die der Webserver ausliefern kann. * Prüfen Sie den angeforderten Pfad. Insbesondere darf es nicht möglich sein, auf Dateien ausserhalb des Verzeichnisses **html** zuzugreifen. * Schreiben Sie eine minimale html-Datei, die auch ein Bild enthält und testen Sie ihren Webserver damit. === Hilfestellungen === == HTTP Protokoll == Minimale HTTP-Anfrage (Achtung, verwendet "\r\n" für einen Zeilenumbruch (wie DOS), nicht nur einfach "\n" (wie Unix). GET /bla.html HTTP/1.1\r\n Host: fginfo.ksbg.ch:42001\r\n Connection: close \r\n \r\n Die erste Zeile enthält Methode (GET), Pfad /bla.html und Protokollversion. Die zweite Zeile enthält den Servernamen und evtl. den Port Die dritte Zeile ist optional Zwei leere Zeilen schliessen die Anfrage ab. Die Minimale Antwort sieht wie folgt aus: HTTP/1.1 200 OK\r\n Content-Type: text/html\r\n Content-Length: 1354\r\n \r\n .... DATEN .... Oder natürlich HTTP/1.1 404 Not Found Als Content-Type kommt z.B. auch image/png oder imag/jpg in Frage. == Ruby File Access == Siehe auch https://ruby-doc.org/core-2.2.0/File.html * File.exists?(pfad) Überprüft, ob die Datei existiert. * File.read(pfad) Liefert den Inhalt einer Datei als String zurück * File.absolute_path(pfad) Liefert den absoluten Pfad zurück (z.B. /home/hansli/server/html/index.html) Um mit Verzeichnissen zu arbeiten, siehe auch https://ruby-doc.org/core-2.2.0/File.html * Dir.pwd liefert den aktuellen Pfad * Dir.glob("html/*") liefert ein Array mit allen Dateien im Verzeichnis html ==== Lösungsvorschlag ==== # coding: utf-8 require 'socket' # Damit Ruby auch bei Fehlern im Thread abbricht mit Fehlermeldung Thread.abort_on_exception=true # 2 Methoden für Fehlermeldungen def notfound(client, pfad, debug="") msg = "

404 Not found

Sorry, ich bin halt nur ein Webserver... #{pfad} habe ich nicht gefunden...

Debug Info

#{debug}
" client.puts "HTTP/1.1 404 Not Found\r Content-Type: text/html\r Content-Length: #{msg.size}\r\n\r\n" client.puts msg puts "Got a 404" end def badRequest(client, req, debug="") msg = "

400 Bad request

Sorry, die Anfrage #{req} verstehe ich nicht.

Debug Info

#{debug}
" client.puts "HTTP/1.1 400 Bad request\r Content-Type: text/html\r Content-Length: #{msg.size}\r\n\r\n" client.puts msg puts "Got a 400" end # Methode für Dirlisting def dirlist(client,basepfad, abspfad, relpfad) relpfad = "/" if (relpfad=="") puts "Dirlist für #{abspfad}, #{relpfad}" files = Dir.glob(abspfad+"/*") # Alle Dateien im Verzeichnis relpfad.gsub(/\/+$/,"") # Remove trailing slash msg = "

Directory #{relpfad}