Aufgabe

Erstellen Sie eine möglichst minimale Symfony-4-Anwendung, die auf HTTP-Anfragen ähnlich wie der Webserver aus Aufgabe 4 antwortet, ohne dass es entsprechende HTML-Dateien tatsächlich als statische Ressourcen auf dem Webserver gibt.

In der folgenden Spezifikation sind jeweils die erwarteten HTTP-Header und -Body durch eine Leerzeile getrennt. Die angegebenen HTTP-Header-Zeilen müssen genauso auch in den Antworten Ihrer Anwendung stehen (der Header darf zusätzliche Zeilen beinhalten). Die HTTP-Bodys Ihrer Antworten dürfen leicht abweichende Inhalte haben.

1. GET /, GET /index.htm und GET /hallo.htm

Bei allen drei Anfragen identisch:

HTTP/1.1 200 OK

Hallo, Welt!

2. GET /index.html

HTTP/1.1 302 Found
Location: index.htm

3. GET /super-secret.htm

HTTP/1.1 403 Forbidden

Kein Zugriff!

4. GET /secret.htm

Bei Anfrage ohne Zugangsdaten:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="Secured Area"

Bei Anfrage mit Nutzer htw und Password webdev:

HTTP/1.1 200 OK

Geheimer Inhalt.

5. GET /zeit.htm

Die Ausgabe soll bei jedem Aufruf der jeweils aktuellen Uhrzeit entsprechen.

HTTP/1.1 200 OK

Aktuelle Zeit: 04.01.2018 15:08:06

6. GET /some-random-file.htm

HTTP/1.1 404 Not found

Datei nicht gefunden.

Ebenso bei jeder anderen Anfrage, die hier nicht spezifiziert wurde.

Nicht-funktionale Anforderungen

Minimale Abhängigkeiten

  • Starten Sie mit dem Symfony-Grundgerüst und installieren Sie nur die folgenden zwei Abhängigkeiten:
    $ composer create-project symfony/skeleton bonus-http-symfony
    $ cd bonus-http-symfony
    $ composer require sensio/framework-extra-bundle
    $ composer require security

    Sie dürfen in dieser Aufgabe keine weiteren Abhängigkeiten verwenden!

Minimaler Code

  • Legen Sie nur eine einzige Controller-Klasse an. Diese Klasse darf nur fünf Methoden beinhalten, die jeweils nur eine einzige Zeile Code beinhalten.
  • Um Anforderung Nr. 6 ohne weitere Abhängigkeiten zu erfüllen, müssen Sie auf kernel.exception-Events reagieren, die u.a. über das Fehlen einer Route für eine angefragte URL informieren. Sie dürfen dafür eine weitere Klasse anlegen, deren einzige Methode nicht mehr als fünf Statements beinhaltet. Zur Verdeutlichung: Der folgende Codeschnipsel hat 6 Statements.
    function foo($bar) {
      if ($bar->getValue() > 17) { // 1 (if), 2 (->getValue()), 3 (>)
        return new Blub(2);        // 4 (new), 5 (return)
      }
      return 2;                    // 6 (return)
    }
  • In den Konfigurationsdateien (config/**/*.yaml) dürfen Sie ingesamt maximal 15 Zeilen hinzufügen/bearbeiten.
  • Sie dürfen keine weiteren Dateien anlegen oder verändern, insbesondere nicht im public-Verzeichnis. (Wenn Sie Ihre Anwendung auf Heroku deployen wollen, dürfen Sie dafür eine Procfile und eine apache.conf anlegen.)

Hinweise

Sie können dieses Test-Utility benutzen, um Ihre Implementierung gegen die Spezifikation zu prüfen. In der oben verlinkten Symfony-Doku finden Sie viele Informationen, die diese Aufgabe relativ leicht machen.


Bewertungskriterien (max. 4 Punkte)

  • Funktionale Anforderungen an die HTTP-API (Nr. 1 bis 6) sind erfüllt. (2 Punkte)
  • Die Funktionalität wurde komplett nur mit den vorgegebenen Abhängigkeiten erfüllt.
  • Die Minimalitätsbeschränkungen (Anzahl Klassen, Methoden, Statements, Änderungen) wurden eingehalten.