#include <httpd.h>
#include <http_protocol.h>
#include <http_config.h>

static int showrequest_handler(request_rec *r)
{

        if (!r->handler || strcmp(r->handler,"showrequest")) {
                return DECLINED;
        }
        if (r->method_number != M_GET) {
                return HTTP_METHOD_NOT_ALLOWED;
        }
/* Lo anterior ya lo explicamos en el anterior modulo */

        ap_set_content_type(r,"text/html");
        ap_rputs("<html><body><br>", r);
/* Vamos a ir mostrando diferentes datos de la estructura REQUEST_REC */

        ap_rputs("Variables utiles de la estructura REQUEST_REC<br>", r);
        ap_rprintf(r, "La Peticion realizada: %s<br>", r->the_request);
        ap_rprintf(r, "Nombre de Fichero: %s<br>", r->filename);
        ap_rprintf(r, "Nombre del Host que se llama: %s<br>", r->hostname);
        ap_rprintf(r, "La version del protocolo HTTP: %s<br>", r->protocol);
        ap_rprintf(r, "La URI de la peticion: %s<br>", r->uri);
        ap_rprintf(r, "El Content-length: %i<br>",(int)r->clength);
        ap_rprintf(r, "Los Argumentos: %s<br><br>",r->args);

/* Quereis mas? Ademas, podemos acceder a la informacion del VIRTUALHOST que  */
/* esta procesando esa peticion */
        ap_rputs("Variables utiles de la estructura SERVER_REC<br>", r);
        ap_rprintf(r, "El email del administrador: %s<br>", r->server->server_admin);
        ap_rprintf(r, "El nombre de ese virtualhost: %s<br>", r->server->server_hostname);
        ap_rprintf(r, "El Puerto: %i<br>", (int)r->server->port);
        ap_rprintf(r, "El nombre del fichero de Log de errores: %s<br>", (char *)r->server->error_fname);
        ap_rprintf(r, "¿Es un servidor Virtual?: %i<br>", r->server->is_virtual);
        ap_rprintf(r, "¿Estamos usando KeepAlive?: %i<br><br>", r->server->keep_alive);

/* Mas aun, podemos acceder a los datos de la CONEXION, en CONN_REC */
/* Se puede acceder al nombre del host del usuario, pero como en principio *
*  TENEMOS q tener desactivado esa opcion por rendimiento...no es util */

        ap_rputs("Variables utiles de la estructura CONN_REC<br>", r);
        ap_rprintf(r, "La IP del usuario: %s<br>", r->connection->remote_ip);
        ap_rprintf(r, "La IP del servidor local: %s<br>", r->connection->local_ip);

        ap_rputs("</body></html>", r);
/* Y terminamos enviando un OK */
        return OK;
}

static void showrequest_hook(apr_pool_t *pool)
{
        ap_hook_handler(showrequest_handler, NULL,NULL, APR_HOOK_MIDDLE);
}

module AP_MODULE_DECLARE_DATA showrequest_module = {
        STANDARD20_MODULE_STUFF,
        NULL,
        NULL,
        NULL,
   NULL,
   NULL,
   showrequest_hook
};

