Wednesday, February 22, 2012

Programming Project 1: Multi-threaded Webserver Part 1

HttpRequest.java

package clavetter;
import java.io.*;
import java.net.*;
import java.util.*;



public final class HttpRequest implements Runnable {

    final static String CRLF = "\r\n";
    Socket socket;
   
    //constructor
   
    public HttpRequest(Socket socket) throws Exception
    {
        this.socket = socket;
    }
   
    public void run()
    {
    try{
        processRequest();
    } catch(Exception e) {
        System.out.println(e);
    }
       
       
       
    }
   
    private void processRequest() throws Exception
    {
        InputStream is = socket.getInputStream();
        DataOutputStream os = new DataOutputStream(socket.getOutputStream());
       
        //Setup input stream filters
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        //Get the request line of HTTP request message
        String requestLine = br.readLine();
       
        System.out.println();
        System.out.println(requestLine);
       
        // 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();
        System.out.println(fileName);
        // Prepend a "." so that file request is within the current directory.
        fileName = "." + fileName;


       
//comment out when done       
        // Get and display the header lines.
        //String headerLine = null;
        //while ((headerLine = br.readLine()).length() != 0) {
            //System.out.println(headerLine);
    //    }
//comment ^^^^^ out when done   
       
        // Open the requested file.
        FileInputStream fis = null;
        boolean fileExists = true;
        try {
            fis = new FileInputStream(fileName);
        } catch (FileNotFoundException e) {
            fileExists = false;
        }

        // Construct the response message.
        String statusLine = null;
        String contentTypeLine = null;
        String entityBody = null;
        if (fileExists) {
            statusLine = "HTTP/1.1 200 OK: ";
            contentTypeLine = "Content-Type: " +
                contentType( fileName ) + CRLF;
        } else {
            statusLine = "HTTP/1.1 404 Not Found: ";
            contentTypeLine = "Content-Type: text/html"+ CRLF;
            entityBody = "<HTML>" +
                "<HEAD><TITLE>Not Found</TITLE></HEAD>" +
                "<BODY>Not Found</BODY></HTML>";
        }
        // 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);
        }



       
       
       
   
        DataOutputStream outToClient = new DataOutputStream(socket.getOutputStream());
        outToClient.writeBytes("HTTP/1.1 200 OK");
        outToClient.writeBytes("Content-Length: 100");
        outToClient.writeBytes("Content-Type: text/html\n\n");
        outToClient.writeBytes("<html><body><h1>My First Heading</h1><p>My first paragraph</p></body></html>");
        outToClient.close();
        os.close();
        br.close();
        socket.close();
       
    }
   
   
   
   

private static String contentType(String fileName)
{
    if(fileName.endsWith(".htm") || fileName.endsWith(".html")) {
        return "text/html";
    }
    if(fileName.endsWith(".png")) {
        return "image/png";
    }
    if(fileName.endsWith(".gif")) {
        return "image/gif";
    }
    if(fileName.endsWith(".jpg")|| fileName.endsWith(".jpeg")) {
        return "image/jpeg";
    }
    return "application/octet-stream";
}

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);
   }
}




}

No comments:

Post a Comment