##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Fonction de support pour CGI
##@cooked nocomments
uprovide cgi

function is_cgi() {
    # Tester si on est lancé comme un script CGI
    [ -n "$GATEWAY_INTERFACE" ]
}

function ctype_header() {
    # Générer une en-tête Content-Type: avec la valeur $1[=text/html]
    local ctype="$1"
    [ -n "$ctype" ] || ctype="text/html"
    if [[ "$ctype" == text/* ]]; then
        [[ "$ctype" == *\;* ]] || ctype="$ctype; charset=utf-8"
    fi
    echo "Content-Type: $ctype"
}

function cdisp_header() {
    # Générer une en-tête Content-Disposition: avec le type $2[=attachment] et
    # le nom de fichier $1[=result]
    local filename="${1:-result}" disp="${2:-attachment}"
    echo "Content-Disposition: $disp; filename=$filename"
}

function nocache_header() {
    # Générer des en-têtes qui désactivent la mise en cache du contenu
    echo "Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0"
    echo "Pragma: no-cache"
    echo "Expires: Thu, 01 Jan 1970 00:00:00 GMT"
}

function cgicontent() {
    # Générer les en-têtes nécessaire avant de servir le contenu.
    # $1(=text/html) est le type de contenu. S'il faut servir le contenu avec
    # une disposition "attachment", $2 est le nom de fichier à proposer à
    # l'utilisateur. Si $3 est spécifié, c'est le chemin vers le fichier dont le
    # contenu doit être servi.
    # $4..* sont des en-têtes supplémentaires à rajouter
    local ctype="$1" filename="$2" contentfile="$3"; shift; shift; shift
    local header

    ctype_header "$ctype"
    [ -n "$filename" ] && cdisp_header "$filename"
    for header in "$@"; do
        echo "$header"
    done
    echo ""
    [ -f "$contentfile" ] && cat "$contentfile"
}

function cgicontent_nocache() {
    # Générer les en-têtes nécessaire avant de servir le contenu. Rajouter les
    # entêtes pour désactiver la mise en cache.
    # $1(=text/html) est le type de contenu. S'il faut servir le contenu avec
    # une disposition "attachment", $2 est le nom de fichier à proposer à
    # l'utilisateur. Si $3 est spécifié, c'est le chemin vers le fichier dont le
    # contenu doit être servi.
    # $4..* sont des en-têtes supplémentaires à rajouter
    local ctype="$1" filename="$2" contentfile="$3"; shift; shift; shift
    local header

    ctype_header "$ctype"
    [ -n "$filename" ] && cdisp_header "$filename"
    nocache_header
    for header in "$@"; do
        echo "$header"
    done
    echo ""
    [ -f "$contentfile" ] && cat "$contentfile"
}

function cgierror() {
    # Afficher les en-têtes pour désactiver la mise en cache, puis afficher un
    # message d'erreur puis arrêter le script
    cgicontent_nocache text/plain
    echo "ERROR: $*"
    exit 1
}

function cgiredirect() {
    # Afficher les en-têtes pour rediriger le client vers la page $1 puis
    # arrêter le script
    echo "Status: 302 Found"
    echo "Location: $1"
    echo ""
    exit 0
}
