nutools/lib/ulib/support/cgiparams.py

108 lines
4.4 KiB
Python
Raw Normal View History

#!/usr/bin/env python
# -*- coding: utf-8 mode: python -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
u"""Ce script est prévu pour être utilisé dans un script CGI.
Il permet de lister les paramètres du formulaire et d'y accéder depuis un script
bash. Le tableau QVARS est initialisé avec la liste des variables correspondant
aux paramètres pour lesquels une valeur est définie.
Les arguments de ce script doivent être de la forme NAME[=DEFAULT]. Si le
paramètres était fourni dans la requête, il est affiché, sous forme de scalaire
ou de tableau. S'il n'était pas fourni, la valeur par défaut est affichée.
"""
import re, cgi, urllib
RE_NAME_VALUE = re.compile(r'([a-zA-Z0-9_-]+)(?:=(.*))?$')
def quote(value, q=False):
if value or q:
value = "'%s'" % value.replace("'", "'\\''")
value = re.sub(r"(?<!\\)''", "", value)
return value
else: return ""
def print_scalar(name, value):
print "%s=%s" % (name, quote(value))
def print_array(name, values):
print "%s=(" % name,
for value in values:
print quote(value, True),
print ")"
RE_COMMA = re.compile(',')
def lfix(values):
if values is None: return None
fvalues = []
for parts in values:
parts = RE_COMMA.split(parts)
fvalues.extend(parts)
return fvalues
def build_query_string(form, includes=None, excludes=None, prefix=None):
includes = lfix(includes)
if includes is None: names = form.keys()
else: names = includes[:]
excludes = lfix(excludes)
if excludes is not None:
for name in excludes:
if name in names: names.remove(name)
params = []
for name in names:
values = form.getlist(name)
for value in values:
params.append((name, value))
query_string = urllib.urlencode(params)
if prefix:
if query_string != "": query_string = "%s&%s" % (prefix, query_string)
elif prefix != "": query_string = prefix
if query_string:
query_string = "?%s" % query_string
return query_string
def run_cgiparams():
from optparse import OptionParser
OP = OptionParser(usage=u"\n\t%prog [options] params...", description=__doc__)
OP.add_option('--qvars', dest="qvars", default="QVARS",
help=u"Spécifier le nom du tableau qui contiendra la liste des variables correspondant aux paramètres pour lesquels une valeur est définie. Par défaut, utiliser QVARS")
OP.add_option('-q', '--query-string', action='store_true', dest='print_qs',
help=u"Reconstruire et afficher la valeur de QUERY_STRING en fonction des paramètres fournis dans la requête. Les options -i et -x permettent de sélectionner les paramètres qui y sont inclus.")
OP.add_option('-i', '--include', dest='includes', action='append',
help=u"Spécifier un paramètre à inclure pour construire QUERY_STRING. Il est possible de spécifier plusieurs paramètres en les séparant par des virgules.")
OP.add_option('-x', '--exclude', dest='excludes', action='append',
help=u"Spécifier un paramètre à exclure pour construire QUERY_STRING. Il est possible de spécifier plusieurs paramètres en les séparant par des virgules.")
OP.add_option('-p', '--prefix', dest="prefix",
help=u"Ajouter les paramètres supplémentaires spécifiés à QUERY_STRING.")
o, args = OP.parse_args()
form = cgi.FieldStorage(keep_blank_values=True)
qvars = []
if args:
for nv in args:
mo = RE_NAME_VALUE.match(nv)
if mo is None: continue
fname, defvalue = mo.group(1), mo.group(2)
if defvalue is None: defvalue = ''
vname = fname.replace('-', '_')
if vname not in qvars: qvars.append(vname)
values = form.getlist(fname)
if len(values) == 0: print_scalar(vname, defvalue)
elif len(values) == 1: print_scalar(vname, values[0])
else: print_array(vname, values)
else:
for fname in form.keys():
vname = fname.replace('-', '_')
qvars.append(vname)
values = form.getlist(fname)
if len(values) == 1: print_scalar(vname, values[0])
else: print_array(vname, values)
print_array(o.qvars, qvars)
if o.print_qs:
qs = build_query_string(form, o.includes, o.excludes, o.prefix)
print_scalar('QUERY_STRING', qs)
if __name__ == '__main__':
run_cgiparams()