Implemnter un proxy http

cs_amari1 Messages postés 7 Date d'inscription dimanche 13 mars 2005 Statut Membre Dernière intervention 16 juillet 2006 - 5 juin 2006 à 12:30
Bensashi Messages postés 3 Date d'inscription samedi 11 octobre 2003 Statut Membre Dernière intervention 26 mars 2010 - 19 mars 2010 à 15:19
Salut tous le monde.

je suis entrain de programmer un proxy http en java et j'ai eu un probleme de connexion.

j'explique les démarches faitent pour implementer ce proxy:

1- mettre en ecoute  un ServerSocket sur le port 1200 (pour recuperer les requettes http).

2-  recuperer la requette http( eventuellement  l'entete + le corp de la requette  en cas                                                                 d'une  methode  POST).

3- se connecter au serveur cible (aprés avoir recuperer le host ).

4- envoyer  la requette http a ce  serveurs

5- recuperer la reponse ( entete + corp) du serveur
 
6- envoyer cette  reponse au client.

cela marche trés bien pour  les methodes GET et POST  ,dans la cas ou je veux consulter une boite  email comme (hotmail)  cette démarche ne marche pas  car la requette http  recuperer est du genre:

CONNECT login.live.com:443 HTTP/1.1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4
Proxy-Connection: keep-alive
Host: login.live.com

je ne sais pas est ce  que pour la méthode CONNECT il ya un traitement spéciale ou quoi?

j'espére que vous aller m'aidez ou me diriger vers une source qui peut m'aider car j'en ai besoin.

Merci

 

5 réponses

super_toinou Messages postés 764 Date d'inscription mardi 25 mai 2004 Statut Membre Dernière intervention 8 mars 2011 6
5 juin 2006 à 13:28
je crois que pour les serveur mails c est le port 21 normalement sur lequel il faut tapper, j m y connait pas trop mais tu decrai peut etre voir du coté de JavaMail pour ca (c est pas le meme protocole)
++ Toinou
0
cs_papillon2000 Messages postés 94 Date d'inscription dimanche 30 avril 2006 Statut Membre Dernière intervention 21 juin 2010
19 juin 2006 à 12:01
bonjours a tous, j'ai un probleme(l'addres proxy)
j'ai developper un programme avec les socket pour avoir le resultats d'une requete du moteur google,avant quand j'ai eu l'adress de proxy l'ai accedé au serveur et j'ai peu recuperer la page resultat de ma requete, mais à présent j'ai plus l'adress(car la connexion maintenant est par defaut) je ne peux pas utiliser se programme, comment puije faire pour interroger google, est ce qu'il y a une autre methode.
merci c'est très urgent.
0
marissalille Messages postés 4 Date d'inscription mardi 29 avril 2008 Statut Membre Dernière intervention 3 février 2009
3 févr. 2009 à 15:42
bonjour,
je débute en programmation java et en ce moment j'essaye d'implémenter un proxy qui supporte les requetes http mais je rencontre certaine difficultés , pourrais tu m'envoyer ton code à fin que je puisse m'en inspirer , àa serai tres gentil merci.
voilà en gros ce que j'ai fait, 6 classes ont été défini ( start server, proxy thread, classe reponse, classe requete, proxyclient " coté client" et enfin proxy server "cot" serveur")  le programme se complie  mais qd je teste en local je n'arrive à recupérer toutes les infos.
merci de me donner un coup de pousse.
*********************************************************************************************
public class ProxyServer{

