IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau/Web Python Discussion :

Proxy HTTP - Très lent pour charger une page.


Sujet :

Réseau/Web Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2014
    Messages : 34
    Points : 25
    Points
    25
    Par défaut Proxy HTTP - Très lent pour charger une page.
    Bonjour tout le monde,

    Je tente de développer un proxy simple en python, mais lorsque je tente de configurer mon navigateur web pour passer par mon proxy, je constate des lenteur pour afficher une page web. (http://free.fr/ par exemple)

    Voici le code du proxy :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    #!/usr/bin/env python
     
    import socket
    import thread
    import sys
     
    def get_line(field, data) :
    	lines = data.split("\n")
    	for line in lines :
    		if line.split(":")[0] == field :
    			return line
    	return ""
     
    def get_host(data) :
    	host_line = get_line("Host", data);
    	port = 80
    	if len(host_line.split(" ")) > 1 :
    		host = host_line.split(" ")[1]
    		arr = host.split(":")
    		if len(arr) > 1 :
    			host = arr[0]
    			port = arr[1]
    		else :
    			host = host[:-1]
    	else :
    		host = ""
    		port = 0
    	return (host, port)
     
    def http_proxy(conn, data, client_addr) :
    	#On récupère l'hote et le port dans le champ "Host" de la requête HTTP.
    	(host, port) = get_host(data)
    	if host != "" :
    		try :
    			#On se connecte au serveur pour lui envoyer la requête HTTP.
    			s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    			s.connect((socket.gethostbyname(host), int(port)))
    			s.send(data)
    			while 1 : 
    				reply = s.recv(8192)
    				test = reply
    				if (len(reply) > 0) :
    					#On envoit la réponse du serveur au client.
    					conn.send(reply)
    					print "Send %d bytes from %s" % (len(reply), host)
    				else :
    					s.close()
    					break
    		except socket.error, (value, message) :
    			s.close()
    			conn.close()
    			print value, message
    			sys.exit(1)
     
    def main():
    	try :
    		s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    		s.bind(('', 8080))
    		s.listen(100)
    	except socket.error, (value, message) :
    		if s : 
    			s.close()
    		print "Socket error : ", message
    	#On accepte toutes les connexions.
    	while 1 :
    		conn, client_addr = s.accept()
    		data = conn.recv(8192)
    		#Pour chaque connexion, on fait un thread.
    		thread.start_new_thread(http_proxy, (conn, data, client_addr))
    	s.close()
     
    if __name__ == "__main__" :
    	main()
    J'ai l'impression que ces lenteurs sont causés par le fait que certaines requêtes HTTP ne sont pas prise en compte par mon proxy, du coup, le navigateur attend un certains temps avant de les renvoyer.

    Si c'est bien cela le problème, je n'arrive pas a déterminer pourquoi cela se produit.

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Si vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def http_proxy(conn, data, client_addr) :
    	#On récupère l'hote et le port dans le champ "Host" de la requête HTTP.
    	(host, port) = get_host(data)
    	if host != "" :
    vous avez déjà une piste.

    Citation Envoyé par astro01 Voir le message
    Si c'est bien cela le problème, je n'arrive pas a déterminer pourquoi cela se produit.
    Charger une page HTML, pour un navigateur, c'est souvent récupérer/agréger le résultat d'un tas de requêtes HTTP.
    Créez un thread, une connexion,... c'est rapide et difficile de voir une dégradation des temps de réponse lorsqu'il y en a peu mais multipliez ces pouièmes en grand nombre, et le ralentissement devient "visible". Essayez de compter le nombre de requêtes HTTP associées au chargement d'une page...
    Après vous avez aussi à vérifier que la connexion entre le client et le serveur n'est pas "persistente" (i.e. HTTP 1.1).
    Dans ce cas, vous êtes coincé à attendre la suite de la réponse du serveur alors qu'il faudrait plutôt lire et transférer la requête suivante du client.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2014
    Messages : 34
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Si vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def http_proxy(conn, data, client_addr) :
    	#On récupère l'hote et le port dans le champ "Host" de la requête HTTP.
    	(host, port) = get_host(data)
    	if host != "" :
    vous avez déjà une piste.


    Charger une page HTML, pour un navigateur, c'est souvent récupérer/agréger le résultat d'un tas de requêtes HTTP.
    Créez un thread, une connexion,... c'est rapide et difficile de voir une dégradation des temps de réponse lorsqu'il y en a peu mais multipliez ces pouièmes en grand nombre, et le ralentissement devient "visible". Essayez de compter le nombre de requêtes HTTP associées au chargement d'une page...
    Après vous avez aussi à vérifier que la connexion entre le client et le serveur n'est pas "persistente" (i.e. HTTP 1.1).
    Dans ce cas, vous êtes coincé à attendre la suite de la réponse du serveur alors qu'il faudrait plutôt lire et transférer la requête suivante du client.

    - W
    Je te remercie pour ta réponse, je viens de faire une analyse réseau avec Firefox.

    Voici ce que j'ai obtenu :
    Nom : Capture du 2017-05-14 22-56-16.png
Affichages : 295
Taille : 204,1 Ko

    Je constate que c'est les images qui prennent beaucoup de temps a être transférées.

    Quand je charge ces images seuls, je n'ai pas de problèmes, c'est plutôt rapide.

    Je ne parviens toujours pas a comprendre d’où pourrais provenir le problème... :s

    Je viens de vérifier, mes connexions sont normalement non persistante.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par astro01 Voir le message
    Je constate que c'est les images qui prennent beaucoup de temps a être transférées.
    Ce que semble montrer votre trace, c'est qu'à un moment donné çà décroche.
    Après soit vous mettez des traces dans le "proxy" pour comprendre ce qu'il s'y passe, soit vous jouez avec un analyseur de paquets TCP comme Wireshark (les deux ne sont pas exclus).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2014
    Messages : 34
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Ce que semble montrer votre trace, c'est qu'à un moment donné çà décroche.
    Après soit vous mettez des traces dans le "proxy" pour comprendre ce qu'il s'y passe, soit vous jouez avec un analyseur de paquets TCP comme Wireshark (les deux ne sont pas exclus).

    - W
    Je ne suis pas sûr de comprendre ce que vous voulez dire quand vous dite : "ça décroche".
    Que voulez vous dire plus exactement ?

    Je viens de voir qu'il manquait une ligne :
    Après la ligne 47 de mon code.

    Cela pouvait poser problème, car la connexion avec le client pouvait rester ouverte.

    Mais j'ai toujours des problèmes.

    Voici une capture tcpdump (qui prend déjà plus d'une minute) :
    22:37:46.239238 IP pc11.home.41056 > www.free.fr.http: Flags [S], seq 937746115, win 29200, options [mss 1460,sackOK,TS val 2204063 ecr 0,nop,wscale 7], length 0
    22:37:46.262041 IP www.free.fr.http > pc11.home.41056: Flags [S.], seq 2506215012, ack 937746116, win 29200, options [mss 1452,nop,nop,sackOK], length 0
    22:37:46.262089 IP pc11.home.41056 > www.free.fr.http: Flags [.], ack 1, win 29200, length 0
    22:37:46.262159 IP pc11.home.41056 > www.free.fr.http: Flags [P.], seq 1:432, ack 1, win 29200, length 431: HTTP: GET http://www.free.fr/ HTTP/1.1
    22:37:46.290528 IP www.free.fr.http > pc11.home.41056: Flags [.], ack 432, win 30016, length 0
    22:37:46.292083 IP www.free.fr.http > pc11.home.41056: Flags [P.], seq 1:360, ack 432, win 30016, length 359: HTTP: HTTP/1.1 302 Moved Temporarily
    22:37:46.292145 IP pc11.home.41056 > www.free.fr.http: Flags [.], ack 360, win 30016, length 0
    22:38:51.288275 IP www.free.fr.http > pc11.home.41056: Flags [F.], seq 360, ack 432, win 30016, length 0
    22:38:51.288451 IP pc11.home.41056 > www.free.fr.http: Flags [F.], seq 432, ack 361, win 30016, length 0
    22:38:51.308688 IP www.free.fr.http > pc11.home.41056: Flags [.], ack 433, win 30016, length 0
    22:38:51.314640 IP pc11.home.41062 > www.free.fr.http: Flags [S], seq 2744810472, win 29200, options [mss 1460,sackOK,TS val 2220332 ecr 0,nop,wscale 7], length 0
    22:38:51.337583 IP www.free.fr.http > pc11.home.41062: Flags [S.], seq 787409478, ack 2744810473, win 29200, options [mss 1452,nop,nop,sackOK], length 0
    22:38:51.337632 IP pc11.home.41062 > www.free.fr.http: Flags [.], ack 1, win 29200, length 0
    22:38:51.337727 IP pc11.home.41062 > www.free.fr.http: Flags [P.], seq 1:450, ack 1, win 29200, length 449: HTTP: GET http://www.free.fr/freebox/index.html HTTP/1.1

Discussions similaires

  1. Réponses: 0
    Dernier message: 13/03/2010, 22h29
  2. Charger une page http en dans la console
    Par manticore dans le forum Linux
    Réponses: 4
    Dernier message: 15/11/2009, 11h00
  3. passer un parametre _get pour charger une nouvelle page
    Par samspitz dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 04/12/2008, 11h53
  4. Problème pour visionner une page HTTPS
    Par ahage4x4 dans le forum Autres Logiciels
    Réponses: 5
    Dernier message: 07/02/2006, 18h41
  5. Javascript pour charger une page web depuis un menu déroulan
    Par tomguiss dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 14/10/2005, 08h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo