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