Magazine Internet

test

Publié le 11 mai 2009 par Kphoen
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)})

Retour à La Une de Logo Paperblog

A propos de l’auteur


Kphoen 5 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte