Requete et reponse a travers un proxy

hannounamah Messages postés 9 Date d'inscription mercredi 4 février 2009 Statut Membre Dernière intervention 15 avril 2009 - 17 févr. 2009 à 15:12
nadiajolie Messages postés 1 Date d'inscription lundi 31 mars 2008 Statut Membre Dernière intervention 30 juin 2009 - 30 juin 2009 à 16:33
salut
Je dois développer un proxy en java pour faire les taches suivantes

1- mettre en écoute  un ServerSocket sur un port  (pour recuperer les requettes http).

2-  récupérer la requete http( eventuellement  l'entete + le corp de la requete  en cas d'une  méthode  POST).

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

4- envoyer  la requete http a ce  serveurs

5- récupérer la réponse ( entete + corp) du serveur

6- envoyer cette  réponse au client.

7-faire la capture de tout les flux entre client et serveur(requetes et réponses) dans un fichier xml
Je suis arrivée à récupérer les informations de la requete et de la réponse et a les afficher dans la console mais j'ai un probleme a ce niveau: les informations s'affichent en plusieurs étapes, alors que  je veux que la requete soit exécutée et la réponse soit retournée complètement au client et apres se fait l'affichage des informations
Merci d'avance pour votre aide

4 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
17 févr. 2009 à 15:32
Salut,

Il te faut bufferiser les informations de la requête (dans une String ou une List par exemple) avant de les utiliser
______________________________________
DarK Sidious
0
hannounamah Messages postés 9 Date d'inscription mercredi 4 février 2009 Statut Membre Dernière intervention 15 avril 2009
17 févr. 2009 à 15:48
merci pour ta réponse mais est ce que tu peux m'expliquer plus
voici ma classe

public class ProxyServerClientThread extends Thread{

  private Socket socket, socketServer;
  private DataInputStream clientIn;
  private DataOutputStream clientOut;
  private String get,host, method ,url, httpversion,parameters;
  private int port;
  Vector<String> headersrequest = new Vector<String>();//vector for request's headers
  Vector<String> vectrequest= new Vector<String>();//vector for request's informations like method, url, http version
  Vector<String> responsevector= new Vector<String>();//vector for response's informations
  Vector<String> parametersrequest= new Vector<String>();//vector for request's parameters to send with the post method
 
 
  public ProxyServerClientThread(Socket socket) {
    this.socket = socket;
    port = socket.getPort();
    try {
      // create the flow for the 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);
    }
  }

  /**
   * methode qui lit la requete et en extrait les infos
  */
  private void readRequest() throws Exception {
     
         InputStreamReader inputstreamreader =new InputStreamReader(clientIn);
         BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
         String line;
       
       
        while ((line=(bufferedreader.readLine()))  != null)
             {
             
                 if (line.length() == 0)
                     break;
               
                 //put all headers in a vector
                else if((line.contains("Accept"))||
                       (line.contains("Accept-Language"))||
                       (line.contains("Accept-Encoding"))||
                       (line.contains("User-Agent"))||
                       (line.contains("Referer"))||
                       (line.contains("Host"))||
                       (line.contains("Proxy-Connection"))||
                       (line.contains("Accept-Charset"))||
                       (line.contains("Content-Type")))
               
                                headersrequest.addElement(line);
                               
                 else if((line.trim().toUpperCase().startsWith("GET"))||(line.trim().toUpperCase().startsWith("POST")))
                 {
                     if(line.trim().toUpperCase().startsWith("GET"))
                         {
                         method=line.substring(0,3);
                          url=line.substring(3);
                         }
                     else if(line.trim().toUpperCase().startsWith("POST"))
                         {
                         method=line.substring(0,4);
                         url=line.substring(4);
                         }
                     
                     System.out.println("url before substring :"+url);//search for parameters to send with the post method
                     int positsearch=url.indexOf("search");
                     int posit = url.toUpperCase().lastIndexOf("HTTP");
                     httpversion=url.substring(posit).trim();
                     if (posit >= 0)
                         url = url.substring(0, posit).trim();
                        else
                         url = url.trim();
                     if (positsearch >= 0)
                         {
                         parameters=url.substring(positsearch+7, posit);
                         System.out.println("parameters :"+parameters);//search for parameters to send with the post method
                         String[] arrayparams=parameters.split("&");
                         for(int j=0;j<arrayparams.length;j++)
                             {parametersrequest.add(arrayparams[j]);
                             System.out.println("new param in req :"+parametersrequest.elementAt(j));
                             }
                         }
                     get = url;
                 }
               
                 vectrequest.addElement(method);
                 vectrequest.addElement(url);
                 vectrequest.addElement(httpversion);
               
        
             }//end while
      
   URL getURL = new URL(url);
        
 }

