import java.io.*; import java.net.*; import java.text.*; import java.util.*; public class ServeurProxyMiroir implements Runnable { public static final String proxyNom="wwwcacheetu.univ-orleans.fr"; public static final int proxyPort=3128, port=1111; public static int compteur=0; int id; Socket sock; FileOutputStream mirroriseur; ServeurProxyMiroir(Socket s) throws Exception { id=++compteur; sock=s; InetAddress ia=s.getInetAddress(); loge("["+id+"] : connexion avec "+ia.getHostName()+ "("+ia.getHostAddress()+":"+s.getPort()+")"); mirroriseur=new FileOutputStream("miroir."+id); } int transfert(InputStream in, OutputStream out) throws Exception { int lu=in.read(); if (lu!=-1) { out.write((byte)lu); mirroriseur.write((byte)lu); } return lu; } String getLine(InputStream in,OutputStream out) throws Exception { byte[] buffer=new byte[1000]; int i=0; int lu; do { lu=transfert(in,out); if (lu==-1) return null; if ((lu!=13)&&(lu!=10)) buffer[i++]=(byte)lu; } while (lu!=10); return new String(buffer,0,i); } int transmet(InputStream in,OutputStream out,String ent) throws Exception { /* retour : -1 : connexion interrompu 0 : connexion terminée 1 : connexion encours */ boolean contenu=false, ouvert=false; int taille=0; String lecture; do { if ((lecture=getLine(in,out))!=null) { loge(ent+lecture); ouvert=ouvert||lecture.equals("Proxy-Connection: keep-alive"); contenu=contenu||lecture.startsWith("Content-Type:"); if (lecture.startsWith("Content-Length: ")) taille=Integer.parseInt(lecture.substring(16)); } } while ((lecture!=null)&&!lecture.equals("")); if (lecture==null) return -1; if (!contenu) return (ouvert)?1:0; if (ouvert&&(taille==0)) { loge(ent+"======> ouvert et taille=0"); return 1; } while (taille-->0) if (transfert(in,out)==-1) return -1; if (ouvert) return 1; while (transfert(in,out)!=-1); return 0; } public void run() { String message="["+id+"] : "; try { Socket proxy=new Socket(proxyNom,proxyPort); Socket s1=sock, s2=proxy; transmet(s1.getInputStream(),s2.getOutputStream(),"["+id+"C] : "); mirroriseur.write("===============================================================================\n".getBytes()); Socket aux=s1; s1=s2; s2=aux; transmet(s1.getInputStream(),s2.getOutputStream(),"["+id+"P] : "); /* while (!fini) { switch (transmet(s1.getInputStream(),s2.getOutputStream(), "["+id+"] : ")) { case -1: message+="connexion fermée par ?."; fini=true; break; case 0: message+="fin de connexion."; fini=true; break; case 1: mirroriseur.write("===============================================================================".getBytes()); Socket aux=s1; s1=s2; s2=aux; } } */ message+="fin de connexion."; sock.close(); proxy.close(); } catch(Exception e) { message+="ERREUR "+e; } loge(message); } public static void loge(String message) { String dh=new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date()); System.err.println(dh+" "+message); } public static void main(String[] args) throws Exception { ServerSocket ss=new ServerSocket(port); for (;;) { try { (new Thread(new ServeurProxyMiroir(ss.accept()))).start(); } catch(Exception e) { loge(e.toString()); } } } }