samedi 24 octobre 2009

Comment faire un proxy HTTP

Comme vous l’avez vu, j’ai récemment mis à jour mon projet codeplex zeroconf. Ce projet ne contient pas seulement l’implémentation du protocol DNS et du protocol Bonjour. Il contient aussi l’implémentation du protocol HTTP qui me permet d’envoyer des requêtes HTTP en UDP, chose qui n’est pas faisable avec l’implémentation du framework .NET. Au boulot, j’ai besoin de vérifier qu’une application que j’ai développé fonctionne correctement avec IE6( oui, ca existe encore… malheureusement). Puisque je suis sur Windows 7, je me suis dit que ca pourrait être super d’utiliser IE6 en application virtuelle. Je pense que vous voyer où je veux en venir. Sur une machine virtuel, on n’a pas accès au serveur de développement web démarré par visual studio. Ce que j’aurais pu faire, c’est déployer sur la machine virtuelle, ce qui veut dire, installer IIS, le configurer, passer du temps à vérifier le fichier web.config… Bref, pas une solution des plus simple à mettre en place. Alors, je me suis dit : Ce qu’il me faut, c’est un proxy, et j’ai déjà l’implémentation du protocole HTTP !

Voici le code du fameux proxy :

public class Proxy
{
RestServer proxy;
string hostToRedirectTo;

static void Main(string[] args)
{
Proxy p = new Proxy(ushort.Parse(args[0]), args[1]);
p.Start();
Console.ReadLine();
p.Stop();
}

private void Stop()
{
proxy.Stop();
}

private void Start()
{
proxy.StartTcp();
}

public Proxy(ushort portToListenOn, string hostToRedirectTo)
{
proxy = new RestServer(portToListenOn);
this.hostToRedirectTo = hostToRedirectTo;
proxy.HttpRequestReceived += proxy_HttpRequestReceived;
}

void proxy_HttpRequestReceived(object sender, HttpRequestEventArgs e)
{
e.Request.Host = this.hostToRedirectTo;
e.Response = e.Request.GetResponse(true);
e.Response.Body.Position = 0;
}
}


Comme vous pouvez le voir, la solution est très simple, et ne nécessite qu’une dizaine de lignes de code !!!

Aucun commentaire: