package com.limegroup.gnutella.browser;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.StringTokenizer;
import com.limegroup.gnutella.util.CommonUtils;
/**
* Handle a pure HTTP request
*/
public class HTTPHandler {
/** The relative document root. */
private static final String ROOT = "root/";
private Socket _socket;
private OutputStream _ostream;
private boolean _inErrorState;
private String _line;
/**
* Create and execute the handler without a new thread.
*/
public static HTTPHandler createPage( Socket socket, String content ) {
HTTPHandler handler = new HTTPHandler(socket, null);
handler.handlePage(content);
return(handler);
}
public HTTPHandler( Socket socket, String line ) {
_socket = socket;
_line = line;
_inErrorState = false;
}
/**
* Return a precreated page
*/
public void handlePage(String page) {
// Setup streams
setupIO();
uploadPage(page);
}
private void setupIO() {
try {
_ostream = _socket.getOutputStream();
} catch (IOException e) {
_inErrorState = true;
}
}
/**
* Parse out the path component.
*/
private String getRelativePath( String line ) {
StringTokenizer st = new StringTokenizer( line );
String path = null;
if ( st.hasMoreTokens() )
path = st.nextToken();
else
_inErrorState = true;
return path;
}
/**
* Return the file if a file request. Error out as appropriate.
*/
private void processRequest( File apath, String rpath ) {
// Check to see if this is a control request
String rbase = rpath;
int rloc = rbase.indexOf("?");
if ( rloc > 0 )
rbase = rbase.substring(0, rloc);
if ( !apath.exists() )
_inErrorState =true;
if ( !apath.canRead() )
_inErrorState =true;
if ( _inErrorState )
writeError();
}
/**
* Echo back a page.
*/
public void uploadPage(String page) {
int length = page.length();
byte[] content;
try {
writeHeader(length, getMimeType(".html"));
content = page.getBytes();
_ostream.write(content);
} catch( IOException e ) {
_inErrorState =true;
}
try {
_ostream.close();
} catch( IOException e ) {
}
}
/**
* Setup the few mime-types currently required.
*/
private String getMimeType(String filename) {
if ( filename.endsWith(".gif") )
return "image/gif";
else if ( filename.endsWith(".img") )
return "image/gif";
else if ( filename.endsWith(".js") )
return "application/x-javascript";
else if ( filename.endsWith(".css") )
return "text/css";
return "text/html";
}
/**
* Write a simple header
*/
private void writeHeader(int length, String mimeType) throws IOException {
String str;
str = "HTTP/1.1 200 OK \r\n";
_ostream.write(str.getBytes());
str = "Server: "+CommonUtils.getVendor()+"\r\n";
_ostream.write(str.getBytes());
str = "Content-type:" + mimeType + "\r\n";
_ostream.write(str.getBytes());
str = "Content-length:"+ length + "\r\n";
_ostream.write(str.getBytes());
str = "\r\n";
_ostream.write(str.getBytes());
}
/**
* Write out a 404 error.
*/
public void writeError() {
try {
/* Sends a 404 File Not Found message */
String str;
str = "HTTP/1.1 404 Not Found\r\n";
_ostream.write(str.getBytes());
/**
str = "Server: " + CommonUtils.getVendor() + "\r\n";
_ostream.write(str.getBytes());
str = "Content-Type: text/plain\r\n";
_ostream.write(str.getBytes());
str = "Content-Length: " + 0 + "\r\n";
_ostream.write(str.getBytes());
str = "\r\n";
_ostream.write(str.getBytes());
*/
_ostream.flush();
} catch( IOException e ) {
}
try {
_ostream.close();
} catch( IOException e ) {
}
}
}