import java.io.*; import java.net.*; import java.util.*; import java.lang.*; public class HttpProtocol { PrintWriter out= null; BufferedReader in= null; private Socket MySocket; OutputStream outputstream=null; File webRootDirector=null; long contLength; byte[] contL; /*public OutputStream getOutputStream() { return outputstream; }*/ public HttpProtocol (Socket MySocket, BufferedReader in,PrintWriter out){ this.in=in; this.out=out; this.MySocket=MySocket; } public void processInput(){ // InputStream streamin= mySocket.getInputStream(); // if (streamin==null) return; //BufferedReader in=new BufferedReader(new InputStreamReader(streamin)); try{ StringTokenizer tok=new StringTokenizer(in.readLine()); if (!tok.hasMoreTokens()) respond(HTTP_BADREQUEST,"Wrong Syntax.Try :GET /foo/doublefoo/foo.html"); String method =tok.nextToken(); if (!tok.hasMoreTokens()) respond(HTTP_BADREQUEST,"Wrong Syntax.No URI defined.Try :GET /foo/doublefoo/foo.html"); String Uri = decodeUri1(tok.nextToken()); Properties parameter =new Properties(); int erotimatiko=Uri.indexOf('?'); if(erotimatiko>=0){ decodeUri2(Uri.substring(erotimatiko+1),parameter); Uri = decodeUri1(Uri.substring(0,erotimatiko)); } Properties header=new Properties(); if(tok.hasMoreTokens()) { String epomgram=in.readLine(); while(epomgram.trim().length()>0){ int anwkatw=epomgram.indexOf(':'); header.put(epomgram.substring(0,anwkatw).trim(),epomgram.substring(anwkatw+1).trim()); epomgram=in.readLine(); } } if(method.equalsIgnoreCase("POST")) decodeUri2(in.readLine(),parameter); if(!method.equalsIgnoreCase("POST")&& !method.equalsIgnoreCase("GET")) respond(HTTP_BADREQUEST,"Bad Request:we only support GET or POST methods"); Response resp=serving(Uri,method,header,parameter); if(resp==null) respond (HTTP_INTERNALERROR,"An Internal Server Error has occured: server returned a null response"); else{System.out.println(resp.status); System.out.println(resp.mimeType); System.out.println(resp.data); sendResponse(resp.status,resp.mimeType,resp.header,resp.data); //in.close(); }//// prosekse pou einai to try .elekse kala ta { } }catch(IOException e){ try{ respond(HTTP_INTERNALERROR, "SERVER INTERNAL ERROR: IOException: " + e.getMessage()); }catch ( Throwable t ) {} } catch ( InterruptedException ie ) { } } //problima me parentheseis private void respond( String status, String msg ) throws InterruptedException { sendResponse( status, MIME_PLAINTEXT, null, new ByteArrayInputStream( msg.getBytes())); throw new InterruptedException(); } private void sendResponse(String status,String mime,Properties header,InputStream data){ try { // OutputStream out= mySocket.getOutputStream(); // PrintWriter print=new PrintWriter(out); //pws tha to paroume apo th my server thread ayto.. opws kai to in // OutputStream eee=setOutputStream(os); System.out.println("HTTP/1.1 "+status+"\r\n"); out.print("HTTP/1.1 "+status+"\r\n");//allakseee toooo out.print("Content-Type: " + mime + "\r\n"); if(header==null || header.getProperty("Date")==null) out.print("Date:"+gmtFrmt.format(new Date())+"\r\n"); if(header!=null){ Enumeration e =header.keys(); while(e.hasMoreElements()){ String key=(String)e.nextElement(); String value =header.getProperty(key); out.print(key+":"+value+"\r\n"); } } out.print("r\n"); out.flush(); if(data!=null){ // byte[] buffer=new byte[2048]; while(true){ int read =data.read(contL,0,(int)contLength); if (read<=0) break; //OutputStream mprizola=new BufferedOutputStream(MySocket.getOutputStream()); (MySocket.getOutputStream()).write(contL,0,read); } } (MySocket.getOutputStream()).flush(); (MySocket.getOutputStream()).close(); //if(data!=null) //data.close(); } catch (IOException ioe){ try{ MySocket.close(); }catch(Throwable t){} } } /* //if not perl File f = new File(httpRootDir,requestedFile);//dimiourgia arxeiou me orismata ton trexonta // katalogo kai to antistoixo arxeio zitisis byte[] theData = new byte[(int) f.length( )];//dimourgia pinaka byte me megethos //to megethos tou arxeiou zitisis z=theData.length;//mikos tou pinaka aparaitito gia to HEADER if (f.canRead()==false)//diabasma arxeiou : anepitixes void sendFile(byte[] theData,File f) { //sinaritisi aposotilis tou arxeiou pou zitithike apo ton client try { DataInputStream fista = new DataInputStream(new BufferedInputStream( new FileInputStream(f))); OutputStream raw = new BufferedOutputStream(client.getOutputStream( )); sendResponseHeader(contentType);//stelnei to aparaitito header ston client fista.readFully(theData); //diabazei ton pinaka byte pou iparxei sti sinartisi diadikasia_arxeiou fista.close(); raw.write(theData);//stelnei ta dedomena tou pinaka raw.flush(); } catch(IOException e) { System.out.println("error sending"); } } */ private String decodeUri1(String string) throws InterruptedException{ try { StringBuffer buff=new StringBuffer(); for(int i=0;i=0) p.put(decodeUri1(next.substring(0,ison)).trim(),decodeUri1(next.substring(ison+1))); } } public Response serving (String Uri,String method,Properties header,Properties parameter){ //gia na blepoume ki emeis ti ginetai System.out.println(method+" "+Uri); Enumeration enume=header.propertyNames(); while(enume.hasMoreElements()){ String mtbl=(String)enume.nextElement(); System.out.println("header :"+mtbl+" = "+header.getProperty(mtbl)+"\n");} enume=parameter.propertyNames(); while(enume.hasMoreElements()){ String mtbl=(String)enume.nextElement(); System.out.println("header :"+mtbl+" = "+parameter.getProperty(mtbl)+"\n");} return sendingNow(Uri,header,new File(".")); } public Response sendingNow(String Uri,Properties header,File webRootDirect){ //prwtos elegxos an ontws yparxei to arxiko directory if(!webRootDirect.isDirectory()){return new Response(HTTP_INTERNALERROR,MIME_PLAINTEXT,"Internal Error :given webRootDirectory is not a directory");} //katharizoume ligo to uri gia na broume to path sthn poria enw orizoume gia fileseparator to "/" Uri=Uri.trim().replace(File.separatorChar,'/'); if (Uri.indexOf('?')>=0){Uri=Uri.substring(0,Uri.indexOf('?'));} //prosexoume na mhn eksipiretoume ../ uri pou bgainoun apo to root tou webserver mas if(Uri.startsWith("..")||Uri.indexOf( "../" ) >= 0) return new Response(HTTP_FORBIDDEN,MIME_PLAINTEXT,"Server doesn't allow <..> characters"); File f = new File( webRootDirect, Uri ); //ftiaxnoume ena path xrisimopoiwntas to url if (!f.exists()) return new Response(HTTP_NOTFOUND,MIME_PLAINTEXT,"Error 404 file not found."); //koitame an yparxei to file mas if (f.isDirectory()){ //koitame an yparxei to index.html h to index.htm se periptwsh pou mas exdei dwthei mono to directory if (new File(f,"index.html").exists()) f=new File(webRootDirect,Uri+"index.html");//prosthetoume me ayton ton tropo sto uri to index.html kai ayto to kanoume //path mesw ths file to opoio elegxoume an yparxei ontws.to idio kai gia tin index.htm else if (new File(f,"index.htm").exists()) f=new File(webRootDirect,Uri+"index.htm"); //an den yparxei index file kanoume list to directory se morfi html else { String[] arxeia_ola=f.list(); String msg ="

Directory " + Uri + "


"; if(Uri.length()>1){ String path=Uri.substring(0,Uri.length()-1); //bgazoume to teleytaio "/" int slas=path.lastIndexOf('/'); if (slas>=0 && slas..
"; // ftiaxnoume to link gia ton prohgoumeno fakelo } for (int i=0; i" + arxeia_ola[i] + ""; // to kanoume encode gia na leitourgisei san link gia to ekastote arxeio } return new Response(HTTP_OK,MIME_HTML,msg); } } String mime=null; int tel=Uri.lastIndexOf('.'); if (tel<0||tel>Uri.length()) mime=MIME_DEFAULT_BINARY; if (tel>=0) mime=(String)getMimeTypes.get(Uri.substring(tel+1).toLowerCase()); try{ FileInputStream file=new FileInputStream(f); contL=new byte[(int) f.length()]; contLength=contL.length; System.out.println(contLength); String stringlenth=String.valueOf(contLength); System.out.println(stringlenth); Response resp= new Response(HTTP_OK,mime,file); resp.putHeader("Content-length",stringlenth);//""+ f.length()); // resp1.header.put("Content-length",""+ f.length()); System.out.println(contLength); return resp; }catch (IOException e){ return new Response(HTTP_FORBIDDEN, MIME_PLAINTEXT, "FORBIDDEN: failed to serve the requested file." ); } } private static Hashtable getMimeTypes = new Hashtable(); static { StringTokenizer st = new StringTokenizer( "htm text/html "+ "html text/html "+ "txt text/plain "+ "asc text/plain "+ "gif image/gif "+ "jpg image/jpeg "+ "jpeg image/jpeg "+ "png image/png "+ "mp3 audio/mpeg "+ "m3u audio/mpeg-url " + "pdf application/pdf "+ "doc application/msword "+ "ogg application/x-ogg "+ "zip application/octet-stream "+ "exe application/octet-stream "+ "class application/octet-stream " ); while ( st.hasMoreTokens()) getMimeTypes.put( st.nextToken(), st.nextToken()); } private static java.text.SimpleDateFormat gmtFrmt; static { gmtFrmt = new java.text.SimpleDateFormat( "E, d MMM yyyy HH:mm:ss 'GMT'", Locale.US); gmtFrmt.setTimeZone(TimeZone.getTimeZone("GMT")); } public static final String HTTP_OK = "200 OK", HTTP_REDIRECT = "301 Moved Permanently", HTTP_FORBIDDEN = "403 Forbidden", HTTP_NOTFOUND = "404 Not Found", HTTP_BADREQUEST = "400 Bad Request", HTTP_INTERNALERROR = "500 Internal Server Error", HTTP_NOTIMPLEMENTED = "501 Not Implemented"; public static final String MIME_PLAINTEXT = "text/plain", MIME_HTML = "text/html", MIME_DEFAULT_BINARY = "application/octet-stream"; } class Response{ String HTTP_OK = "200 OK"; public String status; // meta thn antistoixish twn dynatwn timwn se metabliti p.x 200 OK public String mimeType; // edw apothikeyoume times opws to "text/plain" public InputStream data; public Properties header;// arxikopoioume edw gia na ftiaksoume methodo prosthesis ki allwn timwn sthn header //kataskeyastes public Response(){this.status=HTTP_OK;}//gia data kai mime null public Response(String status,String mimeType,InputStream data){ this.status=status; this.mimeType=mimeType; this.data=data;} public Response(String status,String mimeType,String message){ this.status=status; this.mimeType=mimeType; this.data=new ByteArrayInputStream(message.getBytes());} //xrhsimopoioume mia methodo gia na mporoume na prosthetoume ston hashtable headers public void putHeader(String mtbl,String value){ header.put( mtbl, value); } }