package Interface; //**************************************************************************** // Programmer: Duane M. Gran, ragnar@cs.bsu.edu // Program: JhttpServer // Date: April 24, 1998 //**************************************************************************** import java.net.*; import java.io.*; import java.util.*; //**************************************************************************** // Class: JhttpWorker // Purpose: Takes an HTTP request and executes it in a separate thread //**************************************************************************** public class JhttpWorker extends Thread{ public String fileName = null; public String methodType = null; public String httpVersion = "http/1.0"; private Socket client; public int fileLength, returnCode; private boolean logging; private WebInterface webinterface; public JhttpWorker(Socket client, boolean logging, WebInterface webinterface) { this.client=client; this.logging=logging; this.webinterface=webinterface; } public void run(){ HTTPResponse resp = new HTTPResponse(); BufferedReader in = null; OutputStream out = null; resp.returnCode = 200; resp.sentBytes = 0; try { in = new BufferedReader( new InputStreamReader( client.getInputStream())); out = client.getOutputStream(); } catch(IOException e){ // I'm not too good at HTTP. Normally, we should put some // error code here. Anyway, I have assumed that an error // is equivalent to an unhandled request / method (501) resp.returnCode = 501; } if(resp.returnCode == 200){ // call the appropriate hanndler switch(method(in)){ case 0: if (webinterface.specialRequest(fileName)) { String newfile=webinterface.handleresponse(fileName, out, resp); if (newfile!=null) { HTTPServices.GET_handler(newfile, out, resp); } } else HTTPServices.GET_handler(fileName, out, resp); break; case 1: HTTPServices.HEAD_handler(fileName, out, resp); break; case 2: HTTPServices.POST_handler(fileName, out, resp); break; default: resp.returnCode = 501; //error } try{ out.flush(); if (logging) LogFile.write_log(client,methodType,fileName,httpVersion, resp.returnCode,resp.sentBytes); out.close(); in.close(); client.close(); } catch(IOException e){ ; // do nothing } } // System.out.println(fileName + " is going to finish"); // debug } //***************************************************************************** // Function: method() // Purpose: Open an InputStream and parse the request made. // Note: Regardless of what method is requested, right now it performs a // GET operation. // Calls: // Returns: Boolean value for success or failure //***************************************************************************** private int method(BufferedReader in){ int ret = -1; try{ String line; // read just the first line line = in.readLine(); // only spaces used StringTokenizer tok = new StringTokenizer(line, " "); if (tok.hasMoreTokens()) // make sure there is a request { String str = tok.nextToken(); if ( str.equals("GET") ){ ret = 0; methodType = "GET"; } else if ( str.equals("HEAD") ){ ret = 1; methodType = "HEAD"; } else if ( str.equals("POST") ){ ret = 2; methodType = "POST"; } else{ System.out.println("501 - unsupported request:" +str); return -1; } } else{ // System.out.println("Request from browser was empty!"); return -1; } // get the filename if (tok.hasMoreTokens()) { fileName = tok.nextToken(); if(fileName.equals("/")) { fileName = "/index.html"; } } else { // this is weird... why am i taking the first character of // the filename if there are no more tokens? // - catch should take care of this fileName = fileName.substring(1); } // read the http version number // - right now nothing is done with this information if (tok.hasMoreTokens()) { httpVersion = tok.nextToken(); } else { httpVersion = "http/1.0"; // default } // read remainder of the browser's header // - nothing done right now with this info... placeholder while((line = in.readLine()) != null) { StringTokenizer token = new StringTokenizer(line," "); // do processing here if(!token.hasMoreTokens()) { break; } } } catch(Exception e){ System.err.println(e); return -1; } return ret; } }