diff --git a/cs654/lab3/HttpRequest.class b/cs654/lab3/HttpRequest.class new file mode 100644 index 0000000..ac57730 Binary files /dev/null and b/cs654/lab3/HttpRequest.class differ diff --git a/cs654/lab3/HttpRequest.java b/cs654/lab3/HttpRequest.java new file mode 100644 index 0000000..ba82ced --- /dev/null +++ b/cs654/lab3/HttpRequest.java @@ -0,0 +1,131 @@ +import java.io.* ; +import java.net.* ; +import java.util.* ; + +final class HttpRequest implements Runnable +{ + final static String CRLF = "\r\n"; + Socket socket; + + // Constructor + public HttpRequest(Socket socket) throws Exception + { + this.socket = socket; + } + + // Implement the run() method of the Runnable interface. + public void run() + { + try { + processRequest(); + } catch (Exception e) { + System.out.println(e); + } + } + + private void processRequest() throws Exception + { + // Set up output stream + DataOutputStream os = new DataOutputStream(socket.getOutputStream()); + + // Set up input stream filters. + BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); + + // Get the request line of the HTTP request message. + String requestLine = br.readLine(); + + // Extract the filename from the request line. + StringTokenizer tokens = new StringTokenizer(requestLine); + tokens.nextToken(); // skip over the method, which should be "GET" + String fileName = tokens.nextToken(); + + // Prepend a "." so that file request is within the current directory. + fileName = "." + fileName ; + + // Open the requested file. + FileInputStream fis = null ; + boolean fileExists = true ; + try { + fis = new FileInputStream(fileName); + } catch (FileNotFoundException e) { + fileExists = false ; + } + + // Debug info for private use + System.out.println("Incoming!!!"); + System.out.println(requestLine); + String headerLine = null; + while ((headerLine = br.readLine()).length() != 0) { + System.out.println(headerLine); + } + + // Construct the response message. + String statusLine = null; + String contentTypeLine = null; + String entityBody = null; + if (fileExists) { + statusLine = "HTTP/1.0 200 OK" + CRLF; + contentTypeLine = "Content-Type: " + + contentType(fileName) + CRLF; + } else { + statusLine = "HTTP/1.0 404 Not Found" + CRLF; + contentTypeLine = "text/html" + CRLF; + entityBody = "" + + "Not Found" + + "Not Found"; + } + // Send the status line. + os.writeBytes(statusLine); + + // Send the content type line. + os.writeBytes(contentTypeLine); + + // Send a blank line to indicate the end of the header lines. + os.writeBytes(CRLF); + + // Send the entity body. + if (fileExists) { + sendBytes(fis, os); + fis.close(); + } else { + os.writeBytes(entityBody) ; + } + + // Close streams and socket. + os.close(); + br.close(); + socket.close(); + } + + private static void sendBytes(FileInputStream fis, + OutputStream os) throws Exception + { + // Construct a 1K buffer to hold bytes on their way to the socket. + byte[] buffer = new byte[1024]; + int bytes = 0; + + // Copy requested file into the socket's output stream. + while ((bytes = fis.read(buffer)) != -1) { + os.write(buffer, 0, bytes); + } + } + + private static String contentType(String fileName) + { + if(fileName.endsWith(".htm") || fileName.endsWith(".html")) { + return "text/html"; + } + + if(fileName.endsWith(".gif")) { + return "image/gif"; + } + + if (fileName.endsWith(".jpg") || fileName.endsWith(".jpeg")) + { + return "image/jpeg"; + } + + return "application/octet-stream" ; + } +} + diff --git a/cs654/lab3/WebServer.class b/cs654/lab3/WebServer.class new file mode 100644 index 0000000..81746ef Binary files /dev/null and b/cs654/lab3/WebServer.class differ diff --git a/cs654/lab3/WebServer.java b/cs654/lab3/WebServer.java new file mode 100644 index 0000000..2eb1deb --- /dev/null +++ b/cs654/lab3/WebServer.java @@ -0,0 +1,38 @@ +import java.io.* ; +import java.net.* ; +import java.util.* ; + +public final class WebServer +{ + private static final int DEFAULT_PORT = 8080; + + public static void main(String argv[]) throws Exception + { + // Get the port number from the command line. + int port = (argv.length > 0) + ? (new Integer(argv[0])).intValue() + : DEFAULT_PORT; + + // Establish the listen socket. + ServerSocket socket = new ServerSocket(port); + + // Process HTTP service requests in an infinite loop. + while (true) + { + // Listen for a TCP connection request. + Socket connection = socket.accept(); + + // Construct an object to process the HTTP request message. + HttpRequest request = new HttpRequest(connection); + + // Create a new thread to process the request. + Thread thread = new Thread(request); + + // Start the thread. + thread.start(); + } + } +} + + +