// This code is provided "as is" with NO WARRANTY expressed or // implied. You may use it freely at your own risk. import java.io.*; import java.net.*; import java.util.*; import java.text.*; public class Kevin { public static int getContentLen(String line) throws NumberFormatException { String l = line.substring(line.indexOf(": ") + 2 ); return (Integer.parseInt(l)); } public static void main(String args[]) { try { int port = Integer.parseInt(args[0]); System.out.println("Implementing on port " + port); ServerSocket ss = new ServerSocket(port); System.out.println("Server Socket initialized"); String protocol = ""; String filename = ""; for(;;) { Socket client = ss.accept(); System.out.println("Got a request"); BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); PrintWriter out = new PrintWriter(new OutputStreamWriter(client.getOutputStream())); out.println("HTTP/1.0 200 "); out.println("Content-Type: text/html"); out.println(); String line; int cLen = 0; while ((line = in.readLine()) != null) { System.out.println(line); if (line.indexOf("GET") >= 0) { protocol = "get"; filename = Kevin.getFileName(line); } // out.println(line); if (line.indexOf("ength: ") >= 0) { cLen = Kevin.getContentLen(line); } if (line.length() == 0) break; } if (cLen > 0) { char[] buffer = new char[cLen]; in.read(buffer, 0, cLen); line = new String(buffer); // out.println(line); } if (protocol.compareTo("get") == 0) { try { BufferedReader getter = new BufferedReader(new FileReader(filename)); while ((line = getter.readLine()) != null) { out.println(line); } } catch(Exception any) { System.out.println("Error reading get file: " + any.getMessage()); } } out.flush(); out.close(); in.close(); client.close(); } } catch (NumberFormatException n) { System.err.println(n); } catch (Exception e) { System.err.println(e); } } public static String getFileName(String line) { StringTokenizer st = new StringTokenizer(line); String fn = ""; int count = 0; while (st.hasMoreTokens()) { count++; if (count == 2) { return st.nextToken(); } else fn = st.nextToken(); } return ""; } }