begin process at 2010 02 09 19:19:13
  Trouver un code source :
 
dans
 
Accueil > Forum > 

JAVA / J2EE / J2ME

 > 

Réseau & internet

 > 

Internet

 > 

Problème de flux sur requete POST dans mon proxy


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Problème de flux sur requete POST dans mon proxy

mardi 30 décembre 2008 à 07:22:07 | Problème de flux sur requete POST dans mon proxy

minimoi114

Bonjour a tous,

Je réalise actuellement un petit proxy qui me permettra d'analyser les requêtes HTTP sur mon ordinateur. Pour gagnier du temps j'ai repris un code que j'ai trouvé sur ce site (http://www.javafr.com/codes/SERVEUR-PROXY-HTTP-SERVEUR-HORAIRE_15669.aspx) et je l'est complété.

Cependant ce proxy avait une faille c'est qu'il ne transférait pas le corps de la requête HTTP, ce qui rendait les requetes POST érronées. J'ai modifié le code pour qu'il prenne en charge les requetes POST mais ca ne marche pas car le stream (du socket) ne retourne plus rien apres l'entete ce que je ne comprend pas....

Dès que j'actualise la page de mon navigateur une deuxieme fois, le premier stream (de la premiere requete post) se complete, et le deuxieme bloque comme le premier juste avant. J'ai passé des heures a essayer de comprendre mais je n'y arrive pas.

J'ai essayé de récupérer le corps (apres le saut de ligne entre le corps et le header) directement via son DataInputStream (httpQuery) sous forme de tableau d'octet : sans succes, ca bloque l'appli comme la methode .readLine(). (line = bin.readLine()). Donc le stream est vraiment vide.

La methode .available() me retourne 0.

Si vous pourriez me mettre sur la piste du problème ca serait génial

Merci d'avance!

Voici le code de cette partie du programme:

private void readQuery(DataInputStream httpQuery) throws Exception {
        BufferedReader bin = new BufferedReader(new InputStreamReader(httpQuery));
        String line;
        boolean processUrl = false;
        int contentLength = 0;
       
        boolean isHeader = true; // Indique si il s'agit de l'entete HTTP
       

        while ((line = bin.readLine()) != null) {
       
            /*
             * On transforme la requete du client car il ne s'agit pas de
             * transmettre au serveur l'URL complï¿?te mais juste l'ï¿?lï¿?ment
             * ï¿? tï¿?lï¿?charger, c'est pourquoi on reconstruit la ligne GET
             */
            if (line.trim().toUpperCase().startsWith("GET")) {
                this.queryType = "GET";
                processUrl = true;
            }
            if (line.trim().toUpperCase().startsWith("POST")) {
                this.queryType = "POST";
                processUrl = true;
            }

            if (processUrl == true) {
                String url = line.substring(this.queryType.length());
                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);
                this.header.add(this.queryType + " " + getURL.getFile() + " " + rest);               
               
                //System.out.println(socket.getInetAddress().getHostName()
                    //    + " GET " + url);
                processUrl = false;
            }
            else
            {
   
                if (isHeader) {
                    if (line.equals("")) {
                        // Il s'agit de la séparation entre l'entete et le corps
                        // (un saut de ligne)
                        isHeader = false; // Ce saut de ligne sera rajouté lors de la concaténation
                       
                        if(!this.queryType.equals("POST"))
                        {
                            break;
                        }
                    } else {
                        // On sépare l'entete du corps
                        this.header.add(line);
                    }
                } else {
                    // On récupère le corps de la requete
                    this.body.add(line);

                }
            }

            // HOST contient l'adresse du serveur
            if (line.trim().toUpperCase().startsWith("HOST:")) {
                host = line.substring(5).trim();
            }
           
            if (line.trim().toUpperCase().startsWith("CONTENT-LENGTH:")) {
                contentLength = Integer.parseInt(line.substring(15).trim());
            }
           
        }
       
        /*
// Voici comment j'ai tenté de récupérer le corps directement via le
DataInputStream
       // On récupère le corps
        byte[] bodyBuffer = new byte[256];
        int bytesRead = 0;
        String stringBuffer;
       
        this.body.add("");
        while(bytesRead < contentLength)
        {
            stringBuffer = "";
            bytesRead += httpQuery.read(bodyBuffer, 0, (contentLength - bytesRead));
           
            for(int i=0;i<=256;i++)
            {
                stringBuffer += Byte.toString(bodyBuffer[i]);
            }
            // Non complet vue que la methode read bloque
            if(stringBuffer.contains("\r\n"))
            // Premiere ligne
            this.body.add("");
        }
        //this.body.add();*/

       
    }


Voici a titre d'exemple une requete HTTP de type POST:

POST /demo/backend/index.php?action=process HTTP/1.1
Host: host.demo.fr
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5 FirePHP/0.2.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Proxy-Connection: keep-alive
Referer: http://host.demo.fr/demo/backend/index.php?action=process
Cookie: osCsid=sus3pi1dttoubgbsdk6hogn0u1; osCsid=i79brnvn44qucelkf3go16ln35; user[total_panier]=0%26nbsp%3B%26euro%3B; user[text_article]=article; user[nb_article]=0; PHPSESSID=pn3aah9sejkfofghdgiticlfs7; fe_typo_user=f8bb5ef112
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 23

login=eee&password=eeee




Cette discussion est classée dans : url, http, post, line, if


Répondre à ce message

Sujets en rapport avec ce message

Connection HTTP +Accès à un serveur [ par dom22 ] dom22Bonjour vous tous . Actuellement je suis en stage pour un mois encore et je ne sais plus comment progresser. Je dois charger un lien internet ou Installation eclipse.... [ par bebelle ] Bonjour, hier j'ai installe eclipse sur ma machine, c etait la premiere fois pour moi.Je me pose une question: Dans quel repertoire dois-je l'installe Installation eclipse.... [ par bebelle ] Bonjour, hier j'ai installe eclipse sur ma machine, c etait la premiere fois pour moi.Je me pose une question: Dans quel repertoire dois-je l'installe ouvrir un url dans internet explorer [ par asx9 ] asx9bonjour,dans mon programme l'utilisateur ouvre l'url :http://localhost/pageprincipalesi une condition n'est pas valide, alors je le redirige direc depuis un menu applet ouvrir les pages dans _blank [ par talula ] Bonjour à tous,J'ai téléchargé un menu applet super sympa (je trouve)mais le problems est qu'il ouvre les liens sur lui même c'est à dire dans la fram URL et flux XML [ par dyfred ] Bonjour, Je travaille sur une application qui fonctionne avec des servlets qui renvoient du XML. Cependant, j'aimerai pouvoir gérer les appels à ce transformer Flux en Images [ par critters ] bonjour, je tente de récupérer le flux qui sort de là : http://194.3.160.22/home/homeJ.htmlou plus précisemment de là http://194.3.160.22/image?interv Emploi, ma boite recrute [ par JBAware ] Bonjour,Je travaille pour une société de service de renommée internationale (Je vous assure, je mens pas). Pour l'histoire l'entreprise est internatio infos jtable [ par benohite ] bonjour a tous,je viens de tomber sur un site ou l on trouve des classe qui permettent l utilisation d une jtable de facon simpleje n est pas encore t URL et GET [ par sheorogath ] bonjour a tous,je fais un programme qui recupere un flux de radio gratuite sur le web (shoutcast)et je voudrais recuperer les titre en lecture :j'ai d


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,608 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales