Pour ceux qui ont suivi l'histoire, je suis toujours sur mon foutu proxy! ;-)
Il marchait très bien il y a deux jours. Après j'ai voulu empêcher l'utilisation du cache.
J'ai donc rajouté dans la requete du client un Pragma: no-cache et un Cache-control: no-cache.
Pui j'ai voulu rajouter dans la réponse du serveur un Expires avec une date déjà passée.
Le problème c'est qu'une fois que j'ai changé la réponse du serveur Web et que je la renvoie au client (byte par byte pour avoir des belles images), là, ça ne marche plus !!
Je n'y comprends rien !
Aidez-moi siouplait ;-)
Je mets le code, excusez-moi s'il est un peu long.
// Creation de la socket entre le proxy et le serveur Web
if (host_client != "") {
socket = new Socket(InetAddress.getByName(host_client),port);
System.out.println("socket créé");
}
else if (referer != ""){
socket = new Socket(InetAddress.getByName(referer),port);
System.out.println("socket créé");
} else {
socket = new Socket(InetAddress.getByName(url),port);
System.out.println("socket créé");
}
PrintStream sortant = new PrintStream(socket.getOutputStream());
// On envoie au serveur Web la requete du client
if (host_client != "") {
System.out.println(requete + "\r\n" + user_agent + "\r\n" + "Host: " + host_client + "\r\n" + "Pragma: no-cache" + "\r\n" + "Cache-control: no-cache" + "\r\n");
sortant.println(requete + "\r\n" + user_agent + "\r\n" + "Host: " + host_client + "\r\n" + "Pragma: no-cache" + "\r\n" + "Cache-control: no-cache" + "\r\n");
} else {
System.out.println(requete + "\r\n" + user_agent + "\r\n" + "Pragma: no-cache" + "\r\n" + "Cache-control: no-cache" + "\r\n");
sortant.println(requete + "\r\n" + user_agent + "\r\n" + "Pragma: no-cache" + "\r\n" + "Cache-control: no-cache" + "\r\n");
}
// Lecture de la réponse du serveur Web
PrintStream sout = new PrintStream(client.getOutputStream());
InputStream entrant = socket.getInputStream();
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("monFichier.txt"));
System.out.println("Lecture de la réponse du serveur ...");
byte [] buffer = new byte[4096];
int lus;
String ligne = "";
// on lit byte par byte la réponse du serveur Web et on la met dans monFichier.txt
while ((lus = entrant.read(buffer)) != -1) {
//sout.write(buffer,0,lus);
//System.out.write(buffer,0,lus);
bos.write(buffer, 0, lus);
System.out.println("écriture dans monFichier.txt");
}
bos.flush();
bos.close();
// il faut lire le fichier et chercher s'il y a une ligne Expires pour empecher d'utiliser le cache
FileReader lecteur = new FileReader("monFichier.txt");
BufferedReader entree = new BufferedReader(lecteur);
String texte = "";
// on lit monFichier.txt et on convertit la reponse du serveur en string
while ((ligne = entree.readLine()) != null) {
texte = texte + "\n" + ligne;
}
lecteur.close();
System.out.println("String texte créé ...");
FileWriter fw = new FileWriter("Resultat.txt");
BufferedWriter output = new BufferedWriter(fw);
String regex = "Expires: +(.*)GMT";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(texte);
if (m.find()){
String resultat = texte.replaceAll(m.group(0),"Expires: Thu, 19 Nov 1981 08:52:00 GMT");
//System.out.println("CA PASSE 1 " + resultat);
// on met le resultat dans le fichier Resultat.txt
output.write(resultat);
output.flush();
output.close();
} else {
String regex2 = "(<META (NAME|HTTP-EQUIV)=\"expires\" content=\"never\">)+";
Pattern p2 = Pattern.compile(regex2);
Matcher m2 = p2.matcher(texte);
if (m2.find()){
System.out.println("CA PASSE 2");
//System.out.println(m2.group(0));
String resultat = texte.replaceAll(m2.group(0),"<META NAME=\"expires\" content=\"0\">");
//System.out.println(resultat);
output.write(resultat);
output.flush();
output.close();
} else {
// rien n'est spécifié pour Expires, on doit rajouter la ligne Expires: Thu, 19 Nov 1981 08:52:00 GMT
System.out.println("CA PASSE 3");
Pattern p3 = Pattern.compile("\\s");
String[] items = p3.split(texte,5);
/*System.out.println("items[0] " + items[0]);
System.out.println("items[1] " + items[1]);
System.out.println("items[2] " + items[2]);
System.out.println("items[3] " + items[3]);
System.out.println("items[4] " + items[4]);*/
output.write(items[1] + " " + items[2] + " " + items[3] + "\n");
//System.out.println(items[1] + " " + items[2] + " " + items[3] + "\n");
// j'insere cette ligne après HTTP/1.1 200 OK par exemple
output.write("Expires: Thu, 19 Nov 1981 08:52:00 GMT\n");
//System.out.println("Expires: Thu, 19 Nov 1981 08:52:00 GMT\n");
output.write(items[4]);
//System.out.println(items[4]);
output.flush();
output.close();
}
}
// Le fichier resultat est prêt, il faut l'envoyer byte par byte au client
FileInputStream lire = new FileInputStream ("Resultat.txt");
int octet;
while ((octet = lire.read()) != -1) {
sout.write(octet);
//System.out.write(octet);
//System.out.println("fin de l'envoi au client");
}
lire.close();
socket.close();
System.out.println("socket.close();");
quand je recharge une page, déjà elle a une drole de gueule car tout est déformé. Mais ce qui est bizarre c'est qu'elle est jamais déformée pareil à chaque fois. Comme s'il y avait un décalage dans la lecture du fichier ou un truc de ce genre.
Est-ce que quelqu'un voit une erreur dans mon code ?
J'ai rajouté des flush a chaque fois que j'ecrit dans un fichier, ça change rien.
Trouvez des réponses à vos questions sur les langages, les frameworks et les astuces de codage. Échangez avec d'autres développeurs passionnés pour améliorer vos compétences en programmation et rester au fait des dernières tendances du secteur.