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)})