From 272b196d05b8f52149ccca8957de929bb23d7c38 Mon Sep 17 00:00:00 2001
From: reger <reger18@arcor.de>
Date: Mon, 30 Sep 2013 03:12:52 +0200
Subject: [PATCH] update Jetty server init() to activate yacy-domain and
 transparent proxy handler - adding  domain & proxy handler to a context (as
 it was in inital design)      (context required for dispatcher) - make
 handler context and servlet context parallel available      (to allow use of
 YaCyDefaultServlet to handle legacyServlets) - set transparent proxy request
 handled after dispatch.forward to skip further handling for .yacy domain
 requests

---
 source/net/yacy/http/HttpServer.java        | 33 ++++++++++++++++-----
 source/net/yacy/http/YacyDomainHandler.java | 11 +++++--
 2 files changed, 34 insertions(+), 10 deletions(-)

diff --git a/source/net/yacy/http/HttpServer.java b/source/net/yacy/http/HttpServer.java
index 2017f2290..2756922c6 100644
--- a/source/net/yacy/http/HttpServer.java
+++ b/source/net/yacy/http/HttpServer.java
@@ -36,10 +36,10 @@ import net.yacy.search.Switchboard;
 import org.eclipse.jetty.server.Handler;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.handler.ContextHandler;
 import org.eclipse.jetty.server.handler.ContextHandlerCollection;
 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.servlet.FilterHolder;
 import org.eclipse.jetty.servlet.ServletContextHandler;
 import org.eclipse.jetty.servlet.ServletHolder;
@@ -67,11 +67,13 @@ public class HttpServer {
         YacyDomainHandler domainHandler = new YacyDomainHandler();
         domainHandler.setAlternativeResolver(sb.peers);
 
+        /*  this is now handled by YaCyDefaultServlet
         ResourceHandler resource_handler = new ResourceHandler();
         resource_handler.setDirectoriesListed(true);
         resource_handler.setWelcomeFiles(new String[]{"index.html"});
         resource_handler.setResourceBase("htroot/");
-
+        */
+        
         //add SolrServlet
         ServletContextHandler solrContext = new ServletContextHandler(ServletContextHandler.SESSIONS);
         solrContext.setContextPath("/solr");       
@@ -88,20 +90,35 @@ public class HttpServer {
         htrootContext.addServlet(sholder,"/*");    
         //htrootContext.setInitParameter("welcomeFile", "index.html"); // default is index.html, welcome.html
         
+        // assemble the servlet handlers
         ContextHandlerCollection servletContext = new ContextHandlerCollection();                
         servletContext.setHandlers(new Handler[] { solrContext, htrootContext });        
 
+        // define list of YaCy specific general handlers
         HandlerList handlers = new HandlerList();
         handlers.setHandlers(new Handler[]
-           {domainHandler, new ProxyCacheHandler(), new ProxyHandler(),
-            servletContext, resource_handler, new DefaultHandler()});
-
+           {domainHandler, new ProxyCacheHandler(), new ProxyHandler()
+            /*, resource_handler, new DefaultHandler() */}); 
+
+        // context handler for dispatcher and security (hint: dispatcher requires a context)
+        ContextHandler context = new ContextHandler();
+        context.setContextPath("/");
+        context.setHandler(handlers);
+
+        // make YaCy handlers (in context) and servlet context handlers available (both contain root context "/")
+        // logic: 1. YaCy handlers are called if request not handled (e.g. proxy) then servlets handle it
+        ContextHandlerCollection allrequesthandlers = new ContextHandlerCollection();
+        allrequesthandlers.addHandler(context);
+        allrequesthandlers.addHandler(servletContext);
+        allrequesthandlers.addHandler(new DefaultHandler()); // if not handled by other handler 
+        
+        // wrap all handlers by security handler
         YaCySecurityHandler securityHandler = new YaCySecurityHandler();
         securityHandler.setLoginService(new YaCyLoginService());
         securityHandler.setRealmName("YaCy Admin Interface");
-        securityHandler.setHandler(new CrashProtectionHandler(handlers));
-
-        server.setHandler(securityHandler);
+        securityHandler.setHandler(new CrashProtectionHandler(allrequesthandlers));
+                    
+        server.setHandler(/*securityHandler*/allrequesthandlers);
     }
 
     /**
diff --git a/source/net/yacy/http/YacyDomainHandler.java b/source/net/yacy/http/YacyDomainHandler.java
index 5fc870c61..b13cd1d41 100644
--- a/source/net/yacy/http/YacyDomainHandler.java
+++ b/source/net/yacy/http/YacyDomainHandler.java
@@ -62,9 +62,10 @@ public class YacyDomainHandler extends AbstractHandler implements Handler {
 			int posPort = hostPort.lastIndexOf(':');
 			String newHost = hostPort.substring(0, posPort);
 			int newPort = Integer.parseInt(hostPort.substring(posPort + 1));
-			
-        	RequestDispatcher dispatcher = request.getRequestDispatcher(path + target);
+
+        	RequestDispatcher dispatcher = request.getRequestDispatcher(path + target);         
         	dispatcher.forward(new DomainRequestWrapper(request, newHost, newPort), response);
+                baseRequest.setHandled(true);
 		}
 	}
 	
@@ -89,6 +90,12 @@ public class YacyDomainHandler extends AbstractHandler implements Handler {
 			return newServerPort;
 		}
 		
+                @Override
+                public StringBuffer getRequestURL() {
+                    StringBuffer buf = new StringBuffer(this.getScheme() +"://"+ newServerName + ":" + newServerPort + this.getPathInfo());
+                    return buf;
+                }
+                
 		@Override
 		public String getHeader(String name) {
 			if(name.equals("Host")) {