J'ai téléchargé Privoxy il y a quelques semaines et pour le plaisir, j'étais curieux de savoir comment une version simple de celui-ci peut être réalisée.
Je comprends que je dois configurer le navigateur (client) pour envoyer la demande au proxy. Le proxy envoie la requête au Web (disons que c'est un proxy http). Le proxy recevra la réponse ... mais comment le proxy peut-il renvoyer la demande au navigateur (client)?
J'ai effectué une recherche sur le Web pour les proxy C # et http, mais je n'ai pas trouvé quelque chose qui me permette de comprendre comment cela fonctionne correctement dans les coulisses. (Je crois que je ne veux pas de proxy inverse mais je ne suis pas sûr).
L'un de vous a-t-il des explications ou des informations qui me permettront de poursuivre ce petit projet?
Mettre à jour
C'est ce que je comprends (voir graphique ci-dessous).
Étape 1 Je configure le client (navigateur) pour que toutes les demandes soient envoyées à 127.0.0.1 sur le port d'écoute du proxy. De cette façon, la demande ne sera pas envoyée directement à Internet mais sera traitée par le proxy.
Étape 2 Le proxy voit une nouvelle connexion, lit l'en-tête HTTP et voit la requête qu'il doit exécuter. Il exécute la demande.
Étape 3 Le mandataire reçoit une réponse de la demande. Maintenant, il doit envoyer la réponse du Web au client mais comment ???
Lien utile
Mentalis Proxy : J'ai trouvé ce projet qui est un proxy (mais plus que j'aimerais). Je pourrais vérifier la source mais je voulais vraiment quelque chose de basique pour mieux comprendre le concept.
Proxy ASP : Je pourrais peut-être obtenir des informations ici aussi.
Réflecteur de demande : Ceci est un exemple simple.
Réponses:
Vous pouvez en créer un avec la
HttpListener
classe pour écouter les demandes entrantes et laHttpWebRequest
classe pour relayer les demandes.la source
Je n'utiliserais pas HttpListener ou quelque chose comme ça, de cette façon vous rencontrerez tant de problèmes.
Plus important encore, ce sera une énorme douleur à soutenir:
Ce que vous devez faire est:
J'ai écrit 2 proxys HTTP différents en .NET avec des exigences différentes et je peux vous dire que c'est la meilleure façon de le faire.
Mentalis fait cela, mais leur code est "déléguer spaghetti", pire que GoTo :)
la source
J'ai récemment écrit un proxy léger en c # .net en utilisant TcpListener et TcpClient .
https://github.com/titanium007/Titanium-Web-Proxy
Il prend en charge HTTP sécurisé de la bonne manière, la machine cliente doit faire confiance au certificat racine utilisé par le proxy. Prend également en charge le relais WebSockets. Toutes les fonctionnalités de HTTP 1.1 sont prises en charge à l'exception du pipelining. Le pipelining n'est de toute façon pas utilisé par la plupart des navigateurs modernes. Prend également en charge l'authentification Windows (simple, condensé).
Vous pouvez connecter votre application en référençant le projet, puis voir et modifier tout le trafic. (Demande et réponse).
En ce qui concerne les performances, je l'ai testé sur ma machine et fonctionne sans aucun retard notable.
la source
Le proxy peut fonctionner de la manière suivante.
Étape 1, configurez le client pour utiliser proxyHost: proxyPort.
Proxy est un serveur TCP qui écoute sur proxyHost: proxyPort. Le navigateur ouvre la connexion avec le proxy et envoie une requête Http. Le proxy analyse cette demande et essaie de détecter l'en-tête "Host". Cet en-tête indiquera à Proxy où ouvrir la connexion.
Étape 2: Le proxy ouvre la connexion à l'adresse spécifiée dans l'en-tête "Host". Ensuite, il envoie une requête HTTP à ce serveur distant. Lit la réponse.
Étape 3: Une fois la réponse lue à partir du serveur HTTP distant, le proxy envoie la réponse via une connexion TCP ouverte précédemment avec le navigateur.
Schématiquement, cela ressemblera à ceci:
la source
Si vous cherchez simplement à intercepter le trafic, vous pouvez utiliser le noyau Fiddler pour créer un proxy ...
http://fiddler.wikidot.com/fiddlercore
lancez d'abord fiddler avec l'interface utilisateur pour voir ce qu'il fait, c'est un proxy qui vous permet de déboguer le trafic http / https. Il est écrit en c # et possède un noyau que vous pouvez intégrer à vos propres applications.
Gardez à l'esprit que FiddlerCore n'est pas gratuit pour les applications commerciales.
la source
Acceptez de dr evil si vous utilisez HTTPListener vous aurez de nombreux problèmes, vous devrez analyser les demandes et serez engagé dans les en-têtes et ...
vous voyez que vous n'avez même pas besoin de savoir ce qu'il y a dans la demande du navigateur et de l'analyser, n'obtenez l'adresse du site cible qu'à partir de la première ligne. La première ligne aime généralement ceci GET http://google.com HTTP1.1 ou CONNECT facebook.com: 443 (ceci est pour les requêtes SSL)
la source
Les choses sont devenues vraiment faciles avec OWIN et WebAPI. Dans ma recherche d'un serveur proxy C #, je suis également tombé sur ce post http://blog.kloud.com.au/2013/11/24/do-it-yourself-web-api-proxy/ . Ce sera la route que je prends.
la source
Socks4 est un protocole très simple à mettre en œuvre. Vous écoutez la connexion initiale, vous vous connectez à l'hôte / au port demandé par le client, envoyez le code de réussite au client, puis transférez les flux sortants et entrants sur les sockets.
Si vous utilisez HTTP, vous devrez lire et éventuellement définir / supprimer certains en-têtes HTTP, ce qui représente un peu plus de travail.
Si je me souviens bien, SSL fonctionnera sur les proxys HTTP et Socks. Pour un proxy HTTP, vous implémentez le verbe CONNECT, qui fonctionne un peu comme le socks4 comme décrit ci-dessus, puis le client ouvre la connexion SSL à travers le flux tcp proxy.
la source
Le navigateur est connecté au proxy afin que les données que le proxy obtient du serveur Web soient simplement envoyées via la même connexion que le navigateur a initiée au proxy.
la source
Pour ce que ça vaut, voici un exemple d'implémentation asynchrone C # basé sur HttpListener et HttpClient (je l'utilise pour pouvoir connecter Chrome dans les appareils Android à IIS Express, c'est le seul moyen que j'ai trouvé ...).
Et si vous avez besoin du support HTTPS, cela ne devrait pas nécessiter plus de code, juste une configuration de certificat: Httplistener avec support HTTPS
la source