Skip to content

Etablir une connexion Socket via un proxy HTTP

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.

Published inProgrammation
Loading Facebook Comments ...

3 Comments

  1. stc stc

    J’ai essayé ton code et j’obtiens une erreur 400 (Bad request).Sinon merci quand même pour ce mini tuto

    • Gerben CASTEL Gerben CASTEL

      Argh, ça marche de mon côté, il faudrait que je teste avec un autre proxy

  2. stc stc

    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.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.