class GETHandler:
""" Gère les requêtes de type GET """
def __init__(self, server, request):
#on stocke la requête de manière à pouvoir l'utiliser dans toute la class
self.conf = server.conf
self.request = request
self.header = self.request.header #alias vers la méthode de récup des headers
def reponse(self):
""" Processus de traitement d'une requête GET """
#URL de la ressource demandée
requested_url = self.header('Requested_URL')
#adresse du fichier .htaccess contenant la configuration "locale", les règles de réécriture, etc.
htaccess_url = self.conf.get('home_www', self.header('Host'))+\
'/.htaccess'
#gestionnaire de réécriture d'URL
mapper = URLRewrite()
#si le fichier .htaccess exsite
if os.path.exists(htaccess_url):
#on charge la configuration locale
localconf = LocalConf(self.conf, htaccess_url, self.request.from_ip,
self.header('Host'))
#charge les règles de réécriture
mapper.add_rules(localconf.get('REWRITE_RULES'))
#adresse complète du fichier en tenant compte de l'url rewriting
file = real_path(localconf.get('home_www')+\
mapper.pathto(escape(requested_url)))
# si le fichier demandé n'existe pas
if not os.path.exists(file):
#on retourne une erreur 404
join_404_file = True if self.header('Method') == 'GET' else False
return Error(404, join_error_file=join_404_file)
#la demande est un fichier
if not os.path.isdir(file):
#et si la configuration locale n'autorise pas l'accès à ce fichier
if not localconf.can_access(file):
#on retourne une erreur 403
return Error(403)
#récupération du contenu de fichier et de son type mime
contenu_fichier, mime = get_file(file)
else: #si la demande est un dossier
if not file.endswith('/'): # on redirige en cas d'URL mal formée
return HTTPResponse(301).redirection(requested_url+'/')
#on tente de trouver un fichier "index"
contenu_fichier, mime, index_file = get_index_file(file,
localconf.get('index_files'))
#si on a pas trouvé de fichier "index", et que la configuration n'autorise pas le listing des répertoires
if not (index_file or localconf.get('show_directory_listing', False) == 'True'):
#alors on retourne une erreur 403
return Error(403)
#et si la configuration locale n'autorise pas l'accès à ce répertoire
if not localconf.can_access(index_file):
#alors on retourne une erreur 403
return Error(403)
# si pas de fichier "index", on affiche le contenu du répertoire
if not contenu_fichier:
contenu_fichier, mime = gen_index_list(file, requested_url)
#la réponse est maintenant prête
#si la méthode est GET, on renvoie une réponse "normale" avec le fichier demandé
#sinon on renvoie juste les en-têtes en ajoutant la longueur du fichier à ces dernières
if self.header('Method') == 'GET':
return HTTPResponse(200, {'Content-Type': mime}, contenu_fichier)
else:
return HTTPResponse(200, {'Content-Type': mime,
'Content-Length': len(contenu_fichier)})