    //Dans la suite de mes tutos sur le HTTP, voici l'arme ultime :

    /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++
    +             The POSTman v1 par sirius_black           +
    + No licence, Open Source, GPL et tout ce qu'on veut :) +
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

    import java.net.*; //on charge les librairies réseau pour avoir le type Socket et le type URL
    import java.io.*; //on charge les Entrées/Sorties standards pour pouvoir utiliser les différents flux (Stream)
    public class HttpClient{ //On déclare une classe HttpClient qui possède son propre point d'entrée
        URL url; //On déclare une variable de type URL qui nous permettra de décomposer une URL
        Socket socket; //Notre Socket
        String texte; //String qui récupérera le résultat de notre requête
        String req; //La String qui contiendra notre requête
        int port; //le port HTTP (généralement 80)
        InputStream input; //InputStream et OutputStream sont les flux de base. Ils ne peuvent pas être instancié
        OutputStream output; // (pas de new()) car ce sont des classes dites 'abstraites'.
        BufferedReader breader; // Les classes Buffered* sont des classes filles des classes InputStream* et OutputStream*
                                // elles même filles de InputStream et OutputStream
        BufferedWriter bwriter;

        public static void usage() //On arrive ici si il n'y a pas le bon nombre d'arguments
        {
    	    System.out.println("Usage: java HttpClient complete_URL [headers_to_send]");
    	    System.out.println("\tcomplete_URL must look like:");
    	    System.out.println("\thttp://host/page.ext?variable1=value1&variable2=value2");
    	    System.out.println("\n\theaders_to_send must look like:");
    	    System.out.println("\thead1:value1&head2:value2");
    	    System.exit(0); //On quitte
    // Le programme sert à transformer une méthode GET en méthode POST. On l'utilise de cette façon :
    // java HttpClient http://www.google.fr/main/index.php?login=toto&pass=titi Referer:http://membres.lycos.fr/lotfree&User-Agent:POSTman1
        }

        public void sendReq() //la fonction qui enverra nos données
        {
    	    try{
    	        req=req.concat("\r\n"+url.getQuery()+"\r\n\r\n"); //on ajoute les variables à la requête
                System.out.println("--------------------Requête-------------------");
    	        System.out.println(req); //on l'affiche
    	        output.write(req.getBytes()); // on envoie notre requête sous la forme d'une suite de Byte à notre
                                              // flux de sortie lié à notre socket
    	        texte=new String(); // l'allocation ne se fait pas obligatoirement dans le constructeur
    	        texte=breader.readLine(); //Le type BufferedReader permet de faire une lecture ligne après ligne
                while(texte!=null){ //tant que ya de quoi lire on lit
    		        System.out.println(texte); //et on l'affiche
    		        texte=breader.readLine(); //c ici kon lit
    	        }
    	    }
    	    catch(IOException ex){
                System.out.println(System.err);
    	    }
        }

    //ya une belle surcharge du constructeur par là :)

        public HttpClient(String param1,String param2) //Le constructeur avec deux arguments : URL_avec_données et headers
        {
    	    this(param1); //On fait appel au constructeur avec un seul argument (toujours appeler en premier dans ce cas)
    	    param2=param2.replaceAll("&","\r\n"); //On découpe les headers avec le '&' comme spérarateur
    	    req=req.concat(param2+"\r\n");
        }

        public HttpClient(String param) //Constructeur appelé dans tous les cas (param= URL_avec_données)
        {
    	    try{
    	        url=new URL(param);
                //On transforme la String passée en argument en une variable de type URL qui nous permettra de récupérer
                // nom d'hôte, déterminer le port, récupérer les arguments, le chemin de la page sur le serveur etc
                // /!\ Attention : l'URL passée en argument doit commencer par 'http://'
                System.out.println("Host: "+url.getHost()); //On affiche les données trouvées
    	        if(url.getPort()==-1)port=80; //Si le port n'est pas spécifié, on prend le 80 par défaut
    	        else port=url.getPort();
    	        System.out.println("Port: "+port);
    	        System.out.println("Path: "+url.getPath());
    	        System.out.println("Query: "+url.getQuery());
    	        socket=new Socket(url.getHost(),port); // Constructeur de la Socket : Socket(String host,int port)

    	        input=socket.getInputStream(); //On lie un flux d'entrée à notre Socket (pas de new car classe InputStream abstraite)
    	        breader=new BufferedReader(new InputStreamReader(input));
                // A partir du Stream de base on crée un InputStreamReader à partir duquel on crée un BufferedReader

                //Pareil avec les flux de sortie. Il n'est pas rare de voire ce genre de constructions en Java
    	        output=socket.getOutputStream();
    	        bwriter=new BufferedWriter(new OutputStreamWriter(output));

                //La requête POST est formée selon le standard HTTP/1.1
    	        req=new String("POST /"+url.getPath()+" HTTP/1.1\r\nHost: "+url.getHost()+"\r\n");
    	        req=req.concat("Content-Type:application/x-www-form-urlencoded\r\n");
    	        req=req.concat("Content-Length:"+(url.getQuery()).length()+"\r\n");
                //Le prog plante s'il n'y a pas de données (après le ?)
    	    }
    	    catch(Exception exp){exp.printStackTrace();System.out.println(System.err);}
            //Les exceptions permettent de gérer les erreurs. Il est obligatoire de les mettre quand cela est demandé
            //Le compilateur dit automatiquement si une instruction nécessite que l'on utilise une exception
            //et quel type d'exception doit être utilisé
        }

        public static void main(String args[]) //Le point d'entrée
        {
    	    HttpClient connexion=null;
    	    if (args.length==0 || args.length>2) usage(); // si ya pas le bon nombre d'arguments on affiche l'aide
            if (args.length==1) connexion=new HttpClient(args[0]); //Si ya un seul argument
    	    if (args.length==2) connexion=new HttpClient(args[0],args[1]); //Si yen a 2
            connexion.sendReq(); // Dans tout les cas (si on a les arguments) on envoie la requête
        }
    }