  private Socket socketServer;
  private DataInputStream  serverIn;
  private DataOutputStream  serverOut;
  private String get, host;
  private Requete requete;
  private int port;

public Reponse  Process( Requete requete ){ // méthode qui traite la requeteget host "";
 Reponse r = new Reponse();

      //requete = new Requete();

      // Obtention et transformation de la requête du client
      //readRequete();
      // Connexion avec le serveur
      try {
        URL url = new URL(requete.getUrl());
        int port = url.getPort() > 0 ? url.getPort() : 80;
        socketServer = new Socket(url.getHost(),port);
      }
      catch (Exception e) {
        // Envoi de l'erreur au client
        //PrintWriter out = new PrintWriter(new OutputStreamWriter(clientOut));
        String erreur = new String();
        erreur += ("HTTP/1.0 200 \r\n");
        erreur += ("Content-Type: text/plain \r\n\r\n");
      

        erreur +=("GET:  " + get +" \r\n");
        erreur +=("HOST : " + host+" \r\n");
        erreur +=("Erreur !+\r\n");
        erreur +=(e +"\r\n");
  

       
        try {
      
        if (socketServer != null)
          socketServer.close();
        }
        catch (Exception ex) {}
        r.setreponse(erreur);
        return r ;

      }

try {
// Création flux serveur
      serverIn = new DataInputStream(new BufferedInputStream(socketServer.getInputStream()));
      serverOut = new DataOutputStream(new BufferedOutputStream(socketServer.getOutputStream()));
      // Envoi de la requete au serveur
      new ClientToServerThread(serverOut, requete);
      byte [] reponse = new byte[4096];
      String rep = new String();
      int bytesRead;
      // Lecture des informations du serveur et envoi au client
      while ((bytesRead = serverIn.read(reponse)) != -1) {
          rep += new String(reponse, 0, bytesRead);         
        //clientOut.write(reponse, 0, bytesRead);
        //clientOut.flush();
      }
     
      r.setreponse(rep);
     
      return r;
   
    }
    catch (Exception e) {
      System.out.println("Erreur Client Thread Serveur Proxy sur port : " + port);
    }
    finally {
      try {
     
      
     
        if (socketServer != null)
          socketServer.close();
       
        if (socketServer != null)
          socketServer.close();
      }
      catch (Exception e) {
          System.out.println("Erreur Client Thread Serveur Proxy sur port " + port);
      }
     
 
   
  }     return r;
}

class ClientToServerThread extends Thread{

  private DataOutputStream serverOut;
  private Requete requete;

  public ClientToServerThread(DataOutputStream serverOut, Requete requete) throws Exception {
    this.serverOut = serverOut;
    this.requete = requete;
    start();
  }

  public void run() {
    try {
      PrintWriter out = new PrintWriter(new OutputStreamWriter(serverOut));
     
     
     
        out.println(requete.getMethode()+ " " + requete.getUrl()+ " HTTP/1.0 ");
     
      out.println(); // Envoyer une ligne vierge -> fin de la requête
      out.flush();
    }
    catch (Exception e) {
      System.out.println("Erreur ClientToServerThread : " + e);
    }
  }

}
}
******************************************************************

public class ProxyClient extends Thread{

  private Socket socket;
  private DataInputStream clientIn;
  private DataOutputStream clientOut;
  private String get, host;
  private Requete requete;
  private int port;
  private Reponse reponse;
  static ProxyServer server = new ProxyServer();
 
  public ProxyClient(Socket socket) {
    this.socket = socket;
    port = socket.getPort();
    try {
      // création des flux pour la socket client
      clientIn = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
      clientOut = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
      start();
    }
    catch (IOException e) {
      System.out.println("Erreur IO Client Proxy Server : " + e);
    }
  }

// lecture de la requete

  public void readRequete() throws Exception {
    BufferedReader bin = new BufferedReader(new InputStreamReader(clientIn));
    String line;
    while ((line = bin.readLine()) != null) {
        System.out.println(line);
      if (line.length() == 0)
        break;
       
       if (line.trim().toUpperCase().startsWith("GET")) {
         String url = line.substring(3);
         String rest = "";
         // Obtenir http
         int posit = url.toUpperCase().lastIndexOf("HTTP");
         if (posit >= 0) {
           rest = url.substring(posit).trim();
           url = url.substring(0, posit).trim();
         } else {
           url = url.trim();
         }
         get = url;

         // Création nouveau GET -> GET http://ordinateur.xyz:80/toto.htm HTTP 1.0
         URL getURL = new URL(url);
         requete = new Requete("GET",url);
         System.out.println(socket.getInetAddress().getHostName() + " GET " + url);
         server.Process(requete);
         } else {
        
       }

       // HOST contient l'adresse du serveur
       if (line.trim().toUpperCase().startsWith("HOST:"))
         host = line.substring(5).trim();
    }
  }

public void run(){

reponse = server.Process(requete);
}

}
****************************************************
public class StartServer {

 
  private ProxyThread proxy; // Notre proxy

