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.
J’ai essayé ton code et j’obtiens une erreur 400 (Bad request).Sinon merci quand même pour ce mini tuto
Argh, ça marche de mon côté, il faudrait que je teste avec un autre proxy
Ah j’ai enfin réussi a me connecter a un proxy qui me renvoies un code 200, mais après je vois pas trop comment utiliser la connexion pour continuer a envoyer des données au serveur final.