import java.io.*; import java.net.*; import java.util.*; /** * Tiny HTTPD server. * DO NOT DEPLOY AS A REAL SERVER. * * @author JBY * @version 1.0 */ public class httpd implements Runnable { public static final int PORT = 8888; public static final String serverID; public static final String prefix; public static final String specialPrefix; public static int gid; static { gid = 1; serverID = "HTTPD demo v1.0, please hack me..."; prefix = "/Users/yunes/public_html"; specialPrefix = "/~yunes"; } private int id; private Socket s; public httpd(Socket s) { this.s = s; this.id = gid++; System.out.println(id+" New connection"); } public void run() { try { BufferedReader bf = new BufferedReader(new InputStreamReader(s.getInputStream())); PrintWriter pw = new PrintWriter(s.getOutputStream()); main_loop: while(true) { // should really be timeout controlled Vector<String> request = new Vector<String>(); do { // request-line + header-lines catching code String s = bf.readLine(); if (s==null) break main_loop; if (s.equals("")) break; // end of request block request.add(s); // System.out.println(id+">>>>>>>>>>>>>>>"+s); } while(true); // request de-construction StringTokenizer st = new StringTokenizer(request.elementAt(0)); String method = st.nextToken(); if (method.equals("GET")) { // GET method response code // do some URL rewriting String rawURL = st.nextToken(); String url = rawURL; // remove trailing special values if (url.indexOf('?')!=-1) url = url.substring(0,url.indexOf('?')); // private demo special ~ trick removal if (url.startsWith(specialPrefix)) url = url.substring(specialPrefix.length()); System.out.println(id+">>>>>>>>>>>>>url="+url); // add demo special prefix url = prefix+url; System.out.println(id+">>>>>>>>>>>>>file="+url); File f = new File(url); if (f.exists()) { pw.println("HTTP/1.1 200 OK"); pw.println("Server: "+serverID); pw.println("Content-Length: "+(int)f.length()); pw.println(); FileReader fr = new FileReader(f); char [] buffer = new char[(int)f.length()]; fr.read(buffer); pw.print(buffer); } else { System.err.println(id+" "+rawURL+" not found"); pw.println("HTTP/1.1 404 Not Found"); String msg = "<html><head><title>404 Not Found</title><body>"+ rawURL+" not found.</body></html>"; pw.println("Content-Length: "+msg.length()); pw.println("Server: "+serverID); pw.println(); pw.print(msg); } } else { // method not supported here System.err.println(id+"Method "+method+" not supported"); pw.println("HTTP/1.1 405 Method Not Allowed"); String msg = "<html><head><title>405 Method not allowed</title><body>"+ method+" actually not supported.</body></html>"; pw.println("Content-Length: "+msg.length()); pw.println("Server: "+serverID); pw.println(); pw.print(msg); } pw.flush(); } bf.close(); pw.close(); System.out.println(id+" rip"); } catch(Exception e) { System.err.println(id+"erreur dans le service"); e.printStackTrace(); } } public static void main(String []args) { System.out.println("NEVER USE THIS SERVER ON ANY PUBLIC MACHINE, SERIOUS SECURITY HOLES INSIDE"); try { ServerSocket ss = new ServerSocket(PORT); while (true) { Socket s = ss.accept(); new Thread(new httpd(s)).start(); } } catch(Exception e) { e.printStackTrace(); } } }