       public void run() {
           try {           get host "";
           MethodGet methodget;
           MethodPost methodpost;
        
           // have the request
              readRequest();
         
              if(method.equalsIgnoreCase("GET"))
           {
               System.out.println("/****httpclient exucute the getmethod***/");
               methodget=new MethodGet(get, headersrequest);
               responsevector=methodget.run();// run() est une methode dans la class
                                            //MethodGet qui execute la requete et retourne la reponse dans un vector
              
           }
              
           else if (method.equalsIgnoreCase("POST"))
           {
               System.out.println("/***httpclient exucute the postmethod****/");
               methodpost=new MethodPost(get, headersrequest,parametersrequest);
               methodpost.run();
           }
   
       System.out.println("/***send response to client****/");
              clientOut.writeBytes(responsevector.elementAt(0));//responsevector.elementAt(0) est la reponse du serveur sous forme de string
                                                        //et elle va etre retournée au client
              clientOut.flush();

              
             
              Read read=new Read(headersrequest, vectrequest,responsevector);//cette classe contient la methode readInformations() qui
                                            //fait l'affichage des infos de la requete et de la reponse
                                            //c ce code que je veux qu'il s'execute apres que la reponse soit totalement retournée
              read.readInformations();
          

           }
            catch (Exception e) {
              System.out.println("Erreur Client Thread Serveur Proxy sur porttt : " + port);
            }
            finally {
              try {
                if (clientIn != null)
                  clientIn.close();
                if (clientOut != null)
                  clientOut.close();
                if (socket != null)
                  socket.close();
                if (socketServer != null)
                  socketServer.close();
                if (socket != null)
                  socket.close();
                if (socketServer != null)
                  socketServer.close();
              }
              catch (Exception e) {
                  System.out.println("Erreur Client Thread Serveur Proxy sur port " + port);
              }
            }
           
       }     
}
merci
0
hannounamah Messages postés 9 Date d'inscription mercredi 4 février 2009 Statut Membre Dernière intervention 15 avril 2009
17 févr. 2009 à 15:50
merci pour ta réponse mais est ce que tu peux m'expliquer plus
voici ma classe

public class ProxyServerClientThread extends Thread{

  private Socket socket, socketServer;
  private DataInputStream clientIn;
  private DataOutputStream clientOut;
  private String get,host, method ,url, httpversion,parameters;
  private int port;
  Vector<String> headersrequest = new Vector<String>();//vector for request's headers
 
Vector<String> vectrequest= new Vector<String>();//vector
for request's informations like method, url, http version
  Vector<String> responsevector= new Vector<String>();//vector for response's informations
 
Vector<String> parametersrequest= new
Vector<String>();//vector for request's parameters to send with
the post method
 
 
  public ProxyServerClientThread(Socket socket) {
    this.socket = socket;
    port = socket.getPort();
    try {
      // create the flow for the 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);
    }
  }

