Nei titoli e nei testi troverete qualche rimando cinematografico (ebbene si, sono un cinefilo). Se non vi interessano fate finta di non vederli, già che non sono fondamentali per la comprensione dei post...

Di questo blog ho mandato avanti, fino a Settembre 2018, anche una versione in Spagnolo. Potete trovarla su El arte de la programación en C. Buona lettura.

domenica 18 novembre 2012

L'ultimo degli Apache II - La vendetta
come scrivere un modulo Apache in C - pt2

Ok, lo ammetto, il titolo è preoccupante, già che somiglia moltissimo a questo, ma, essendo la seconda parte di un discorso aperto, non mi è venuto in mente nulla di meglio. Forse sto invecchiando. E se in uno dei prossimi post mi auto-plagerò anche nel testo (oltre che nel titolo) segnalatemelo, così chiudo il blog prima che sia troppo tardi.

Comunque, come promesso, oggi vi spiegherò come scrivere, installare e provare un modulo Apache minimale. Così se qualcuno si appassiona all'argomento potrà, con questa base (funzionante!), divertirsi a scriverne di più complessi, alla faccia di quelli che "Il C non serve nello sviluppo Web".

Il nostro modulo basico lo chiameremo, ad esempio myapmod. Cominciamo con il codice, ovviamente:
#include <httpd.h>
#include <http_protocol.h>
#include <http_config.h>

// handler del modulo
static int myapmodHandler(
    request_rec *reqrec)
{
    // test handler
    if (! reqrec->handler || strcmp(reqrec->handler, "myapmod"))
        return DECLINED;

    // test metodo http
    if (reqrec->method_number != M_GET)
        return HTTP_METHOD_NOT_ALLOWED;

    // html output
    ap_set_content_type(reqrec, "text/html;charset=ascii");
    ap_rputs("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n", 
                        reqrec);
    ap_rputs("<html>",  reqrec);
    ap_rputs("<head>",  reqrec);
    ap_rputs("<title>Modulo Apache Elementare</title>", reqrec);
    ap_rputs("</head>", reqrec);
    ap_rputs("<body>",  reqrec);
    ap_rputs("<h1>myapmod: il mio Modulo Apache elementare</h1>", 
                        reqrec);
    ap_rputs("</body>", reqrec);
    ap_rputs("</html>", reqrec);

    // esco con OK
    return OK;
}

// register hooks del modulo
static void myapmodHooks(
    apr_pool_t *pool)
{
    // set hook handler
    ap_hook_handler(myapmodHandler, NULL, NULL, APR_HOOK_MIDDLE);
}

// struttura globale del modulo
module AP_MODULE_DECLARE_DATA myapmod_module = {
    STANDARD20_MODULE_STUFF,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    myapmodHooks
};
Semplice no ? E ho inserito gli opportuni commenti nel codice (un po' stringati, devo ammetterlo) così non devo neanche spiegarvi come funziona. E, come noterete quando lo userete la prima volta, il codice HTML ivi contenuto viene correttamente visualizzato dal browser (ohhhh... miracolo).

Ora passiamo alla compilazione e installazione. Per comodità e gusti personali vi propongo una guida per Linux, ma vi assicuro che il modulo basico si può realizzare (se proprio volete soffrire) anche sotto Windows.

Il requisito preliminare è, ovviamente, aver installato Apache sul sistema. Cercate, con il nostro amico Google, una delle milioni di guide per trasformare il proprio pc in un server LAMP (o WAMP) (non vi descrivo io la procedura per non dilungarmi troppo, ma, vi garantisco, è abbastanza semplice). Una volta installato il server Apache assicuratevi che il vostro sistema sia anche preparato per compilare i moduli Apache: deve essere disponibile il pacchetto apache2-prefork-dev, quindi, per accertarvene, eseguite:
dpkg -l | grep apache2
E, se nella lista di pacchetti che vi verrà mostrata non c'è il pacchetto suddetto, installatelo con:
sudo apt-get install apache2-prefork-dev
E, adesso possiamo, finalmente, compilare e installare con:
sudo apxs2 -c mod_myapmod.c 
sudo apxs2 -i mod_myapmod.la
Poi, dobbiamo creare ed editare due nuovi file nella directory /etc/apache2/mods-available. Creiamo/apriamo il primo con:
sudo gedit /etc/apache2/mods-available/myapmod.load
e gli scriviamo dentro:
LoadModule myapmod_module /usr/lib/apache2/modules/mod_myapmod.so
Quindi creiamo/apriamo il secondo con:
sudo gedit /etc/apache2/mods-available/myapmod.conf
e gli scriviamo dentro:
<Location /myapmod>
SetHandler myapmod
</Location>
A questo punto non ci resta che abilitare il nostro nuovo modulo e far ripartire il Server Apache (che fará partite tutti i moduli abilitati, compreso il nostro myapmod):
sudo a2enmod myapmod
sudo /etc/init.d/apache2 restart
Se tutto é stato fatto correttamente, navigando con un browser alla url http://localhost/myapmod verrà visualizzato il codice HTML inserito nel nostro modulo. E se non funziona riprovate tutti i passi cominciando  dal primo, verificando che non vi sia sfuggito qualche errore segnalato dal sistema. Buona fortuna... (io, ovviamente, ho provato tutta la procedura prima di pubblicare il post, e sono sicuro che funziona).

Ovviamente con questo post non pretendo di scoprire l'acqua calda, visto che, se cercate su Internet come costruire un modulo Apache minimale, scoprirete che moltissimi altri hanno pubblicato ben prima di me guide analoghe. Ma volete mettere con leggere la stessa cosa scritta dal vostro C-blogger favorito?

Ciao e al prossimo post.

Nessun commento:

Posta un commento