package test.http;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.http.HttpHeaders;
import org.eclipse.jetty.http.HttpMethods;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.http.MimeTypes;
import org.eclipse.jetty.io.Buffer;
import org.eclipse.jetty.io.WriterOutputStream;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.util.resource.Resource;
public class ETaggingResourceHandler extends ResourceHandler {
MimeTypes _mimeTypes = new MimeTypes();
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
if (baseRequest.isHandled())
return;
boolean skipContentBody = false;
if (!HttpMethods.GET.equals(request.getMethod())) {
if (!HttpMethods.HEAD.equals(request.getMethod())) {
// try another handler
super.handle(target, baseRequest, request, response);
return;
}
skipContentBody = true;
}
Resource resource = getResource(request);
if (resource == null || !resource.exists()) {
// no resource - try other handlers
super.handle(target, baseRequest, request, response);
return;
}
// We are going to serve something
baseRequest.setHandled(true);
if (resource.isDirectory()) {
response.sendError(HttpStatus.FORBIDDEN_403);
}
// set some headers
long last_modified = resource.lastModified();
if (last_modified > 0) {
long if_modified = request.getDateHeader(HttpHeaders.IF_MODIFIED_SINCE);
if (if_modified > 0 && last_modified / 1000 <= if_modified / 1000) {
response.setStatus(HttpStatus.NOT_MODIFIED_304);
return;
}
}
String etag = calculateETag(resource);
String incomingETag = request.getHeader(HttpHeaders.IF_NONE_MATCH);
if (incomingETag != null) {
if (incomingETag.equals(etag)) {
response.setStatus(HttpStatus.NOT_MODIFIED_304);
return;
}
}
response.setHeader(HttpHeaders.ETAG, etag);
Buffer mime = _mimeTypes.getMimeByExtension(resource.toString());
if (mime == null)
mime = _mimeTypes.getMimeByExtension(request.getPathInfo());
// set the headers
doResponseHeaders(response, resource, mime != null ? mime.toString() : null);
response.setDateHeader(HttpHeaders.LAST_MODIFIED, last_modified);
if (skipContentBody)
return;
// Send the content
OutputStream out = null;
try {
out = response.getOutputStream();
} catch (IllegalStateException e) {
out = new WriterOutputStream(response.getWriter());
}
resource.writeTo(out, 0, resource.length());
}
protected static String calculateETag(Resource resource) {
return Integer.toHexString(Long.toString(resource.length()).hashCode());
}
}