Skip to content

apache

mod_uploadchk : workspace et devspace – part 2

Bonsoir,

Le temps passe vite, The 2nd Law est sorti, et il faudrait peut-être que j’avance sur ce module avant de pouvoir me pencher sur une autre geekerie.

Pour commencer, j’ai voulu reprendre ce projet C en essayant de le développer dans Xcode. Je suis très satisfait de cet IDE pour Objective-C je me dis qu’il me sera peut-être aussi pratique que VIM pour du code C. Nous verrons bien… (nota ; créer un Workspace simplement au lieu de créer un project)

Je n’arrive pas à mettre la main sur “The Apache Modules Book”, Google sera donc mon ami ce soir. Commençons par remonter un apache de test, je viens de mettre à jour un vieux script d’install d’httpd : http://davixx.fr/pub/20100212_setup_httpd.sh.txt avec un téléchargement sur un miroir officiel plutôt que sur mon petit serveur : http://davixx.fr/pub/20121013_setup_httpd.sh.txt :

#!/bin/bash

httpd_ver="2.2.23"
httpd_dir="httpd-${httpd_ver}"
arch_url="http://apache.crihan.fr/dist/httpd/${httpd_dir}.tar.bz2"

# ca peux servir
function echec() {
	echo "fatal error [$1]";
	exit 127
}

# port a ecouter
proposed_httpd_port="3000"
echo -n "Sur quel port TCP faut-il binder httpd [${proposed_httpd_port}] ? "
read httpd_port
[ -z "${httpd_port}" ] && httpd_port="${proposed_httpd_port}"
if netstat -lpn 2>/dev/null | grep ":${httpd_port}"; then
	echo "le port <${httpd_port}> ne semble pas libre, vous etes sur (si oui : OK) ? "
	read confirm
	[ "${confirm}" != "OK" ] && echec "cancelled"
fi

# directory
cur_dir=`pwd`
proposed_httpd_fdir="${cur_dir}/${httpd_dir}-${httpd_port}"
echo -n "Dans quel repertoire mettre tout ca [${proposed_httpd_fdir}] ? "
read httpd_fdir
[ -z "${httpd_fdir}" ] && httpd_fdir="${proposed_httpd_fdir}"

# check
tfile="/tmp/${httpd_dir}"; [ -e "${tfile}" ] && echec "<${tfile}> exist"
tfile="${httpd_fdir}"; [ -e "${tfile}" ] && echec "<${tfile}> exist"

# go
cd /tmp || echec "cd /tmp"
[ -e "${httpd_dir}.tar.bz2" ] || wget "${arch_url}"
[ -e "${httpd_dir}.tar.bz2" ] || echec "download of <${arch_url}> failed"
tar xjvf ${httpd_dir}.tar.bz2 || echec "untar"
mv "${httpd_dir}" "${httpd_fdir}" || echec "mv"
cd "${httpd_fdir}" || echec "cd <${httpd_fdir}>"
./configure --prefix="${httpd_fdir}/apache2" --enable-so || echec "configure"
make || echec "make"
make install || echec "make install"
cd "${httpd_fdir}/apache2/conf" || echec "cd"
cat httpd.conf | sed 's/#ServerName new.host.name:80/ServerName localhost/' > _httpd_conf_1
mv -vf _httpd_conf_1 httpd.conf || echec "mv"
cat httpd.conf | sed "s/^Listen 80/Listen ${httpd_port}/" > _httpd_conf_1
mv -vf _httpd_conf_1 httpd.conf || echec "mv"
cd "${httpd_fdir}"
"${httpd_fdir}/apache2/bin/apachectl" configtest || echec "configtest"
echo
echo "c'est normalement fini"
echo "\"${httpd_fdir}/apache2/bin/apachectl\" start|stop"
echo

Je constate qu’il fonctionne toujours aussi bien pour http-2.2 ; au passage je constate que httpd-2.4 est disponibles, mais les distributions telle que Gentoo ne le mettent pas encore à disposition comme stable ; je vais donc me contenter de 2.2 pour le moment…

Je reviens dans un prochain post pour une alpha du module et du script de publication sur le httpd de tests ; en attendant jettez un oeil aux URL suivantes :

Nick Kew : "The Apache Modules Book" (ISBN 0-13-240967-4)

mod_uploadchk : Détecter coté serveur le filetype dès le début de l’upload – part 1

Dans le cas où l’on souhaite faire pouvoir uploader de gros fichier, sans avoir un client lourd en java ou flash, il n’y a pas – à ma connaissance – de moyen de faire échouer l’upload aussitôt que le filetype est détecté ; ceci permettrait pourtant de ne pas faire attendre à l’utilisateur la fin de la longue opération pour lui dire :

Le type de fichier que vous tentez d’uploader n’est pas celui attendu

C’est l’occasion pour moi de m’aventurer dans la création d’un nouveau module apache. Je ne sais pas si j’arriverais au (meilleur) résultat voulu, mais quoi qu’il en soit ce sera toujours une expérience d’acquise que j’ai plaisir à partager avec les lecteurs de ce post.

Nick Kew : "The Apache Modules Book" (ISBN 0-13-240967-4)Pour commencer, je me suis penché une bonne heure sur l’excellent livre de Nick Kew : “The Apache Modules Book” (ISBN 0-13-240967-4)

Il à été donc clair qu’il fallait coder un “(input) filter” et non un “handler”. Une fois les premiers octets reçus, il identifiera le “Magic Number” et agira en  fonction de la configuration du module.

J’avais déjà cherché il y a plusieurs mois si un module Apache existant pourrait satisfaire plus ou moins cette problématique, en vain,  mais je suis tout de même allé rejeter un oeil sur https://modules.apache.org/

Je n’ai trouvé aucun module satisfaisant mais, comme je suis assez fainéant, je suis content d’avoir trouvé un module qui pourrait me servir de base structurelle, et de modèle pour les opérations (hooks/filters, buckets/brigade) : mod_upload, développé – par coïncidence – par Nick Kew.

Pour cette première étape, je voulais poser les bases, nous avons donc la piste de travail, un module de référence, et je clôture sur le code du futur module dans sa version la plus light possible, ainsi que le Makefile associé :

#include <httpd.h>
#include <apr_strings.h>
#include <util_filter.h>
#include <http_config.h>
#include <http_log.h>

module AP_MODULE_DECLARE_DATA uploadchk_module ;

module AP_MODULE_DECLARE_DATA uploadchk_module = {
	STANDARD20_MODULE_STUFF,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL
} ;
all: mod_uploadchk install
mod_uploadchk:
        apxs2 -n uploadchk -c mod_uploadchk.c
install:
        apxs2 -n uploadchk -i -a mod_uploadchk.la
        /etc/init.d/apache2 restart
clean:
        rm -rf .libs
        rm -f mod_uploadchk.la mod_uploadchk.lo mod_uploadchk.o mod_uploadchk.slo

La suite dans un prochain post…