Programmer un proxy [C/Socket] - C - Programmation
Marsh Posté le 08-04-2006 à 23:55:03
c'est un poil plus compliqué: il faut que tu lise la requête HTTP, et que tu envoye cette requête au serveur désignée dans la requête. Une fois la connexion effectuée tu lit les données reçues pour les transmettre au navigateur (socket en lecture/écriture, donc).
Le shemas ressemble plus à ça:
client <---> proxy <----> serveur
Note que certaines options dans les entêtes sont utiles (genre connexion:close), et que tu doit aussi envoyer les cookies, les formulaires et les fichiers joints.
Marsh Posté le 09-04-2006 à 17:11:00
Pourquoi est ce qu'il est nécessaire de lire l'entête http?
Dans le cas d'utilisation d'un proxy l'adresse ip de destination est celle du proxy ou celle du site web?
L'entête est directement envoyé par le navigateur j'aurai pensé que le proxy l'envoyais directement sans traitement vers le site web.
Autre question: suivant ton schéma comment faire pour traiter en parallèle les envois et les réponses, je pense que je suis obligé d'utiliser les threads non?
Merci de ton aide (PS: si t'as des sources je suis preneur)
Marsh Posté le 09-04-2006 à 18:15:20
tiens j'avais fais un proxy smtp si ça peut t'aider, ya le source en C et le rapport ici :
http://kaiserzipo.free.fr/web/.dir [...] eseau&3=TP
et effectivement tu utilises plusieurs threads
Marsh Posté le 09-04-2006 à 18:45:00
Citation : |
Au niveau TCP, le navigateur envoye la requête au proxy, et non pas au serveur. C'est au proxy de prendre en charge la requête, et donc pour contacter le serveur il devra lire l'entête. Certaines options sur les sockets peuvent être fixées par le navigateur ou le serveur: par exemple les temps d'attente maximums. Le proxy devra en tenir compte. Je ne peut pas te donner une liste exhaustive des options d'entête qu'il te faudra traiter, mais tu trouvera plein de doc sur le web.
Citation : |
Tout à fait, la structure principale d'une proxy est la même que celle d'un serveur web!
Citation : |
Il y a plein de proxys en open source, une petite recherche sur le net et tu trouvera ton bonheur. Même si souvent ces proxys tournent sur Unix, tu peut les adapter pour Windows.
La meilleure source que tu puisse avoir c'est celle du serveur Apache sur apache.org!
Bon courage
(rem: c'est pas si dur, mais c'est long, j'avais fait un serveur web compatible HTTP/1.1, j'y avais intégré la plupart des gestion d'entêtes, mais il m'a fallu 6 mois)
Marsh Posté le 09-04-2006 à 19:43:50
J'ai bien essayé de regarder des logiciels open, j'ai télécharger les sources de squid mais bon faut avoir un certain niveau, je maitrise bien le C/C++ et d'autre langage mais lire un tel projet c'est chaud.
Marsh Posté le 09-04-2006 à 20:24:36
Entraîne toi sur le forum, debugger les programmes des autres c'est pas toujours évident.
Marsh Posté le 10-04-2006 à 09:51:25
J'ai une petite idée d'algo, qu'en pensez vous? :
Code :
|
Marsh Posté le 12-04-2006 à 22:35:18
J'ai créer un bou de code qui fonctionne a peu près, mais il y a beaucoup de bugs que je ne comprend, les connexions foires au bout d'un moment et j'ai beaucoup de bug d'affichage à croire que tout le code des pages web n'est pas transmit.
Si des âmes charitables veulent bien le tester :
Pour configurer, dans firefox: paramètre de connexion -> proxy 127.0.0.1 port 3080
adresse pour télécharger directement: http://membres.lycos.fr/bobov/code/main.c
ou ici:
Code :
|
Edit: commentaires sur le code ajouté.
Marsh Posté le 12-04-2006 à 22:40:22
on sent que tu aimes commenter ton code toi
Marsh Posté le 12-04-2006 à 22:42:24
C'est vrai que je ne l'ai pas super commenté, généralement je commente mon code quand je sais que j'aurai des problèmes en le relisant mais la le principe est connu donc j'ai pas beaucoup commenté. Mais je vais corriger ca par la suite.
Marsh Posté le 13-04-2006 à 01:41:16
Zipo a écrit : on sent que tu aimes commenter ton code toi |
Il y a le minimum vital... Si on connait le sujet, il n'y pas trop de mystères...
Marsh Posté le 14-04-2006 à 15:27:48
Voila j'ai édité mon message précédent et commenté mon code
Marsh Posté le 18-04-2006 à 15:15:43
J'ai fait une mise à jour du code proper et commenté cette fois ci, mais mon proxy ne fonctionne pas avec les images, qqun peut il m'aider?
Lien direct vers le .c : http://membres.lycos.fr/bobov/code/main.c
(Configuration du navigateur: 127.0.0.1:8080)
Code :
|
Merci d'avance
Marsh Posté le 18-04-2006 à 15:21:58
oui! parceque les navigateurs moderne ne demandent pas l'image en entier. Ils en font la demande au serveur bout par bout, selon l'affichage necessaire. Par exemple, si l'internaute va directement au bas de la page, le téléchargement des images du haut de la page est interrompu après le bout courant et sera repris en dernier.
La demande partiel est, il me semble le code HTTP 304. Tu doit le traiter spécialement.
Comme quoi, je t'avais dit, c'est pas aussi évident... Mais tu es sur la bonne voie.
Marsh Posté le 18-04-2006 à 15:23:40
heu non, c'est pas le code 304. là je me souviens plus. tu devrais le trouver sur le web.
Marsh Posté le 18-04-2006 à 15:40:01
ouin je pensais pas que c'était si dur que ça.
En tout cas heureusement que tu me dis ça car j'en pouvais de chercher sans comprendre, je pensais que ca venait de mon code.
Ou est ce que je vais trouver ce code spécifique dans les RFC ?
Marsh Posté le 18-04-2006 à 16:05:49
> Ou est ce que je vais trouver ce code spécifique dans les RFC ?
- heu je l'avais trouvé, j'ai un poil la flemme de rechercher là. pourtant je l'ai presque sous les yeux, dans mes logs c'est affiché quelquepart. si, si, je t'assure
- indice: fait un debug de l'entête totale envoyée par le navigateur au proxy (jusqu'au double \n\n)
Marsh Posté le 18-04-2006 à 16:10:21
zieute un coup ici:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
Marsh Posté le 18-04-2006 à 17:21:03
C'est quand même bizarre cette histoire je viens de trouver une autre source de proxy (enfin ! lol) et il ne gère nul part le 206 Partial Content et pourtant quand j'utilise son proxy avec la dernière version de firefox les images s'affichent.
source: http://www.cppfrance.com/code.aspx?ID=10846
Est ce que cela peut venir de mes threads?
Marsh Posté le 18-04-2006 à 17:30:29
Effectivement je reviens de faire un test, en utilisant un buffer de 1 octets (char) au lieu de 1ko (char buffer2[1024]) pour la reception des données du serveur et cette fois les images s'affiches :-|.
C'est quand même bizarre ca. Faut que je trouve une solution car des buffers de 1octets pour le transfert c'est pas cool.
Marsh Posté le 21-04-2006 à 10:32:35
J'ai fait une grosse mise à jour du code, finis les gros plantage!
Problème restant, navigation lente sur certain site, impossible de naviger sur certain site, le logiciel freeze par moment, il reste coincé dans la boucle de download.
Tout est ici: http://www.cppfrance.com/codes/WIN [...] 37134.aspx
la source:
Code :
|
Merci de ton aide nargy
Marsh Posté le 21-04-2006 à 10:40:52
ouais le code est un peu gros, et en plus c'est du windoz. je peut pas tester là, et c'est balaise avec autant de code de compiler de tête.
je te conseillerai bien de rajouter du débug à fond, histoire de cibler le problème.
Marsh Posté le 21-04-2006 à 10:41:55
pour le freeze, tu doit avoir un problème de communication thread.
Marsh Posté le 23-04-2006 à 00:44:52
J'ai un nouveau problème, encore un . Depuis que j'ai rajouté mes fonctions de parse de requete HTTP, le nombre de site qui fonctionne est bien meilleur qu'auparavant et je n'ai plus de freeze mais par contre le multithreading plante !!
J'ai des erreurs du type:
Citation:
0x0040155f emploie l'adresse mémoire 0x0014a0000. La mémoire ne peut pas être "read".
Quelqu'un saurait me dire de quoi cela peut provenir.
PS: si vous voulez une source fonctionnel commenté CreateThread et décommenté la ligne du dessous.
PS2: la source devenant trop longue je ne vais pas poluer le forum, elle est ici:
http://membres.lycos.fr/bobov/code/main.c
PS3: Merci nargy pour ton aide jusque ici.
Marsh Posté le 23-04-2006 à 00:56:56
Il plante à sur l'index du forum chez moi.
----Accept: [] |
Pour les dernières lignes
Marsh Posté le 23-04-2006 à 00:59:48
> 0x0040155f emploie l'adresse mémoire 0x0014a0000. La mémoire ne peut pas être "read".
- indique que tu as un pointeur qui se balade dans le vide. il te faut un débuggeur, qui te dira à quelle ligne de ton programme tu accède à un pointeur qui n'a pas été initialisé, ou utilisé après avoir été libéré. Sans débuggeur, tu peut trouver mais moins facilement en ajoutant des printf de débug à chaque fonctions puis chaque ligne.
Marsh Posté le 23-04-2006 à 01:03:14
nargy a écrit : > 0x0040155f emploie l'adresse mémoire 0x0014a0000. La mémoire ne peut pas être "read". |
Code :
|
Si ça peut aider.
Marsh Posté le 23-04-2006 à 01:43:33
Le problème des erreurs de read provennait de l'espace mémoire des threads qui était mal initialisé à chaque nouveau thread.
Normalment c'est corrigé.
Tholdan t'a compilé avec quoi, j'ai pas ce warning la moi :?.
Sinon j'ai pas de plantage à l'index du forum, j'en ai pour les requetes POST par contre. C'est quoi ton navigateur?
Marsh Posté le 23-04-2006 à 01:49:53
psyphi a écrit : Le problème des erreurs de read provennait de l'espace mémoire des threads qui était mal initialisé à chaque nouveau thread. |
GCC -Wall
Et firefox 1.5 comme navigateur.
Marsh Posté le 26-04-2006 à 00:12:54
Pour ceux que ça interesse j'ai fait une mise à jour du code avec l'implémentation de la requete POST.
http://www.cppfrance.com/code.aspx?ID=37134
En fait maintenant j'aimerais bien avoir le retour d'utilisateur
Marsh Posté le 08-04-2006 à 20:02:26
Salut all, je cherche de la doc sur comment programmez un proxy minimal sans cache ou autre fioriture.
J'ai bien une idée, ouvrir deux sockets en parallèle (multithreading) de cette façon mais je ne suis pas du tout sur:
client -> socket 1 -> serveur
client <- socket 2 <- serveur
Donc avant de me lancer dans l'inconnu je vous demande de l'aide: des sources courtes ou des tutos.
merci