package photato.controllers;
import java.io.IOException;
import java.net.URLDecoder;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpException;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.protocol.HttpContext;
import org.apache.http.protocol.HttpRequestHandler;
import photato.helpers.PathHelper;
import photato.helpers.Tuple;
public abstract class PhotatoHandler implements HttpRequestHandler {
protected static final Response http403 = new Response(403, new StringEntity("<html><body><h1>Forbidden/h1></body></html>", ContentType.create("text/html", "UTF-8")));
protected static final Response http404 = new Response(404, new StringEntity("<html><body><h1>Not found</h1></body></html>", ContentType.create("text/html", "UTF-8")));
protected static final Response http500 = new Response(500, new StringEntity("<html><body><h1>Server error</h1></body></html>", ContentType.create("text/html", "UTF-8")));
protected static class Response {
public final int responseCode;
public final HttpEntity entity;
public final Header[] headers;
public Response(int responseCode, HttpEntity entity, Header... headers) {
this.responseCode = responseCode;
this.entity = entity;
this.headers = headers;
}
}
protected final String prefix;
private final Set<String> allowedVerbs;
public PhotatoHandler(String prefix, String[] allowedVerbs) {
this.prefix = prefix.endsWith("/") ? prefix.substring(0, prefix.length() - 1) : prefix;
this.allowedVerbs = new HashSet<>(Arrays.asList(allowedVerbs));
}
@Override
public final void handle(HttpRequest request, HttpResponse response, HttpContext context) throws HttpException, IOException {
if (!this.allowedVerbs.contains(request.getRequestLine().getMethod().toUpperCase())) {
response.setStatusCode(http403.responseCode);
response.setEntity(http403.entity);
} else {
Tuple<String, Map<String, String>> pathAndQueryTuple = PathHelper.splitPathAndQuery(request.getRequestLine().getUri().substring(this.prefix.length()));
String path = pathAndQueryTuple.o1;
Map<String, String> query = pathAndQueryTuple.o2;
if (this.isAuthorized(path, query)) {
try {
Response res = getResponse(path, query);
response.setStatusCode(res.responseCode);
response.setHeaders(res.headers);
response.setEntity(res.entity);
} catch (Exception ex) {
response.setStatusCode(http500.responseCode);
response.setEntity(http500.entity);
ex.printStackTrace();
}
} else {
response.setStatusCode(http403.responseCode);
response.setEntity(http403.entity);
}
}
}
protected boolean isAuthorized(String path, Map<String, String> query) {
return true;
}
protected abstract Response getResponse(String path, Map<String, String> query) throws Exception;
}