| |
int default_handler (request_rec *r)
{
int errstatus;
FILE *f;
if (r->method_number != M_GET) return DECLINED;
if (r->finfo.st_mode == 0) return NOT_FOUND;
if ((errstatus = ap_set_content_length (r, r->finfo.st_size))
|| (errstatus = ap_set_last_modified (r, r->finfo.st_mtime)))
return errstatus;
f = fopen (r->filename, "r");
if (f == NULL) {
log_reason("file permissions deny server access",
r->filename, r);
return FORBIDDEN;
}
register_timeout ("send", r);
ap_send_http_header (r);
if (!r->header_only) send_fd (f, r);
ap_pfclose (r->pool, f);
return OK;
}
Dieser Handler ist für die Beabeitung von GET-Anfragen zuständig. Das ent-
sprechende Feld des Requests wird direkt zu Beginn abgefragt. Handler setzen
im Normalfall nur einige Felder des Requests, bevor der Request zum nächsten
Handler weitergereicht wird. Dieser Handler ist ein Response-Handler, der di-
rekt Anworten an den Client erzeugen lässt. Der folgende Code-Teil
...
errstatus = ap_set_last_modified (r, r->finfo.st_mtime)
...
überprüft beispielsweise, ob die letzte
Änderung der Datei nach dem vom
Client in der Anfrage If-modified-since Wert liegt. Falls ja, liefert die Funk-
tion 0 zurück und die Seite wird im Folgenden ausgeliefert. Falls nicht wird
errstatus auf die Konstante USE LOCAL COPY gesetzt, was eine HTTP-CODE
304-Antwort (NOT CHANGED) an den Client bewirkt, so dass der Client das
Dokument aus seinem Cache nehmen kann und das Dokument nicht erneut
übermittelt werden muss.
Die Handler der einzelnen Phasen arbeiten Hand in Hand und set-
zen/verarbeiten nacheinander Felder des Requests. In den frühen Phasen
setzen die Handler z.B. die Felder des Requests, in denen steht welche
Datei verlangt wird. In den Authentifizierungsphasen wird überprüft, ob
die Berechtigung für einen Zugri auf die gewünschte Datei vorliegt. Ein
Response-Handler wird dem Client eine entsprechende Antwort schicken und
8
|  |
|
| |
|
|