Question

J'ai téléchargé Privoxy il y a quelques semaines et pour le plaisir, j'étais curieux de savoir comment faire pour en faire une simple version.

Je comprends que je dois configurer le navigateur (client) pour envoyer une demande au proxy. Le proxy envoie la demande 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).

Certains d'entre vous ont-ils des explications ou des informations qui me permettront de poursuivre ce petit projet?

Mettre à jour

C'est ce que je comprends (voir le 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 requête.

Étape 3 le proxy reçoit une réponse de la demande. Maintenant, il doit envoyer la réponse du Web au client, mais comment ???

alt text

Lien utile

Mentalis Proxy : j'ai trouvé ce projet qui est un proxy (mais plus que je voudrais). Je pourrais vérifier la source, mais je voulais vraiment quelque chose de fondamental pour mieux comprendre le concept.

Proxy ASP : je pourrais également obtenir des informations ici .

Demander un réflecteur : il s'agit d'un exemple simple.

Voici un référentiel Git Hub avec un proxy HTTP simple .

Était-ce utile?

La solution

Vous pouvez en créer un avec le HttpListener classe pour écouter les demandes entrantes et le < code> HttpWebRequest pour relayer les requêtes.

Autres conseils

Je ne voudrais pas utiliser HttpListener ou quelque chose du genre, vous rencontrerez tellement de problèmes.

Plus important encore, ce sera très difficile à supporter:

  • Keep-Alives par procuration
  • SSL ne fonctionnera pas (de manière correcte, vous obtiendrez des popups)
  • Les bibliothèques .NET suivent strictement les RFC, ce qui entraîne l’échec de certaines requêtes (même si IE, FF et tout autre navigateur dans le monde fonctionneront.)

Ce que vous devez faire est:

  • Écoutez un port TCP
  • Analyser la demande du navigateur
  • Extraire l'hôte se connectant à cet hôte au niveau TCP
  • Tout transférer en avant sauf si vous souhaitez ajouter des en-têtes personnalisés, etc.

J'ai écrit deux proxies HTTP différents dans .NET avec des exigences différentes et je peux vous dire que c'est la meilleure façon de le faire.

Mentalis le fait, mais leur code est "délégué spaghetti", pire que GoTo:)

J'ai récemment écrit un proxy léger dans c # .net en utilisant TcpListener et TcpClient .

https://github.com/titanium007/Titanium-Web-Proxy

La prise en charge de HTTP sécurisé est correcte, la machine cliente doit approuver le 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 sauf le traitement en pipeline. Le pipelining n'est de toute façon pas utilisé par la plupart des navigateurs modernes. Prend également en charge l’authentification Windows (en clair, en résumé).

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 retard notable.

Le proxy peut fonctionner de la manière suivante.

Étape 1, configurez le client pour utiliser proxyHost: proxyPort.

Le 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 requête et essaie de détecter "Host". entête. Cet en-tête indiquera au proxy où ouvrir la connexion.

Étape 2: le proxy ouvre la connexion à l'adresse spécifiée dans la zone "Host". entête. Ensuite, il envoie une requête HTTP à ce serveur distant. Lit la réponse.

Étape 3: après la lecture de la réponse à partir du serveur HTTP distant, le proxy envoie la réponse via une connexion TCP précédemment ouverte avec le navigateur.

Schématiquement, cela ressemblera à ceci:

Browser                            Proxy                     HTTP server
  Open TCP connection  
  Send HTTP request  ----------->                       
                                 Read HTTP header
                                 detect Host header
                                 Send request to HTTP ----------->
                                 Server
                                                      <-----------
                                 Read response and send
                   <-----------  it back to the browser
Render content

Si vous souhaitez simplement intercepter le trafic, vous pouvez utiliser le noyau de violoniste pour créer un proxy ...

http://fiddler.wikidot.com/fiddlercore

lancez fiddler d’abord avec l’UI 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 comporte un noyau que vous pouvez intégrer à vos propres applications.

N'oubliez pas que FiddlerCore n'est pas gratuit pour les applications commerciales.

Avec OWIN et WebAPI, les choses sont devenues vraiment simples. Dans ma recherche d'un serveur proxy C #, je suis également tombé sur ce message http://blog.kloud.com.au/2013/11/24/do-it-yourself-web-api-proxy/ . Ce sera la route que je prends.

Acceptez de faire le mal Si vous utilisez HTTPListener, vous rencontrerez de nombreux problèmes, vous devrez analyser les requêtes et vous ferez appel à des en-têtes et ...

  1. Utilisez tcp listener pour écouter les requêtes du navigateur
  2. analyser uniquement la première ligne de la demande et obtenir le domaine hôte et le port à connecter
  3. envoie la requête brute exacte à l'hôte trouvé sur la première ligne de la requête du navigateur
  4. recevoir les données du site cible (j'ai un problème dans cette section)
  5. envoyer les données exactes reçues de l'hôte au navigateur

vous voyez que vous n'avez même pas besoin de savoir ce qu'il y a dans la requête du navigateur et de l'analyser, obtenez seulement l'adresse du site cible à partir de la première ligne la première ligne aime généralement ça GET http://google.com HTTP1.1 ou CONNECT facebook.com:443 (pour les demandes SSL)

Socks4 est un protocole très simple à implémenter. Vous écoutez la connexion initiale, vous vous connectez à l'hôte / au port demandé par le client, vous envoyez le code de réussite au client, puis vous transférez les flux sortant et entrant via les sockets.

Si vous utilisez HTTP, vous devrez lire et éventuellement définir / supprimer certains en-têtes HTTP pour un peu plus de travail.

Si je me souviens bien, SSL fonctionnera sur les proxies HTTP et Socks. Pour un proxy HTTP, vous implémentez le verbe CONNECT, qui fonctionne de la même manière que socks4, comme décrit ci-dessus, puis le client ouvre la connexion SSL via le flux TCP proxy.

Le navigateur étant connecté au proxy, les données qu'il reçoit du serveur Web sont simplement envoyées via la même connexion que celle que le navigateur a initialisée au proxy.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top