Voici un cas concret de programmation réseau.
Si vous souhaitez connecter une Socket Java à un site distant via un proxy HTTP, avec par exemple le code suivant :
Proxy httpProxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy", 8080));
Socket socket = new Socket(httpProxy);
socket.connect(new InetSocketAddress("192.168.0.2", 21));
Vous obtiendrez une exception IllegalArgumentException – « Invalid Proxy »
En effet, la classe Socket ne sait pas se connecter via un proxy HTTP.
Heureusement, il y a une solution !
Procédure de connexion via un proxy HTTP
Le procotole HTTP/1.1 permet de créer un tunnel via le proxy HTTP en utilisant la commande CONNECT.
L’idée est de se connecter sur le proxy et de lui envoyer les instructions :
CONNECT host:port HTTP/1.1
Host: host:port
Et le proxy vous fournit un tunnel vers l’hôte demandé à travers la socket que vous avez ouverte.
Concrètement, le code java donnerait quelque chose comme :
Socket socket = new Socket("proxy", 8080);
Writer proxyWriter = new PrintWriter(socket.getOutputStream(),true);
proxyWriter.write("CONNECT " + host + ":" + port + " HTTP/1.1\n")
proxyWriter.write("Host: " + host + ":" + port + "\n")
proxyWriter.write("\n")
proxyWriter.flush()
Et voilà, vous êtes connecté !! Vous pouvez utiliser votre socket ouverte pour vos échange avec le site distant.
Simple !
Note :
Si votre proxy demande une authentification, ajoutez la ligne suivante après le « Host: » :
Proxy-Authorization: chaine_de_connexion
où chaine_de_connexion est une chaîne d’authentification HTTP standard.