  /**
   * methode qui lit la requete et en extrait les infos
  */
  private void readRequest() throws Exception {
     
         InputStreamReader inputstreamreader =new InputStreamReader(clientIn);
         BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
         String line;
       
       
        while ((line=(bufferedreader.readLine()))  != null)
             {
             
                 if (line.length() == 0)
                     break;
               
                 //put all headers in a vector
                else if((line.contains("Accept"))||
                       (line.contains("Accept-Language"))||
                       (line.contains("Accept-Encoding"))||
                       (line.contains("User-Agent"))||
                       (line.contains("Referer"))||
                       (line.contains("Host"))||
                       (line.contains("Proxy-Connection"))||
                       (line.contains("Accept-Charset"))||
                       (line.contains("Content-Type")))
               
                                headersrequest.addElement(line);
                               
                 else if((line.trim().toUpperCase().startsWith("GET"))||(line.trim().toUpperCase().startsWith("POST")))
                 {
                     if(line.trim().toUpperCase().startsWith("GET"))
                         {
                         method=line.substring(0,3);
                          url=line.substring(3);
                         }
                     else if(line.trim().toUpperCase().startsWith("POST"))
                         {
                         method=line.substring(0,4);
                         url=line.substring(4);
                         }
                     
                     System.out.println("url before substring :"+url);//search for parameters to send with the post method
                     int positsearch=url.indexOf("search");
                     int posit = url.toUpperCase().lastIndexOf("HTTP");
                     httpversion=url.substring(posit).trim();
                     if (posit >= 0)
                         url = url.substring(0, posit).trim();
                        else
                         url = url.trim();
                     if (positsearch >= 0)
                         {
                         parameters=url.substring(positsearch+7, posit);
                         System.out.println("parameters :"+parameters);//search for parameters to send with the post method
                         String[] arrayparams=parameters.split("&");
                         for(int j=0;j<arrayparams.length;j++)
                             {parametersrequest.add(arrayparams[j]);
                             System.out.println("new param in req :"+parametersrequest.elementAt(j));
                             }
                         }
                     get = url;
                 }
               
                 vectrequest.addElement(method);
                 vectrequest.addElement(url);
                 vectrequest.addElement(httpversion);
               
        
             }//end while
      
   URL getURL = new URL(url);
        
 }

       public void run() {
           try {           get host "";
           MethodGet methodget;
           MethodPost methodpost;
        
           // have the request
              readRequest();
         
              if(method.equalsIgnoreCase("GET"))
           {
               System.out.println("/****httpclient exucute the getmethod***/");
               methodget=new MethodGet(get, headersrequest);
               responsevector=methodget.run();// run() est une methode dans la class
                                            //MethodGet qui execute la requete et retourne la reponse dans un vector
              
           }
              
           else if (method.equalsIgnoreCase("POST"))
           {
               System.out.println("/***httpclient exucute the postmethod****/");
               methodpost=new MethodPost(get, headersrequest,parametersrequest);
               methodpost.run();
           }
   
       System.out.println("/***send response to client****/");
   
         
clientOut.writeBytes(responsevector.elementAt(0));//responsevector.elementAt(0)
est la reponse du serveur sous forme de string
                                                        //et elle va etre retournée au client
              clientOut.flush();

              
             
   
          Read read=new Read(headersrequest,
vectrequest,responsevector);//cette classe contient la methode
readInformations() qui
                                            //fait l'affichage des infos de la requete et de la reponse
   
                                        //c ce code que je veux qu'il
s'execute apres que la reponse soit totalement retournée
              read.readInformations();
          

           }
            catch (Exception e) {
              System.out.println("Erreur Client Thread Serveur Proxy sur porttt : " + port);
            }
            finally {
              try {
                if (clientIn != null)
                  clientIn.close();
                if (clientOut != null)
                  clientOut.close();
                if (socket != null)
                  socket.close();
                if (socketServer != null)
                  socketServer.close();
                if (socket != null)
                  socket.close();
                if (socketServer != null)
                  socketServer.close();
              }
              catch (Exception e) {
                  System.out.println("Erreur Client Thread Serveur Proxy sur port " + port);
              }
            }
           
       }     
}
merci
0
nadiajolie Messages postés 1 Date d'inscription lundi 31 mars 2008 Statut Membre Dernière intervention 30 juin 2009
30 juin 2009 à 16:33
Bonjour

j'aimerais utliser ton appli,  par contre je ne comprend pas comment t'as implémenté ton programme, par ex la classe MethodGet je ne vois pas sa définition et Read aussi

merci
0