venerdì, agosto 30, 2013

PHP - Intestazioni HTTP


Questo post fa parte di una serie preparata qualche anno fa per delle lezioni su PHP.

Introduzione

Spesso capita di dover indicare esplicitamente quali intestazioni HTTP devono essere inviate prima di servire un determinato contenuto.
La funzione header permette di farlo, ma è bene incapsularla in qualche classe che gestisca la questione in maniera strutturata.
Come esempio di partenza, consideriamo il caso in cui si voglia servire un file contenente il logo della nostra organizzazione:

<?php
header('Content-Type: image/png');
header('Content-Length: 5727');
readfile('logo.png');

Un errore comune è di avere qualche carattere prima dell'inizio del codice PHP, che porta al seguente esito:

Warning: Cannot modify header information - headers already sent by (output started at ...)

File not found

Se si vuole gestire un errore di tipo 404 (file not found), si può inviare un'intestazione specifica:

<?php
header('HTTP/1.0 404 Not Found');
header('Content-Type: text/html; charset=utf-8');
?>
<h1>Error 404: File not found</h1>

Esercizio

Predisporre uno script image.php che mostri una determinata immagine presente nel filesystem del server web.
In una prima versione, lo script verrà invocato con un URL simile al seguente:

http://../image.php?file=logo

Lo script dovrà verificare se il file logo.png esiste o meno in una determinata directory e servirlo se lo trova ed è leggibile (con la corretta impostazione della dimensione del file); altrimenti, dovrà restituire una pagina 404.

Predisporre una pagina web picture.php, richiamabile con un URL simile al seguente,

http://../picture.php?file=logo

che produca codice HTML valido (usare validator.w3.org per controllare) per mostrare l'immagine, sfruttando lo script precedente:

...
<html>
<head><title>...</title></head>
<body>
<img src="image.php?file=logo" alt="..." width="..." height="..." />
</body>
</html>

Il testo da riportare nell'attributo alt corrisponderà al nome del file (senza l'estensione), mentre larghezza e altezza dipenderanno dalle dimensioni effettive dell'immagine.

Nel caso di file non presente, deve essere restituita una pagina con l'indicazione che il file non esiste.

Definire una classe per l'immagine (quali saranno le funzioni membro?), una per la WebResponse, con funzioni tipo setHttpHeader(), una per la WebRequest, con funzioni tipo getParameter().

Varianti ed integrazioni

A partire dal codice precedente:
  1. fare in modo che image.php restituisca una pagina 404 quando il referer non è picture.php;
  2. gestire un URL più SEO, come ad esempio http://.../picture.php/file/logo.png;
  3. costruire i casi di test per la classe che gestisce l'immagine;
  4. far sì che, in qualche caso particolare (ad esempio, se la richiesta avviene nei secondi dispari) l'immagine venga restituita leggermente alterata (ad esempio, con un bordo rosso di due pixel)

Nessun commento:

Posta un commento