Intégration de la branche cgilsxml
This commit is contained in:
commit
d57839dc3c
|
@ -6,7 +6,7 @@ u"""Ce script est prévu pour être utilisé dans un script CGI.
|
|||
Il permet de lister le contenu d'un répertoire au format XML, et de télécharger les fichiers trouvés.
|
||||
"""
|
||||
|
||||
import os, sys, re, shutil, mimetypes, urlparse, urllib
|
||||
import os, sys, re, shutil, mimetypes, urlparse, urllib, fnmatch, glob
|
||||
from os import path
|
||||
from time import time, localtime
|
||||
from types import UnicodeType, StringTypes
|
||||
|
@ -15,7 +15,8 @@ import xml.etree.ElementTree as ET
|
|||
# _u() et datef() sont des fonctions de pyulib, recopiées ici pour ne pas devoir
|
||||
# dépendre d'une librairie extérieure
|
||||
def _u(u):
|
||||
if type(u) not in StringTypes: u = unicode(str(u), 'utf-8', 'strict')
|
||||
if u is None: return None
|
||||
elif type(u) not in StringTypes: u = unicode(str(u), 'utf-8', 'strict')
|
||||
elif type(u) is not UnicodeType: u = unicode(u, 'utf-8', 'strict')
|
||||
return u
|
||||
DATEF_MAP = {'%Y': '%(y)04i', '%m': '%(m)02i', '%d': '%(d)02i', '%H': '%(H)02i', '%M': '%(M)02i', '%S': '%(S)02i'}
|
||||
|
@ -34,13 +35,26 @@ RE_SORT_FIELD_TYPE = re.compile(r'([_a-zA-Z][-_a-zA-Z0-9]*)(?::([aAdDcCnN]+))?')
|
|||
|
||||
class Filter:
|
||||
re_spec = None
|
||||
glob = None
|
||||
caret_anchor = None
|
||||
deep_scan = None
|
||||
re_allows = None
|
||||
ex_vars = None
|
||||
ex_group = None
|
||||
ex_break_on = None
|
||||
force_disposition = None
|
||||
force_type = None
|
||||
force_charset = None
|
||||
|
||||
def __init__(self, re_spec):
|
||||
self.re_spec = re.compile(re_spec)
|
||||
def __init__(self, spec=None, glob=None):
|
||||
if spec is not None:
|
||||
self.re_spec = re.compile(spec)
|
||||
self.caret_anchor = spec.startswith('^')
|
||||
self.deep_scan = '/' in spec
|
||||
elif glob is not None:
|
||||
self.glob = glob
|
||||
self.deep_scan = '/' in glob
|
||||
else: raise ValueError("either spec or glob must be specified")
|
||||
self.re_allows = []
|
||||
self.ex_vars = []
|
||||
self.ex_group = None
|
||||
|
@ -62,14 +76,37 @@ class Filter:
|
|||
self.ex_break_on = ex_break_on
|
||||
|
||||
def __repr__(self):
|
||||
return 'Filter<%s,%s,%s,%s,%s>' % \
|
||||
(self.re_spec, repr(self.re_allows),
|
||||
return 'Filter<%s||%s,%s,%s,%s,%s>' % \
|
||||
(self.re_spec, self.glob, repr(self.re_allows),
|
||||
repr(self.ex_vars),
|
||||
self.ex_group, self.ex_break_on,
|
||||
)
|
||||
|
||||
def match_fill(self, file):
|
||||
mo = self.re_spec.match(file.name)
|
||||
def match_fill(self, file, basedir=None):
|
||||
if self.glob:
|
||||
if self.deep_scan:
|
||||
# la correspondance a déjà été faite avant avec glob.glob(). on
|
||||
# se contente d'initialiser l'objet
|
||||
pass
|
||||
elif not fnmatch.fnmatch(file.name, self.glob):
|
||||
return None
|
||||
file.group = None
|
||||
file.break_on = None
|
||||
if self.force_disposition: file.content_disposition = self.force_disposition
|
||||
if self.force_type: file.content_type = self.force_type
|
||||
if self.force_charset: file.content_charset = self.force_charset
|
||||
return True
|
||||
|
||||
if self.deep_scan:
|
||||
pf = file.pf
|
||||
if not self.caret_anchor:
|
||||
blen = len(basedir)
|
||||
if pf[:blen] != basedir: return None
|
||||
pf = pf[blen:]
|
||||
if not pf.startswith('/'): return None
|
||||
pf = pf[1:]
|
||||
mo = self.re_spec.match(pf)
|
||||
else: mo = self.re_spec.match(file.name)
|
||||
if mo is None: return None
|
||||
for name, expr in self.ex_vars:
|
||||
value = mo.expand(expr)
|
||||
|
@ -87,6 +124,9 @@ class Filter:
|
|||
else:
|
||||
break_on = None
|
||||
file.break_on = break_on
|
||||
if self.force_disposition: file.content_disposition = self.force_disposition
|
||||
if self.force_type: file.content_type = self.force_type
|
||||
if self.force_charset: file.content_charset = self.force_charset
|
||||
return True
|
||||
|
||||
def match_allow(self, file):
|
||||
|
@ -101,7 +141,11 @@ class File:
|
|||
vars = None
|
||||
dontlist = None
|
||||
|
||||
def __init__(self, dir, name, dontlist=False):
|
||||
def __init__(self, dir=None, name=None, pf=None, dontlist=False):
|
||||
if pf is None:
|
||||
if dir is None or name is None: raise ValueError("either dir/name or pf must be specified")
|
||||
pf = path.join(dir, name)
|
||||
dir, name = path.split(pf) # il est possible que name soit de la forme subdir/name
|
||||
dir = path.abspath(dir)
|
||||
pf = path.join(dir, name)
|
||||
self.__dict__['pf'] = pf
|
||||
|
@ -136,19 +180,49 @@ class File:
|
|||
def __repr__(self): return 'File<%s>' % (self.pf)
|
||||
|
||||
def find_files(basedir, filters):
|
||||
basedir = path.abspath(basedir)
|
||||
files = []
|
||||
for name in os.listdir(basedir):
|
||||
file = File(basedir, name)
|
||||
if not file.isfile(): continue
|
||||
matched = False
|
||||
allowed = False
|
||||
for filter in filters:
|
||||
matched = filter.match_fill(file) or matched
|
||||
allowed = filter.match_allow(file) or allowed
|
||||
if matched: pass
|
||||
elif allowed: file.dontlist = True
|
||||
else: continue
|
||||
files.append(file)
|
||||
deep_filters = [filter for filter in filters if filter.re_spec is not None and filter.deep_scan]
|
||||
if deep_filters:
|
||||
for dirpath, dirnames, filenames in os.walk(basedir):
|
||||
for filename in filenames:
|
||||
file = File(dirpath, filename)
|
||||
matched = False
|
||||
allowed = False
|
||||
for filter in deep_filters:
|
||||
matched = filter.match_fill(file, basedir) or matched
|
||||
allowed = filter.match_allow(file) or allowed
|
||||
if matched: pass
|
||||
elif allowed: file.dontlist = True
|
||||
else: continue
|
||||
files.append(file)
|
||||
simple_filters = [filter for filter in filters if filter.re_spec is not None and not filter.deep_scan]
|
||||
if simple_filters:
|
||||
for name in os.listdir(basedir):
|
||||
file = File(basedir, name)
|
||||
if not file.isfile(): continue
|
||||
matched = False
|
||||
allowed = False
|
||||
for filter in simple_filters:
|
||||
matched = filter.match_fill(file) or matched
|
||||
allowed = filter.match_allow(file) or allowed
|
||||
if matched: pass
|
||||
elif allowed: file.dontlist = True
|
||||
else: continue
|
||||
files.append(file)
|
||||
glob_filters = [filter for filter in filters if filter.glob is not None]
|
||||
if glob_filters:
|
||||
for filter in glob_filters:
|
||||
if filter.deep_scan:
|
||||
candidates = [File(pf=pf) for pf in glob.glob(path.join(basedir, filter.glob))]
|
||||
else:
|
||||
candidates = [File(basedir, name) for name in os.listdir(basedir)]
|
||||
for file in candidates:
|
||||
if not file.isfile(): continue
|
||||
elif filter.match_fill(file): pass
|
||||
elif filter.match_allow(file): file.dontlist = True
|
||||
else: continue
|
||||
files.append(file)
|
||||
return files
|
||||
|
||||
def build_sortfunc(sortby):
|
||||
|
@ -255,12 +329,16 @@ def print_files(files, fgroups=None, select_group=None, script_name=None, xslt=N
|
|||
orig_query_string = query_string
|
||||
if orig_query_string is not None:
|
||||
query_string = orig_query_string
|
||||
params = urlparse.parse_qsl(query_string, keep_blank_values=True)
|
||||
query_string = _u(query_string)
|
||||
|
||||
fquery_string = filter_query_string(orig_query_string, includes, excludes, prefix)
|
||||
fparams = urlparse.parse_qsl(fquery_string, keep_blank_values=True)
|
||||
fquery_string = _u(fquery_string)
|
||||
params = []
|
||||
if query_string is not None:
|
||||
params = urlparse.parse_qsl(query_string, keep_blank_values=True)
|
||||
query_string = _u(query_string)
|
||||
fquery_string = orig_query_string
|
||||
fparams = []
|
||||
if fquery_string is not None:
|
||||
fquery_string = filter_query_string(fquery_string, includes, excludes, prefix)
|
||||
fparams = urlparse.parse_qsl(fquery_string, keep_blank_values=True)
|
||||
fquery_string = _u(fquery_string)
|
||||
|
||||
if includes or excludes or prefix:
|
||||
xorig = ET.SubElement(xenv, "orig")
|
||||
|
@ -295,7 +373,8 @@ def print_files(files, fgroups=None, select_group=None, script_name=None, xslt=N
|
|||
for file in files:
|
||||
if file.dontlist: continue
|
||||
current_classifier = (file.group, file.break_on)
|
||||
file.break_here = first or current_classifier != last_classifier
|
||||
if first or current_classifier != last_classifier:
|
||||
file.break_here = None
|
||||
last_classifier = current_classifier
|
||||
first = False
|
||||
xfile = ET.SubElement(xfiles, "file")
|
||||
|
@ -309,10 +388,18 @@ def print_files(files, fgroups=None, select_group=None, script_name=None, xslt=N
|
|||
ET.ElementTree(xresult).write(sys.stdout, "utf-8")
|
||||
|
||||
def run_cgilsxml():
|
||||
class ContentInfos:
|
||||
disposition = 'attachment'
|
||||
type = None
|
||||
charset = 'utf-8'
|
||||
default_content = ContentInfos()
|
||||
default_filter = Filter(r'(.*)')
|
||||
def add_spec(option, opt, value, parser, *args, **kw):
|
||||
if env['filter'] is not None: env['filters'].append(env['filter'])
|
||||
env['filter'] = Filter(value)
|
||||
env['filter'] = Filter(spec=value)
|
||||
def add_glob(option, opt, value, parser, *args, **kw):
|
||||
if env['filter'] is not None: env['filters'].append(env['filter'])
|
||||
env['filter'] = Filter(glob=value)
|
||||
def allow_spec(option, opt, value, parser, *args, **kw):
|
||||
if env['filter'] is None: env['filter'] = default_filter
|
||||
env['filter'].allow_spec(value)
|
||||
|
@ -325,56 +412,108 @@ def run_cgilsxml():
|
|||
def set_break_on(option, opt_str, value, parser, *args, **kw):
|
||||
if env['filter'] is None: env['filter'] = default_filter
|
||||
env['filter'].set_break_on(value)
|
||||
def set_content_disposition(option, opt_str, value, parser, *args, **kw):
|
||||
if value in ('attachment', 'inline'): pass
|
||||
elif value == 'none': value = None
|
||||
else:
|
||||
if cgi_mode:
|
||||
if not cgi_cache: cgi_nocache()
|
||||
print "Content-Type: text/plain; charset=utf-8"
|
||||
print
|
||||
print "%s: Disposition de contenu invalide. Ce soit être attachment, inline ou none" % cgi_content_disposition
|
||||
sys.exit(1)
|
||||
if env['filter'] is None: default_content.disposition = value
|
||||
else: env['filter'].force_disposition = value
|
||||
def set_content_type(option, opt_str, value, parser, *args, **kw):
|
||||
if env['filter'] is None: default_content.type = value
|
||||
else: env['filter'].force_type = value
|
||||
def set_content_charset(option, opt_str, value, parser, *args, **kw):
|
||||
if env['filter'] is None: default_content.charset = value
|
||||
else: env['filter'].force_charset = value
|
||||
|
||||
from optparse import OptionParser
|
||||
OP = OptionParser(usage=u"\n\t%prog [options] /path/to/dir", description=__doc__)
|
||||
OP.add_option('-e', '--spec', dest='spec', action='callback', callback=add_spec, type='string',
|
||||
help=u"Spécifier l'expression régulière permettant de sélectionner les fichiers à lister. L'expression régulière peut définir des groupes qui sont utilisées pour l'extraction des variables."
|
||||
help=u"Spécifier l'expression régulière permettant de sélectionner les fichiers à lister. "
|
||||
+ u"La correspondance est tentée sur le nom du fichier avec la fonction match(). "
|
||||
+ u"Penser à inclure l'ancre $ pour matcher le nom entier du fichier. "
|
||||
+ u"Si l'expression régulière contient un caractère '/', la correspondance peut se faire sur le chemin complet du fichier. "
|
||||
+ u"Pour simplifier, par défaut seule la partie située après le chemin de base est matchée, sauf si l'expression commence par '^', auquel cas la correspondance se fait sur le chemin complet du fichier. "
|
||||
+ u"L'expression régulière peut définir des groupes qui sont utilisées pour l'extraction des variables."
|
||||
+ u"\n Il est possible de spécifier cette option plusieurs fois."
|
||||
+ u"\n Note: TOUTES les expressions régulières sont testées par rapport au nom du fichier, et pour celles qui correspondent, les variables correspondantes sont définies. Il faut donc ordonner les expressions régulières de la plus générale à la plus spécifique, contrairement à ce qui se fait d'habitude.")
|
||||
+ u"\n Note: TOUTES les expressions régulières sont testées par rapport au nom du fichier, et pour celles qui correspondent, les variables correspondantes sont définies. "
|
||||
+ u"Il faut donc ordonner les expressions régulières de la plus générale à la plus spécifique, contrairement à ce qui se fait d'habitude.")
|
||||
OP.add_option('--glob', dest='pattern', action='callback', callback=add_glob, type='string',
|
||||
help=u"Comme --spec, mais en utilisant les patterns du shell *, ?, [seq], [!seq]. "
|
||||
+ u"Si l'expression contient un caractère '/', la correspondance se fait sur le chemin complet du fichier avec le module glob. "
|
||||
+ u"Cette précision est importante notamment pour la recherche de fichiers dont le nom commence par un point. "
|
||||
+ u"Si l'expression ne contient pas le caractère '/', la correspondance est faite uniquement sur le nom de fichier avec le module fnmatch, et le point n'a plus de signification particulière. "
|
||||
+ u"Cette méthode de correspondance ne permet pas de définir des groupes et ne permet donc pas d'extraire des variables.")
|
||||
OP.add_option('-E', '--allow-spec', dest='spec', action='callback', callback=allow_spec, type='string',
|
||||
help=u"Ajouter une spécification de fichier qui peut être demandé avec --cgi-path-info. Ces fichiers ne sont pas inclus dans la liste.")
|
||||
help=u"Ajouter une spécification de fichier qui peut être demandé avec --cgi-path-info. "
|
||||
+ u"Ces fichiers ne sont pas inclus dans la liste.")
|
||||
OP.add_option('-v', '--var', dest='var', action='callback', callback=add_var, type='string',
|
||||
help=u"Définir la variable NAME à la valeur de l'expression VAR_EXPR. Dans cette expression, il est possible d'utiliser des expressions de la forme %(var)s pour inclure des variables déjà définies, ou \\N et \\g<NAME> pour inclure respectivement le groupe numéro N et le groupe nommé NAME de l'expression régulière --spec."
|
||||
+ u"\n Cette option peut être spécifiée plusieurs fois. Elle s'applique à l'expression régulière définie par la dernière option --spec")
|
||||
help=u"Définir la variable NAME à la valeur de l'expression VAR_EXPR. "
|
||||
+ u"Dans cette expression, il est possible d'utiliser des expressions de la forme %(var)s pour inclure des variables déjà définies, ou \\N et \\g<NAME> pour inclure respectivement le groupe numéro N et le groupe nommé NAME de l'expression régulière --spec."
|
||||
+ u"\n Cette option peut être spécifiée plusieurs fois. "
|
||||
+ u"Elle s'applique à l'expression régulière définie par la dernière option --spec")
|
||||
OP.add_option('-g', '--group', dest='group', action='callback', callback=set_group, type='string',
|
||||
help=u"Spécifier l'expression qui permet de construire des ensembles de fichiers sur la base des groupes définis dans l'expression régulière de l'option --spec. Dans cette expression, il est possible d'utiliser des expressions de la forme %(var)s pour inclure des variables déjà définies, ou \\N ou \\g<NAME> pour inclure respectivement le groupe numéro N et le groupe nommé NAME de l'expression régulière --spec."
|
||||
help=u"Spécifier l'expression qui permet de construire des ensembles de fichiers sur la base des groupes définis dans l'expression régulière de l'option --spec. "
|
||||
+ u"Dans cette expression, il est possible d'utiliser des expressions de la forme %(var)s pour inclure des variables déjà définies, ou \\N ou \\g<NAME> pour inclure respectivement le groupe numéro N et le groupe nommé NAME de l'expression régulière --spec."
|
||||
+ u"\n Cette option ne peut être spécifiée qu'une seule fois par option --spec")
|
||||
OP.add_option('-b', '--break-on', dest='break_on', action='callback', callback=set_break_on, type='string',
|
||||
help=u"Spécifier une expression qui permet de partitionner la list des fichiers au sein d'un même groupe. Dans cette expression, il est possible d'utiliser des expressions de la forme %(var)s pour inclure des variables déjà définies, ou \\N ou \\g<NAME> pour inclure respectivement le groupe numéro N et le groupe nommé NAME de l'expression régulière --spec."
|
||||
help=u"Spécifier une expression qui permet de partitionner la list des fichiers au sein d'un même groupe. "
|
||||
+ u"Dans cette expression, il est possible d'utiliser des expressions de la forme %(var)s pour inclure des variables déjà définies, ou \\N ou \\g<NAME> pour inclure respectivement le groupe numéro N et le groupe nommé NAME de l'expression régulière --spec."
|
||||
+ u"\n Bien que ce ne soit pas une obligation, il est logique de trier la liste sur cette expression pour que les groupes de fichiers soient ensembles dans la liste."
|
||||
+ u"\n Cette option ne peut être spécifiée qu'une seule fois par option --spec")
|
||||
OP.add_option('-s', '--sort', dest='sortby',
|
||||
help=u"Spécifier le champ sur lequel trier ainsi que le type de tri à utiliser. SORT_EXPR est de la forme FIELD:TYPE où FIELD est le nom du champ et TYPE est le type de tri: A, D, C et/ou N pour (A)scendant, (D)escendant, (C)haine, (N)numérique. Si un champ est spécifié mais que le type de tri ne l'est pas, la valeur par défaut est AC. Si cette option n'est pas spécifiée, le tri par défaut est 'mtime:DN'."
|
||||
help=u"Spécifier le champ sur lequel trier ainsi que le type de tri à utiliser. "
|
||||
+ u"SORT_EXPR est de la forme FIELD:TYPE où FIELD est le nom du champ et TYPE est le type de tri: A, D, C et/ou N pour (A)scendant, (D)escendant, (C)haine, (N)numérique. "
|
||||
+ u"Si un champ est spécifié mais que le type de tri ne l'est pas, la valeur par défaut est AC. "
|
||||
+ u"Si cette option n'est pas spécifiée, le tri par défaut est 'mtime:DN'."
|
||||
+ u"\n Il est possible de spécifier plusieurs champs pour le tri en les séparant par des virgules.")
|
||||
OP.add_option('--cgi', dest='cgi_mode', action='store_true',
|
||||
help=u"Activer le mode CGI. Ce mode est automatiquement activé si la variable d'environnement REQUEST_METHOD existe.")
|
||||
help=u"Activer le mode CGI. "
|
||||
+ u"Ce mode est automatiquement activé si la variable d'environnement REQUEST_METHOD existe.")
|
||||
OP.add_option('--cgi-allow-cache', dest='cgi_allow_cache', action='store_true',
|
||||
help=u"En mode CGI, ne pas rajouter les en-tête désactivant la mise en cache du résultat.")
|
||||
OP.add_option('--cgi-content-type', '--cgict', dest='cgi_content_type',
|
||||
help=u"En mode CGI, forcer le type de contenu avec lequel servir le fichier.")
|
||||
OP.add_option('--cgi-content-charset', '--cgicc', dest='cgi_content_charset',
|
||||
help=u"En mode CGI, forcer l'encoding de contenu avec lequel servir le fichier.")
|
||||
OP.add_option('--cgi-content-disposition', '--cgicd', dest='cgi_content_disposition',
|
||||
help=u"En mode CGI, forcer la disposition de contenu avec lequel servir le fichier. Les valeurs valides sont attachment (par défaut), inline, none")
|
||||
OP.add_option('--cgi-content-disposition', '--cgicd', dest='content-disposition', action='callback', callback=set_content_disposition, type='string',
|
||||
help=u"En mode CGI, forcer la disposition de contenu avec lequel servir le fichier. "
|
||||
+ u"Les valeurs valides sont attachment (par défaut), inline, none. "
|
||||
+ u"Si cette option est spécifiée après une option --spec ou --glob, elle ne s'applique qu'aux fichiers qui correspondent à ce modèle")
|
||||
OP.add_option('--cgi-content-type', '--cgict', dest='content-type', action='callback', callback=set_content_type, type='string',
|
||||
help=u"En mode CGI, forcer le type de contenu avec lequel servir le fichier."
|
||||
+ u"Si cette option est spécifiée après une option --spec ou --glob, elle ne s'applique qu'aux fichiers qui correspondent à ce modèle")
|
||||
OP.add_option('--cgi-content-charset', '--cgicc', dest='content-charset', action='callback', callback=set_content_charset, type='string',
|
||||
help=u"En mode CGI, forcer l'encoding de contenu avec lequel servir le fichier."
|
||||
+ u"Si cette option est spécifiée après une option --spec ou --glob, elle ne s'applique qu'aux fichiers qui correspondent à ce modèle")
|
||||
OP.add_option('-P', '--cgi-path-info', dest='path_info',
|
||||
help=u"Spécifier un chemin d'un fichier à télécharger. En mode CGI, cette valeur est prise dans la variable d'environnement PATH_INFO")
|
||||
help=u"Spécifier un chemin d'un fichier à télécharger. "
|
||||
+ u"En mode CGI, cette valeur est prise dans la variable d'environnement PATH_INFO")
|
||||
OP.add_option('-Q', '--cgi-query-string', dest='query_string',
|
||||
help=u"Spécifier la valeur de QUERY_STRING pour provisionner l'environnement du fichier résultat. En mode CGI, cette valeur est prise dans la variable d'environnement QUERY_STRING.")
|
||||
help=u"Spécifier la valeur de QUERY_STRING pour provisionner l'environnement du fichier résultat. "
|
||||
+ u"En mode CGI, cette valeur est prise dans la variable d'environnement QUERY_STRING.")
|
||||
OP.add_option('-N', '--cgi-script-name', dest='script_name',
|
||||
help=u"Spécifier la valeur de SCRIPT_NAME pour provisionner l'environnement du fichier résultat. En mode CGI, cette option est automatiquement activée si QUERY_STRING contient le paramètre script_name=SCRIPT_NAME, la valeur par défaut étant la valeur de la variable d'environnement SCRIPT_NAME."
|
||||
help=u"Spécifier la valeur de SCRIPT_NAME pour provisionner l'environnement du fichier résultat. "
|
||||
+ u"En mode CGI, cette option est automatiquement activée si QUERY_STRING contient le paramètre script_name=SCRIPT_NAME, la valeur par défaut étant la valeur de la variable d'environnement SCRIPT_NAME."
|
||||
+ u"\n L'ordre de priorité pour le calcul de cette valeur est: d'abord le paramètre script_name dans QUERY_STRING, puis l'option de la ligne de commande, enfin la valeur de la variable d'environnement")
|
||||
OP.add_option('-G', '--cgi-param-group', dest='select_group',
|
||||
help=u"Sélectionner le groupe spécifié. Seuls les fichiers du groupe sont affichés. En mode CGI, cette option est automatiquement activée si QUERY_STRING contient le paramètre group=GROUP."
|
||||
help=u"Sélectionner le groupe spécifié. "
|
||||
+ u"Seuls les fichiers du groupe sont affichés. "
|
||||
+ u"En mode CGI, cette option est automatiquement activée si QUERY_STRING contient le paramètre group=GROUP."
|
||||
+ u"\n S'il n'y a qu'un seul groupe, il est automatiquement sélectionné."
|
||||
+ u"\n L'ordre de priorité pour le calcul de cette valeur est: d'abord le paramètre group dans QUERY_STRING, puis l'option de la ligne de commande")
|
||||
OP.add_option('-t', '--cgi-param-xslt', dest='xslt',
|
||||
help=u"Ajouter le chemin vers la feuille de style XSLT dans le flux XML généré. En mode CGI, cette option est automatiquement activée si QUERY_STRING contient le paramètre xslt=XSLT."
|
||||
help=u"Ajouter le chemin vers la feuille de style XSLT dans le flux XML généré. "
|
||||
+ u"En mode CGI, cette option est automatiquement activée si QUERY_STRING contient le paramètre xslt=XSLT."
|
||||
+ u"\n L'ordre de priorité pour le calcul de cette valeur est: d'abord le paramètre xslt dans QUERY_STRING, puis l'option de la ligne de commande")
|
||||
OP.add_option('-i', '--include', dest='includes', action='append',
|
||||
help=u"Spécifier un paramètre à inclure pour construire la valeur du chemin xpath /result/env/query_string dans le résultat. Il est possible de spécifier plusieurs paramètres en les séparant par des virgules. Par défaut, prendre tous les paramètres de la requête.")
|
||||
help=u"Spécifier un paramètre à inclure pour construire la valeur du chemin xpath /result/env/query_string dans le résultat. "
|
||||
+ u"Il est possible de spécifier plusieurs paramètres en les séparant par des virgules. "
|
||||
+ u"Par défaut, prendre tous les paramètres de la requête.")
|
||||
OP.add_option('-x', '--exclude', dest='excludes', action='append',
|
||||
help=u"Spécifier un paramètre à exclure pour construire la valeur du chemin xpath /result/env/query_string dans le résultat. Il est possible de spécifier plusieurs paramètres en les séparant par des virgules.")
|
||||
help=u"Spécifier un paramètre à exclure pour construire la valeur du chemin xpath /result/env/query_string dans le résultat. "
|
||||
+ u"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 à /result/env/query_string.")
|
||||
env = dict(filters=[], filter=None)
|
||||
|
@ -386,18 +525,6 @@ def run_cgilsxml():
|
|||
environ = os.environ
|
||||
cgi_mode = o.cgi_mode
|
||||
cgi_cache = o.cgi_allow_cache and True or False
|
||||
cgi_content_type = o.cgi_content_type
|
||||
cgi_content_charset = o.cgi_content_charset or 'utf-8'
|
||||
cgi_content_disposition = o.cgi_content_disposition or 'attachment'
|
||||
if cgi_content_disposition in ('attachment', 'inline'): pass
|
||||
elif cgi_content_disposition == 'none': cgi_content_disposition = None
|
||||
else:
|
||||
if cgi_mode:
|
||||
if not cgi_cache: cgi_nocache()
|
||||
print "Content-Type: text/plain; charset=utf-8"
|
||||
print
|
||||
print "%s: Disposition de contenu invalide. Ce soit être attachment, inline ou none" % cgi_content_disposition
|
||||
sys.exit(1)
|
||||
cgi_query_string = o.query_string
|
||||
if cgi_query_string is not None: environ['QUERY_STRING'] = cgi_query_string
|
||||
if cgi_mode is None:
|
||||
|
@ -458,13 +585,18 @@ def run_cgilsxml():
|
|||
if cgi_mode:
|
||||
if not cgi_cache: cgi_nocache()
|
||||
dlname = file.dlname or file.name
|
||||
ctype = cgi_content_type
|
||||
if ctype is None: ctype = file.has_key('type') and file.type or None
|
||||
if ctype is None: ctype, encoding = mimetypes.guess_type(dlname, False)
|
||||
if ctype is None: ctype = "application/octet-stream"
|
||||
print "Content-Type: %s; charset=%s" % (ctype, cgi_content_charset)
|
||||
if cgi_content_disposition is not None:
|
||||
print "Content-Disposition: %s; filename=\"%s\"" % (cgi_content_disposition, dlname)
|
||||
if file.has_key('content_disposition'): content_disposition = file.content_disposition
|
||||
else: content_disposition = default_content.disposition
|
||||
if file.has_key('content_type'): content_type = file.content_type
|
||||
else: content_type = default_content.type
|
||||
if content_type is None: content_type, encoding = mimetypes.guess_type(dlname, False)
|
||||
if content_type is None: content_type = "application/octet-stream"
|
||||
if file.has_key('content_charset'): content_charset = file.content_charset
|
||||
else: content_charset = default_content.charset
|
||||
|
||||
print "Content-Type: %s; charset=%s" % (content_type, content_charset)
|
||||
if content_disposition is not None:
|
||||
print "Content-Disposition: %s; filename=\"%s\"" % (content_disposition, dlname)
|
||||
print
|
||||
inf = open(file.pf, 'rb')
|
||||
try: shutil.copyfileobj(inf, sys.stdout)
|
||||
|
|
Loading…
Reference in New Issue