diff --git a/source/net/yacy/http/ContentModHandler.java b/source/net/yacy/http/ContentModHandler.java new file mode 100644 index 000000000..f67206212 --- /dev/null +++ b/source/net/yacy/http/ContentModHandler.java @@ -0,0 +1,87 @@ +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(); + } + + } + +} diff --git a/source/net/yacy/http/HttpServer.java b/source/net/yacy/http/HttpServer.java index 6dabfd9bf..51401ee10 100644 --- a/source/net/yacy/http/HttpServer.java +++ b/source/net/yacy/http/HttpServer.java @@ -2,11 +2,15 @@ package net.yacy.http; import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.server.handler.DefaultHandler; import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.server.handler.ResourceHandler; import org.eclipse.jetty.server.nio.SelectChannelConnector; +/** + * interface to embedded jetty http server + */ public class HttpServer { private Server server = new Server(); @@ -27,8 +31,12 @@ public class HttpServer { resource_handler.setResourceBase("htroot/"); + ContextHandler context = new ContextHandler(); + context.setContextPath("/"); + context.setHandler(new SSIHandler(new TemplateHandler())); + HandlerList handlers = new HandlerList(); - handlers.setHandlers(new Handler[] { new TemplateHandler(), resource_handler, new DefaultHandler() }); + handlers.setHandlers(new Handler[] { context, resource_handler, new DefaultHandler() }); server.setHandler(handlers); } diff --git a/source/net/yacy/http/SSIHandler.java b/source/net/yacy/http/SSIHandler.java new file mode 100644 index 000000000..c695aaa03 --- /dev/null +++ b/source/net/yacy/http/SSIHandler.java @@ -0,0 +1,81 @@ +/** + * SSIHandler + * Copyright 2011 by Michael Peter Christen; mc@yacy.net, Frankfurt a. M., Germany + * First released 13.04.2011 at http://yacy.net + * + * $LastChangedDate$ + * $LastChangedRevision$ + * $LastChangedBy$ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + +package net.yacy.http; + +import java.io.IOException; +import java.io.OutputStream; + +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.eclipse.jetty.server.Handler; +import org.eclipse.jetty.server.HandlerContainer; + +import net.yacy.kelondro.util.ByteBuffer; + +public class SSIHandler extends ContentModHandler implements Handler, HandlerContainer { + + public SSIHandler(Handler h) { + super(h); + } + + @Override + protected void doContentMod(final byte[] in, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + ByteBuffer buffer = new ByteBuffer(in); + OutputStream out = response.getOutputStream(); + int off = 0; // starting offset + int p = buffer.indexOf("".getBytes(), p + 10); + out.write(in, off, p - off); + out.flush(); + parseSSI(buffer, p, request, response); + off = q + 3; + p = buffer.indexOf("