  public StartServer() {
    // Démarrage des serveurs
    System.out.println("Chargement des services en cours ...");
 
    proxy = new ProxyThread(3128);
  }

  public void stop()
  {
    // Arrêt des services -> interruption des threads
 
    if (proxy.isAlive())
      proxy.interrupt();
  }

  public static void main(String[] args) {
    StartServer server = new StartServer(); // Démarrage du serveur-proxy )
    BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); // Entrée clavier utilisateur
    String command; // Ligne de commande
    boolean done = false;

    try {
      while (!done){
        System.out.print("Commande : ");
        command = input.readLine();
        if (command.toUpperCase().equals("QUIT")) // On saisit 'QUIT' pour quitter !
          done = true;
      }
    }
    catch (Exception e) {
      System.out.println("Erreur MAIN : " + e);
      System.exit(1);
    }
    finally {
      server.stop();
    }
    System.exit(0);
  }
}
***********************************************
public class ProxyThread extends Thread{

  private int port;

  public ProxyThread(int port) {
    this.port = port;
    start(); // On exécute la thread;
  }

  public void run() {
    try {
      System.out.println("Serveur Proxy sur port : " + port + " démarré !");
      ServerSocket server = new ServerSocket(port);
      // On attend l'arrivé d'un client
      while (!interrupted()) {
        Socket client = server.accept();
        System.out.println("Client : " + client.getInetAddress());
        new ProxyClient(client);    // On crée un nouveau client proxy
        sleep(5);
      }
      System.out.println("Serveur Proxy sur port : " + port + " arrêté !");
    }
    catch (IOException e) {
    
    }
    catch (InterruptedException e) {
   
    }
  }
}
*************************************************
public class Requete implements Serializable {
private String methode;
private String url;

public Requete (String methode, String url) {
this.methode = methode;
this.url = url;

}

public String getMethode () {
return methode;
}
public void setMethode(String methode) {
    this.methode = methode;
  }

public String getUrl () {
return url;
}

public void setUrl(String url) {
    this.url = url;
  }
}
*****************************************************************
public class Reponse implements Serializable {
private String reponse;

public Reponse(String reponse) {
this.reponse = reponse;

}
public Reponse() {
   
}
public String getReponse () {
return reponse;
}
public void setreponse(String reponse) {
    this.reponse = reponse;
  }
}
0
hannounamah Messages postés 9 Date d'inscription mercredi 4 février 2009 Statut Membre Dernière intervention 15 avril 2009
10 févr. 2009 à 14:16
Bonjour,
Je
dois développer un proxy en java et en utilisant le framework
HttpClient, ce proxy doit faire la capture dans un fichier xml de tout
le flux des requetes et des réponses lorsqu'on est en communication
avec une application web.
SVP est ce que vous pouvez m'aider, je
sais pas comment je vais le faire.Est ce que quelqu'un peut me proposer
des documents ou un code source qui pourrait m'aider?
Merci d'avance
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bensashi Messages postés 3 Date d'inscription samedi 11 octobre 2003 Statut Membre Dernière intervention 26 mars 2010
19 mars 2010 à 15:19
Je sais deterrage de post ;) mais la réponse à la question initiale est interressante pour moi :


" je ne sais pas est ce que pour la méthode CONNECT il ya un traitement spéciale ou quoi ?
j'espére que vous aller m'aidez ou me diriger vers une source qui peut m'aider car j'en ai besoin.

Merci
"

Si le modérateur passe par la, il vaudrait mieux supprimer les messages n'ayant rien a voir ! que de me dire que " c'est du deterrage de post " ;)


@--'--,---< BeN >---,--'--@
0
Rejoignez-nous