rendered paste bodyimport java.io.*;
import java.net.*;
import java.util.*;
public class Proxy {
private ServerSocket server; // proxy's socket
private Socket conn; // socket gia thn sundesh tou proxy me ton client(browser)
private Socket remote_server; // sockets tou remote server
private int port; // port sto opoio akouei o proxy
private StringBuffer Request; // to request pou mas dinei o client( browser)
private StringBuffer Response; // h apanthsh pou mas epistrefei o remote server
private String hostname;// pou tha periexei to zhtoumeno host px - > www.ceid.upatras.gr
BufferedInputStream clientIn;
BufferedOutputStream clientOut;
String line1=null;//apo8ikeuoume thn prwth grammh
String line2=null;// apo8ikeuoume thn deuterh grammh
public Proxy(int port) throws IOException { // costruct tou proxy gia na arxikopoiithei
this.port = port;
server = new ServerSocket(port);
Request = new StringBuffer("");
}
public void startProxy() throws IOException {
while(true) {
//String host;
conn = server.accept(); // o proxy akouei kainouries sundeseis pou ginontai sto port
// arxikopoioume ta streams
clientIn = new BufferedInputStream(conn.getInputStream());
clientOut = new BufferedOutputStream(conn.getOutputStream());
//diabazoume prwta olh thn aithsh
getRequest();
parseFirstLine(line1); // Kanei tokenizing sthn prwth grammh px -> GET http:/www.ceid.upatras.gr HTTP/1.0
parseLine(line2);
// tipwse ta headers
System.out.println(Request.toString());
// anoigoume socket ston host sto port 80
//String host = "www.yale.edu";
remote_server = new Socket(InetAddress.getByName(hostname), 80);
BufferedInputStream fromServer = new BufferedInputStream(remote_server.getInputStream());
BufferedOutputStream toServer = new BufferedOutputStream(remote_server.getOutputStream());
// prowthoume ston server to request
toServer.write(Request.toString().getBytes(), 0, Request.toString().getBytes().length);
toServer.flush();
int c;
Response = new StringBuffer(""); //arxikopoiise ton buffer pou 8a apothikeusei thn apanthsh tou server
// diavazoume tin apantisi - enan enan xaraktires
while ((c = fromServer.read()) != -1)
Response.append((char)c);
// steile ta pisw ston client
clientOut.write(Response.toString().getBytes(), 0, Response.toString().getBytes().length);
clientOut.flush();
//kleise oles tis sindeseis
clientIn.close();
clientOut.close();
toServer.close();
fromServer.close();
System.out.println("Done");
}
}
// i main sinartisi tou programmatos
public static void main(String [] args) {
try {
Proxy pr = new Proxy(Integer.parseInt(args[0])); // to port sto opoio akouei o proxy
pr.startProxy();//ksekina h diadikasia tou Proxy
} catch (IOException e) { System.out.println(e.toString()); }
}
private void getRequest() throws IOException { //xrhsimopoiw flag gia na ksexwrizw gia poia grammh ths aithshs anaferomai
String line;
int flag=1;
while ((line = readLine(clientIn)) != null ) {
if (line.length() == 0)
{
Request.append("\r\n");
break;
}
if (flag==1){
line1=line;//bazoume thn 1h grammh
flag=2;
break;
}
else if (flag==2){
line2=line; //bazoume thn 2h grammh
flag=3;
break;
}
else{
System.out.println("Diabasma ths upoloiphs aithshs!!");
break;
}
}// kleinei to while
Request.append(line + "\r\n");//auto ginetai se olh thn aithsh
}
private void parseFirstLine(String line1)// Kanei tokenizing sthn prwth grammh px -> GET http:/www.ceid.upatras.gr/marianna HTTP/1.0
{
System.out.println("Command = "+line1);
StringTokenizer st = new StringTokenizer(line1);
String method =st.nextToken().toUpperCase(); // periexei thn GET
String url = st.nextToken(); //
String version = st.nextToken(); // periexei to HTTP 1.0
}
private void parseLine(String line2){
System.out.println(line2);
StringTokenizer st = new StringTokenizer(line2,":");
String h=st.nextToken().toUpperCase(); // periexei thn GET
hostname = st.nextToken();
System.out.println("congratulation!!!!!!");
}
// diavazei mia grammi kathe fora apo to stream
private String readLine(BufferedInputStream in) throws IOException {
StringBuffer data = new StringBuffer("");
int c;
in.mark(1);
if (in.read() == -1)
return null;
else
in.reset();
while ((c = in.read()) >= 0) {
if ((c == 0) || (c == 10) || (c == 13))
break;
else
data.append((char)c);
}
if (c == 13) {
in.mark(1);
if (in.read() != '\n')
in.reset();
}
return data.toString();
}
}