You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
yacy_search_server/source/net/yacy/http/ContentModHandler.java

88 lines
2.5 KiB

package net.yacy.http;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.HandlerContainer;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.HandlerWrapper;
/**
* jetty http handler:
* Handles Server-side Includes, used for trickling display of search results
*/
public abstract class ContentModHandler extends HandlerWrapper implements Handler, HandlerContainer {
public ContentModHandler() {
super();
}
public ContentModHandler(Handler h) {
super();
this.setHandler(h);
}
@Override
public void handle(String target, Request baseRequest, HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
// wrap response
ContentModResponseWrapper wrapped_response = new ContentModResponseWrapper(response);
super.handle(target, baseRequest, request, wrapped_response);
wrapped_response.commit(this, request, response);
}
protected abstract void doContentMod(byte[] in, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException ;
private class ContentModResponseWrapper extends HttpServletResponseWrapper {
private HttpServletResponse wrappedResponse;
private ByteArrayServletOutputStream wrappedOutputStream = new ByteArrayServletOutputStream();
public ContentModResponseWrapper(HttpServletResponse response) {
super(response);
wrappedResponse = response;
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
return wrappedOutputStream;
}
public void commit(ContentModHandler cmh, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
cmh.doContentMod(wrappedOutputStream.getBuffer(), request, response);
}
}
private class ByteArrayServletOutputStream extends ServletOutputStream {
private ByteArrayOutputStream buffer = new ByteArrayOutputStream();
public ByteArrayServletOutputStream() {
super();
}
@Override
public void write(int b) throws IOException {
buffer.write(b);
}
public void write(byte[] b) throws IOException {
buffer.write(b);
}
public byte[] getBuffer() {
return buffer.toByteArray();
}
}
}