package fr.umlv.ji.tcp.server.http;
import fr.umlv.ji.tcp.server.*;
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.*;
import java.util.logging.*;
import java.util.prefs.Preferences;
public class HTTPService implements Service {
protected int timeout;
protected Server server;
protected MIMEHelper mimeHelper;
private static final Class[] ARGS_TYPES =
new Class[] {Request.class, Response.class};
public HTTPService(Server s) throws IOException {
server = s;
timeout = s.getPreferences().getInt("socketTimeout", 10000);
mimeHelper = new MIMEHelper(s);
}
public void serve(Socket socket) {
try {
socket.setSoTimeout(timeout);
Request request = new Request(socket.getInputStream(), this);
Response response = new Response(socket.getOutputStream());
do {
request.readHeaders();
if (request.getContentLength() > 0)
request.readContent();
treat(request, response);
response.send();
} while(!response.isClosed());
} catch (IOException ioe) {
} catch (URISyntaxException e) {
server.getLogger().log(Level.WARNING,
Thread.currentThread().toString(), e);
} finally {
if (socket != null) {
try {socket.close();} catch (IOException e) { }
}
}
}
private void treat(Request request, Response response)
throws IOException {
response.reset(); String s = request.getMethod();
if (s.matches("(POST)|(GET)|(HEAD)")) {
URIHandler handler = getURIHandler(request);
try {
Method method =
handler.getClass().getMethod(s.toLowerCase(), ARGS_TYPES);
method.invoke(handler, new Object[] {request, response});
if (!request.isKeepAlive()) response.close();
} catch (Exception exception) {
response.setError(Response.BAD_REQUEST);
}
} else {
response.setError(Response.BAD_REQUEST);
}
}
protected URIHandler getURIHandler(Request request)
throws IOException {
return new FileURIHandler(this);
}
public Logger getLogger() {
return server.getLogger();
}
public Preferences getPreferences() {
return server.getPreferences();
}
public MIMEHelper getMIMEHelper() {
return mimeHelper;
}
}