mother

aufgabe5/SP2

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

mother
Habe bis jetzt nur eine kurze Frage.
Es geht um das dirlisting.
Kann es sein, dass zumindest der Firefox (Iceweasel) in cip zu bloed ist es anzuzeigen?
Es zeigt mir den html code naemlich in plaintext anstadt es zu uebersetzen. Spricht, was ich sehe = Page Source :

<html><head>
<title>Index of /perl-test/</title>
</head><body>
<h1>Index of /perl-test/</h1>
<a href="/">(Parent Directory)</a><br>
<a href="/perl-test/Aufgaben">Aufgaben</a><br>
<a href="/perl-test/Folien">Folien</a><br>
<a href="/perl-test/dirList.pl">dirList.pl</a><br>
<a href="/perl-test/doc">doc</a><br>
<a href="/perl-test/echo.pl">echo.pl</a><br>
<a href="/perl-test/visitors.pl">visitors.pl</a><br>
</body></html>

Kommunikation:

server:

$ ./mother --wwwpath=/proj/i4sp2/pub/aufgabe5/wwwdir --port=9000 --bufsize=50 --threads=10
   NOTE: Due to possibly misconfigured proxy settings in the CIP pools, try using
   the actual hostname instead of "localhost" in your browser if you get connection
   errors or timeouts.

client:

$ nc localhost 9000
GET /perl-test/
<html><head>
<title>Index of /perl-test/</title>
</head><body>
<h1>Index of /perl-test/</h1>
<a href="/">(Parent Directory)</a><br>
<a href="/perl-test/Aufgaben">Aufgaben</a><br>
<a href="/perl-test/Folien">Folien</a><br>
<a href="/perl-test/dirList.pl">dirList.pl</a><br>
<a href="/perl-test/doc">doc</a><br>
<a href="/perl-test/echo.pl">echo.pl</a><br>
<a href="/perl-test/visitors.pl">visitors.pl</a><br>
</body></html>%   

Ok firefox (iceweasel) ist wieso auch immer da beschraenkt, da chromium es kann…

Edit:
chromium braucht anscheinend kein httpOK.


Jein. Du musst dem Firefox vor dem HTML noch sagen, dass seine Anfrage OK ist.

Btw. hier ist die Ausgabe von [m]nc[/m] mit der [m]mother[/m] aus dem pub-Verzeichnis

$ nc localhost 2012
GET /perl-test/
HTTP/1.0 200 OK

<html><head>
<title>Index of /perl-test/</title>
</head><body>
<h1>Index of /perl-test/</h1>
<a href="/">(Parent Directory)</a><br>
<a href="/perl-test/Aufgaben">Aufgaben</a><br>
<a href="/perl-test/Folien">Folien</a><br>
<a href="/perl-test/dirList.pl">dirList.pl</a><br>
<a href="/perl-test/doc">doc</a><br>
<a href="/perl-test/echo.pl">echo.pl</a><br>
<a href="/perl-test/visitors.pl">visitors.pl</a><br>
</body></html>

Die Aufgabenstellung ist in diesem Zusammenhang auch „beschraenkt“ :slight_smile:


Zweite kurze frage.
Um zu testen, ob index.html da ist, benutze ich einfach ein lstat. Das kann aber fehlschlagen (z.B.: wenn index.html nicht da ist, was ja in Ordnung ist).
Manche fehler die es aber zurueckschmeisst sollte man vll nicht ignorieren, ODER?
Welche sollte man nicht ignorieren?

Ich finde das einzige sinnvolle ist ENOMEM, da schicke ich dem client ein httpInternalServerError, und gut ist. Die Begruendung dafuer waere “verschwinde, komm spaeter wenn ich mehr speicher fuer dich habe”.

Muss ich noch andere errnos beachten???
Denn wenn es fehlschlaegt, und errno != ENOMEM, dann rufe ich einfach scandir und versuche dem Client das Verzeichniss zurueckzugeben.


Sollte bei lstat ein Fehler auftreten, reicht es aus die Verzeichnisauflistung auszugeben.


void handleInternalError(int client);

was hat es mit der Funktion auf sich? Ruf ich dort fcntl() auf? Ich kann damit leider nichts anfangen. :huh:


nein,
die Rufst du wahrscheinlich in der Thread-Funktion, wenn fdopen fehlschaegt, auf jedenfall bei Fehlerfall bevor handleRequest()

Viel wichtigere frage, muss man dies implementieren??? Was soll da drinnen sein? In der Aufgabenstellung ist nichts, und ich weiss nicht ganz was ich reincoden sollte.


Exakt. Das steht auch so in der Dokumentation ([m]request.h[/m]):

Ja, du musst diese Funktion implementieren. Tipp: Schau dich mal der [m]i4httools.h[/m] um.

1 Like

Also wenn ich es richtig verstehe dann ist die funktion ein Einzeiler (ggf noch fehlerbehandlung usw.).
Der Grund wieso wir noch eine extra Funktion brauchen und nicht gleich die void httpInternalServerErrorToFd aufrufen ist, dass alles was dem Client zugeschickt werden soll, in der request-blabla.c stehen soll??? Also der Uebersichtwegen?


Jupp.

Das Verbindungsmodul weiss nicht, welches Protokoll gesprochen wird. Das wirklich gesprochene Protokoll wird durch das Anfragemodul implementiert und nur das Anfragemodul kann eine Fehlermeldung im richtigen Format generieren.

Natuerlich koenntest du theoretisch auch die Funktion [m]httpInternalServerErrorToFd[/m] direkt aus dem Verbindungsmodul aufrufen. Allerdings ist das Verbindungsmodul dann nicht mehr protokollunabhaengig.


Die beiden Hack-Aufgaben ([m]harsh[/m] und [m]i4s[/m]) verwenden ebenfalls die in der [m]request.h[/m] definierte Schnittstelle. Allerdings sprechen beide kein HTTP…die i4s spricht sogar ein binaeres Protokoll.


Ich schliess mich mit meiner Frage jetzt einfach mal hier an.

Muss man im Makefile noch was veraendern damit alles richtig funktioniert? Sobald ich in request-httpx.c eine
der geforderten Funktionen umsetzen will gibts nen Fehler…
Bei der connection-mt.c und den anderen Dateien funktionierts ohne Probleme. Kann mir einer auf die Spruenge helfen, was
ich da falsch mach?

cc -c -std=c99 -pedantic -D_XOPEN_SOURCE=700 -Wall -Werror -pthread -g connection-mt.c
cc -c -std=c99 -pedantic -D_XOPEN_SOURCE=700 -Wall -Werror -pthread -g request-httpx.c
cc -o mother  connection-mt.o request-httpx.o -L. -lmother -ljbuffer -lpthread
./libmother.a(request-httpx.o): In function `handleInternalError':
request-httpx.c:(.text+0x267): multiple definition of `handleInternalError'
request-httpx.o:/home/user/Desktop/Semester 5/SP2/user/trunk/aufgabe5/request-httpx.c:8: first defined here
collect2: ld gab 1 als Ende-Status zurück
make: *** [mother] Fehler 1

Meine Glaskugel meint: Du hast eine Funktion der [m]request.h[/m] Schnittstelle nicht implementiert. Das führt dazu, dass die [m]request-httpx.o[/m] aus der libmother.a geholt wird und das wiederum führt zu dem Fehler „multiple definitions“.


In der Tat war das der Fehler. Mir war das irgendwie nicht bewusst, dass alle Funktionen implementiert sein muessen. Danke lusiux :wink: