// David Tate
// Jordan v. 1.0 December 2000
// A *very* simple web server that takes
// only GET requests.  Provides nothing else
// and offers no security restrictions, so 
// be careful. Doesn't speak full HTTP either.

import java.net.*;
import java.io.*;
import java.util.*;

public class Jordan {
	public static void main (String argv[]) throws IOException {
		ServerSocket ss = null;
		try {
			ss = new ServerSocket(Integer.parseInt(argv[0]));
		}
		catch(ArrayIndexOutOfBoundsException ae) {
			System.out.println("Usage: java Jordan port");
			System.exit(0);
		}
		
		while(true)
			new JordanConnection(ss.accept()).start();
	}
};

class JordanConnection extends Thread {
	Socket client;
	
	JordanConnection(Socket client) throws SocketException {
		this.client = client;
		setPriority(NORM_PRIORITY - 1);
	}
	
	public void run() {
		try {
			BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream(), "8859_1"));
			OutputStream out = client.getOutputStream();
			PrintWriter pout = new PrintWriter(new OutputStreamWriter(out, "8859_1"), true);

			String request = in.readLine();
			System.out.println("Request: " + request);

			String tmpRequest = in.readLine();
			while(tmpRequest != null) {
				System.out.println("request line: " + tmpRequest);
				tmpRequest = in.readLine();
			}
			
			StringTokenizer st = new StringTokenizer(request);
			if ((st.countTokens() >= 2) && (st.nextToken().equals("GET"))) {
				if ((request = st.nextToken()).startsWith("/"))
					request = request.substring(1);
				if (request.endsWith("/") || request.equals(""))
					request = request + "index.html";
				try {
					FileInputStream fis = new FileInputStream(request);
					byte[] data = new byte[fis.available()];
					fis.read(data);
					out.write(data);
					out.flush();
				}
				catch(FileNotFoundException e) {
					System.out.println("404 Object Not Found");	
				}
			}
			else
				pout.println("400 Bad Request");
			client.close();
		} 
		catch (IOException e) {
			System.out.println("I/O error" + e);		
		}	
	}
}

