diff --git a/libt/jetty-continuation-9.0.5.v20130815.jar b/libt/jetty-continuation-9.0.5.v20130815.jar deleted file mode 100644 index a79294670..000000000 Binary files a/libt/jetty-continuation-9.0.5.v20130815.jar and /dev/null differ diff --git a/libt/jetty-http-9.0.5.v20130815.jar b/libt/jetty-http-9.0.5.v20130815.jar deleted file mode 100644 index ff4975d74..000000000 Binary files a/libt/jetty-http-9.0.5.v20130815.jar and /dev/null differ diff --git a/libt/jetty-io-9.0.5.v20130815.jar b/libt/jetty-io-9.0.5.v20130815.jar deleted file mode 100644 index 5459012fa..000000000 Binary files a/libt/jetty-io-9.0.5.v20130815.jar and /dev/null differ diff --git a/libt/jetty-security-9.0.5.v20130815.jar b/libt/jetty-security-9.0.5.v20130815.jar deleted file mode 100644 index 7ff8202da..000000000 Binary files a/libt/jetty-security-9.0.5.v20130815.jar and /dev/null differ diff --git a/libt/jetty-server-9.0.5.v20130815.jar b/libt/jetty-server-9.0.5.v20130815.jar deleted file mode 100644 index da9bf3e71..000000000 Binary files a/libt/jetty-server-9.0.5.v20130815.jar and /dev/null differ diff --git a/libt/jetty-servlet-9.0.5.v20130815.jar b/libt/jetty-servlet-9.0.5.v20130815.jar deleted file mode 100644 index 961f23e53..000000000 Binary files a/libt/jetty-servlet-9.0.5.v20130815.jar and /dev/null differ diff --git a/libt/jetty-servlets-9.0.5.v20130815.jar b/libt/jetty-servlets-9.0.5.v20130815.jar deleted file mode 100644 index 3cecab6c2..000000000 Binary files a/libt/jetty-servlets-9.0.5.v20130815.jar and /dev/null differ diff --git a/libt/jetty-util-9.0.5.v20130815.jar b/libt/jetty-util-9.0.5.v20130815.jar deleted file mode 100644 index 207eab459..000000000 Binary files a/libt/jetty-util-9.0.5.v20130815.jar and /dev/null differ diff --git a/test/net/yacy/cora/federate/solr/connector/EmbeddedSolrConnectorTest.java b/test/net/yacy/cora/federate/solr/connector/EmbeddedSolrConnectorTest.java index ef43842e0..f1d6b4745 100644 --- a/test/net/yacy/cora/federate/solr/connector/EmbeddedSolrConnectorTest.java +++ b/test/net/yacy/cora/federate/solr/connector/EmbeddedSolrConnectorTest.java @@ -5,6 +5,9 @@ import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.EnumSet; +import java.util.Random; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.servlet.DispatcherType; import net.yacy.cora.federate.solr.SolrServlet; import net.yacy.cora.federate.solr.instance.EmbeddedInstance; @@ -14,8 +17,10 @@ import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; import org.apache.solr.common.SolrException; import org.apache.solr.common.SolrInputDocument; +import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.server.bio.SocketConnector; +import org.eclipse.jetty.server.session.HashSessionIdManager; import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletContextHandler; import org.junit.After; @@ -116,27 +121,23 @@ public class EmbeddedSolrConnectorTest { * from org.apache.solr.client.solrj.embedded.JettySolrRunner */ public static Server startServer(String context, int port, EmbeddedSolrConnector c) { - //this.context = context; - Server server = new Server(port); - /* - SocketConnector connector = new SocketConnector(); - connector.setPort(port); - connector.setReuseAddress(true); - this.server.setConnectors(new Connector[] { connector }); - this.server.setSessionIdManager(new HashSessionIdManager(new Random())); - */ - ServerConnector connector = new ServerConnector(server); + Server server = new Server(port); + server.setStopAtShutdown(true); + + SocketConnector connector = new SocketConnector(); connector.setPort(port); - - server.addConnector(connector); + connector.setReuseAddress(true); + server.setConnectors(new Connector[] { connector }); + server.setSessionIdManager(new HashSessionIdManager(new Random())); server.setStopAtShutdown(true); + ServletContextHandler root = new ServletContextHandler(ServletContextHandler.SESSIONS); //new Context(server, context, Context.SESSIONS); + root.setContextPath(context); root.addServlet(SolrServlet.Servlet404.class, "/*"); // attach org.apache.solr.response.XMLWriter to search requests SolrServlet.initCore(c); - FilterHolder dispatchFilter = root.addFilter(SolrServlet.class, "*", EnumSet.of(DispatcherType.REQUEST)); - //root.addFilter(new FilterHolder(SolrServlet.class), "/*", EnumSet.of(DispatcherType.REQUEST)); + root.addFilter(new FilterHolder(SolrServlet.class), "/*", EnumSet.of(DispatcherType.REQUEST)); server.setHandler(root); if (!server.isRunning()) { try { @@ -162,7 +163,7 @@ public class EmbeddedSolrConnectorTest { doc.addField(CollectionSchema.host_s.name(), "yacy.net"); doc.addField(CollectionSchema.text_t.name(), "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."); solr.add(doc); - + solr.commit(true); // start a server startServer("/solr", 8091, solr); // try http://localhost:8091/solr/select?q=*:* @@ -180,11 +181,7 @@ public class EmbeddedSolrConnectorTest { // try http://127.0.0.1:8091/solr/select?q=ping - try { - Thread.sleep(1000 * 1000); - } catch (final InterruptedException e) { - } - solr.close(); + solr.close(); } catch (final IOException e) { e.printStackTrace(); } diff --git a/test/net/yacy/http/Jetty9HttpServerImpl.java b/test/net/yacy/http/Jetty9HttpServerImpl.java deleted file mode 100644 index 5247d4194..000000000 --- a/test/net/yacy/http/Jetty9HttpServerImpl.java +++ /dev/null @@ -1,190 +0,0 @@ -// -// Jetty9HttpServerImpl -// Copyright 2011 by Florian Richter -// 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.net.InetSocketAddress; -import java.net.SocketException; -import java.util.EnumSet; -import javax.servlet.DispatcherType; -import net.yacy.cora.federate.solr.SolrServlet; -import net.yacy.cora.federate.solr.SolrServlet.Servlet404; -import net.yacy.cora.util.ConcurrentLog; -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.servlet.FilterHolder; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; - -/** - * class to embedded Jetty 9 http server into YaCy - */ -public class Jetty9HttpServerImpl implements YaCyHttpServer { - - private Server server; - - /** - * @param port TCP Port to listen for http requests - */ - public Jetty9HttpServerImpl(int port) { - Switchboard sb = Switchboard.getSwitchboard(); - - server = new Server(); - ServerConnector connector = new ServerConnector(server); - connector.setPort(port); - connector.setName("httpd:"+Integer.toString(port)); - //connector.setThreadPool(new QueuedThreadPool(20)); - server.addConnector(connector); - - 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"); - solrContext.addServlet(new ServletHolder(Servlet404.class),"/*"); - - SolrServlet.initCore(sb.index.fulltext().getDefaultEmbeddedConnector()); - solrContext.addFilter(new FilterHolder(SolrServlet.class), "/*", EnumSet.of(DispatcherType.REQUEST)); - - // configure root context - ServletContextHandler htrootContext = new ServletContextHandler(ServletContextHandler.SESSIONS); - htrootContext.setContextPath("/"); - ServletHolder sholder = new ServletHolder(Jetty9YaCyDefaultServlet.class); - sholder.setInitParameter("resourceBase", "htroot"); - //sholder.setInitParameter("welcomeFile", "index.html"); // default is index.html, welcome.html - sholder.setInitParameter("gzip","false"); - htrootContext.addServlet(sholder,"/*"); - - // 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() - /*, 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 - Jetty9YaCySecurityHandler securityHandler = new Jetty9YaCySecurityHandler(); - securityHandler.setLoginService(new YaCyLoginService()); - securityHandler.setRealmName("YaCy Admin Interface"); - securityHandler.setHandler(new CrashProtectionHandler(allrequesthandlers)); - - server.setHandler(securityHandler); - } - - /** - * start http server - */ - @Override - public void startupServer() throws Exception { - server.start(); - } - - /** - * stop http server and wait for it - */ - @Override - public void stop() throws Exception { - server.stop(); - server.join(); - } - - @Override - public void setMaxSessionCount(int maxBusy) { - // TODO: - } - - @Override - public boolean withSSL() { - return false; // TODO: - } - - @Override - public void reconnect(int milsec) { - try { - Thread.sleep(milsec); - } catch (final InterruptedException e) { - ConcurrentLog.logException(e); - } catch (final Exception e) { - ConcurrentLog.logException(e); - } - try { - server.stop(); - server.join(); - server.start(); - } catch (Exception ex) { - ConcurrentLog.logException(ex); - } - } - - @Override - public InetSocketAddress generateSocketAddress(String port) throws SocketException { - return null; // TODO: - } - - @Override - public int getMaxSessionCount() { - return server.getThreadPool().getThreads(); - } - - @Override - public int getJobCount() { - return getMaxSessionCount() - server.getThreadPool().getIdleThreads(); // TODO: - } - - @Override - public String getVersion() { - return "Jetty " + server.getVersion(); - } - -} diff --git a/test/net/yacy/http/Jetty9YaCyDefaultServlet.java b/test/net/yacy/http/Jetty9YaCyDefaultServlet.java deleted file mode 100644 index ab607cbbd..000000000 --- a/test/net/yacy/http/Jetty9YaCyDefaultServlet.java +++ /dev/null @@ -1,924 +0,0 @@ -// YaCyDefaultServlet -// Copyright 2013 by Michael Peter Christen; mc@yacy.net, Frankfurt a. M., Germany -// First released 2013 at http://yacy.net -// -// 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.awt.Image; -import java.awt.image.BufferedImage; -import java.io.BufferedInputStream; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.lang.ref.SoftReference; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.URL; -import java.nio.ByteBuffer; -import java.util.Enumeration; -import java.util.Iterator; -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; - -import javax.servlet.AsyncContext; -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.UnavailableException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import net.yacy.cora.date.GenericFormatter; -import net.yacy.cora.document.analysis.Classification; -import net.yacy.cora.protocol.HeaderFramework; -import net.yacy.cora.protocol.RequestHeader; -import net.yacy.cora.util.ConcurrentLog; -import net.yacy.kelondro.util.FileUtils; -import net.yacy.kelondro.util.MemoryControl; -import net.yacy.peers.Seed; -import net.yacy.peers.graphics.EncodedImage; -import net.yacy.peers.operation.yacyBuildProperties; -import net.yacy.search.Switchboard; -import net.yacy.search.SwitchboardConstants; -import net.yacy.server.http.TemplateEngine; -import net.yacy.server.serverClassLoader; -import net.yacy.server.serverCore; -import net.yacy.server.serverObjects; -import net.yacy.server.serverSwitch; -import net.yacy.server.servletProperties; -import net.yacy.visualization.RasterPlotter; -import org.apache.commons.fileupload.FileItem; -import org.apache.commons.fileupload.disk.DiskFileItemFactory; -import org.apache.commons.fileupload.servlet.ServletFileUpload; - -import org.eclipse.jetty.http.HttpContent; -import org.eclipse.jetty.http.HttpFields; -import org.eclipse.jetty.http.HttpHeader; -import org.eclipse.jetty.http.HttpMethod; -import org.eclipse.jetty.http.MimeTypes; -import org.eclipse.jetty.io.WriterOutputStream; -import org.eclipse.jetty.server.HttpOutput; -import org.eclipse.jetty.server.InclusiveByteRange; -import org.eclipse.jetty.server.Response; -import org.eclipse.jetty.util.BufferUtil; -import org.eclipse.jetty.util.Callback; -import org.eclipse.jetty.util.MultiPartOutputStream; -import org.eclipse.jetty.util.QuotedStringTokenizer; -import org.eclipse.jetty.util.URIUtil; -import org.eclipse.jetty.util.resource.Resource; -import org.eclipse.jetty.util.resource.ResourceFactory; - -/** - * YaCyDefaultServlet base on Jetty DefaultServlet.java - * handles static files and the YaCy servlets. - */ - -/** - * The default servlet. This servlet, normally mapped to /, provides the - * handling for static content, OPTION and TRACE methods for the context. The - * following initParameters are supported, these can be set either on the - * servlet itself or as ServletContext initParameters : - *
- *  acceptRanges      If true, range requests and responses are
- *                    supported
- *
- *  dirAllowed        If true, directory listings are returned if no
- *                    welcome file is found. Else 403 Forbidden.
- *  
- *  welcomeFile       name of the welcome file (default is "index.html", "welcome.html")
- *
- *  gzip              If set to true, then static content will be served as
- *                    gzip content encoded if a matching resource is
- *                    found ending with ".gz"
- *
- *  resourceBase      Set to replace the context resource base
- *
- *  resourceCache     If set, this is a context attribute name, which the servlet
- *                    will use to look for a shared ResourceCache instance.
- *
- *  relativeResourceBase
- *                    Set with a pathname relative to the base of the
- *                    servlet context root. Useful for only serving static content out
- *                    of only specific subdirectories.
- *
- *  pathInfoOnly      If true, only the path info will be applied to the resourceBase
- *
- *
- *  etags             If True, weak etags will be generated and handled.
- *
- * 
- */ -public class Jetty9YaCyDefaultServlet extends YaCyDefaultServlet implements ResourceFactory { - - private static final long serialVersionUID = 4900000000000001110L; - - private boolean _gzip=true; - - /* ------------------------------------------------------------ */ - @Override - public void init() throws UnavailableException { - super.init(); - _gzip=getInitBoolean("gzip",_gzip); - } - - /* ------------------------------------------------------------ */ - /** - * get Resource to serve. Map a path to a resource. The default - * implementation calls HttpContext.getResource but derived servlets may - * provide their own mapping. - * - * @param pathInContext The path to find a resource for. - * @return The resource to serve. - */ - @Override - public Resource getResource(String pathInContext) { - Resource r = null; - if (_relativeResourceBase != null) { - pathInContext = URIUtil.addPaths(_relativeResourceBase, pathInContext); - } - - try { - if (_resourceBase != null) { - r = _resourceBase.addPath(pathInContext); - } else { - URL u = _servletContext.getResource(pathInContext); - r = Resource.newResource(u); - } - - if (ConcurrentLog.isFine("YaCyDefaultServlet")) { - ConcurrentLog.fine("YaCyDefaultServlet","Resource " + pathInContext + "=" + r); - } - } catch (IOException e) { - // ConcurrentLog.logException(e); - } - - return r; - } - - /* ------------------------------------------------------------ */ - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - String servletPath = null; - String pathInfo = null; - Enumeration reqRanges = null; - Boolean included = request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI) != null; - if (included != null && included.booleanValue()) { - servletPath = (String) request.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH); - pathInfo = (String) request.getAttribute(RequestDispatcher.INCLUDE_PATH_INFO); - if (servletPath == null) { - servletPath = request.getServletPath(); - pathInfo = request.getPathInfo(); - } - } else { - included = Boolean.FALSE; - servletPath = _pathInfoOnly ? "/" : request.getServletPath(); - pathInfo = request.getPathInfo(); - - // Is this a Range request? - reqRanges = request.getHeaders(HeaderFramework.RANGE); - if (!hasDefinedRange(reqRanges)) { - reqRanges = null; - } - } - - if (pathInfo.startsWith("/currentyacypeer/")) pathInfo = pathInfo.substring(16); - String pathInContext = URIUtil.addPaths(servletPath, pathInfo); - boolean endsWithSlash = (pathInfo == null ? request.getServletPath() : pathInfo).endsWith(URIUtil.SLASH); - - // Find the resource and content - Resource resource = null; - HttpContent content = null; - try { - // Look for a class resource - boolean hasClass = false; - if (reqRanges == null && !endsWithSlash) { - final int p = pathInContext.lastIndexOf('.'); - if (p >= 0) { - String pathofClass = pathInContext.substring(0, p) + ".class"; - resource = getResource(pathofClass); - // Does a class resource exist? - if (resource != null && resource.exists() && !resource.isDirectory()) { - hasClass = true; - } - } - } - // is gzip enabled? - String pathInContextGz=null; - boolean gzip=false; - if (!included.booleanValue() && _gzip && reqRanges==null && !endsWithSlash ) - { - // Look for a gzip resource - pathInContextGz=pathInContext+".gz"; - resource=getResource(pathInContextGz); - // Does a gzip resource exist? - if (resource!=null && resource.exists() && !resource.isDirectory()) - { - // Tell caches that response may vary by accept-encoding - response.addHeader(HttpHeader.VARY.asString(),HttpHeader.ACCEPT_ENCODING.asString()); - - // Does the client accept gzip? - String accept=request.getHeader(HttpHeader.ACCEPT_ENCODING.asString()); - if (accept!=null && accept.indexOf("gzip")>=0) - gzip=true; - } - } - - // find resource - if (!gzip) resource = getResource(pathInContext); - - if (ConcurrentLog.isFine("YaCyDefaultServlet")) { - ConcurrentLog.fine("YaCyDefaultServlet","uri=" + request.getRequestURI() + " resource=" + resource + (content != null ? " content" : "")); - } - - // Handle resource - if (!hasClass && (resource == null || !resource.exists())) { - if (included) { - throw new FileNotFoundException("!" + pathInContext); - } - response.sendError(HttpServletResponse.SC_NOT_FOUND); - } else if (!resource.isDirectory()) { - if (endsWithSlash && pathInContext.length() > 1) { - String q = request.getQueryString(); - pathInContext = pathInContext.substring(0, pathInContext.length() - 1); - if (q != null && q.length() != 0) { - pathInContext += "?" + q; - } - response.sendRedirect(response.encodeRedirectURL(URIUtil.addPaths(_servletContext.getContextPath(), pathInContext))); - } else { - // ensure we have content - if (content == null) { - content = new HttpContent.ResourceAsHttpContent(resource, _mimeTypes.getMimeByExtension(resource.toString()), response.getBufferSize(), _etags); - } - - if (hasClass) { // this is a YaCy servlet, handle the template - handleTemplate(pathInfo, request, response); - } else { - if (included.booleanValue() || passConditionalHeaders(request, response, resource, content)) { - //sendData(request, response, included.booleanValue(), resource, content, reqRanges); - if (gzip) { - response.setHeader(HttpHeader.CONTENT_ENCODING.asString(), "gzip"); - String mt = _servletContext.getMimeType(pathInContext); - if (mt != null) { - response.setContentType(mt); - } - } - sendData(request, response, included.booleanValue(), resource, content, reqRanges); - } - } - } - } else { - if (!endsWithSlash || (pathInContext.length() == 1 && request.getAttribute("org.eclipse.jetty.server.nullPathInfo") != null)) { - StringBuffer buf = request.getRequestURL(); - synchronized (buf) { - int param = buf.lastIndexOf(";"); - if (param < 0) { - buf.append('/'); - } else { - buf.insert(param, '/'); - } - String q = request.getQueryString(); - if (q != null && q.length() != 0) { - buf.append('?'); - buf.append(q); - } - response.setContentLength(0); - response.sendRedirect(response.encodeRedirectURL(buf.toString())); - } - } else { // look for a welcome file - String welcomeFileName = getWelcomeFile (pathInContext); - if (welcomeFileName != null) { - RequestDispatcher rd = request.getRequestDispatcher(welcomeFileName); - rd.forward(request, response); - } else { // send directory listing - content = new HttpContent.ResourceAsHttpContent(resource, _mimeTypes.getMimeByExtension(resource.toString()), _etags); - if (included.booleanValue() || passConditionalHeaders(request, response, resource, content)) { - sendDirectory(request, response, resource, pathInContext); - } - } - } - } - } catch (IllegalArgumentException e) { - ConcurrentLog.logException(e); - if (!response.isCommitted()) { - response.sendError(500, e.getMessage()); - } - } finally { - if (content != null) { - content.release(); - } else if (resource != null) { - resource.close(); - } - } - } - - /* ------------------------------------------------------------ */ - @Override - protected boolean hasDefinedRange(Enumeration reqRanges) { - return (reqRanges != null && reqRanges.hasMoreElements()); - } - - /* ------------------------------------------------------------ */ - @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - doGet(request, response); - } - - /* ------------------------------------------------------------ */ - /* Check modification date headers. - */ - @Override - protected boolean passConditionalHeaders(HttpServletRequest request, HttpServletResponse response, Resource resource, HttpContent content) - throws IOException { - try { - if (!HttpMethod.HEAD.is(request.getMethod())) { - if (_etags) { - String ifm = request.getHeader(HttpHeader.IF_MATCH.asString()); - if (ifm != null) { - boolean match = false; - if (content.getETag() != null) { - QuotedStringTokenizer quoted = new QuotedStringTokenizer(ifm, ", ", false, true); - while (!match && quoted.hasMoreTokens()) { - String tag = quoted.nextToken(); - if (content.getETag().toString().equals(tag)) { - match = true; - } - } - } - - if (!match) { - response.setStatus(HttpServletResponse.SC_PRECONDITION_FAILED); - return false; - } - } - - String if_non_match_etag = request.getHeader(HttpHeader.IF_NONE_MATCH.asString()); - if (if_non_match_etag != null && content.getETag() != null) { - // Look for GzipFiltered version of etag - if (content.getETag().toString().equals(request.getAttribute("o.e.j.s.GzipFilter.ETag"))) { - response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); - response.setHeader(HeaderFramework.ETAG, if_non_match_etag); - return false; - } - - // Handle special case of exact match. - if (content.getETag().toString().equals(if_non_match_etag)) { - response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); - response.setHeader(HeaderFramework.ETAG, content.getETag()); - return false; - } - - // Handle list of tags - QuotedStringTokenizer quoted = new QuotedStringTokenizer(if_non_match_etag, ", ", false, true); - while (quoted.hasMoreTokens()) { - String tag = quoted.nextToken(); - if (content.getETag().toString().equals(tag)) { - response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); - response.setHeader(HeaderFramework.ETAG, content.getETag()); - return false; - } - } - - // If etag requires content to be served, then do not check if-modified-since - return true; - } - } - - // Handle if modified since - String ifms = request.getHeader(HttpHeader.IF_MODIFIED_SINCE.asString()); - if (ifms != null) { - //Get jetty's Response impl - String mdlm = content.getLastModified(); - if (mdlm != null && ifms.equals(mdlm)) { - response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); - if (_etags) { - response.setHeader(HeaderFramework.ETAG, content.getETag()); - } - response.flushBuffer(); - return false; - } - - long ifmsl = request.getDateHeader(HttpHeader.IF_MODIFIED_SINCE.asString()); - if (ifmsl != -1 && resource.lastModified() / 1000 <= ifmsl / 1000) { - response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); - if (_etags) { - response.setHeader(HeaderFramework.ETAG, content.getETag()); - } - response.flushBuffer(); - return false; - } - } - - // Parse the if[un]modified dates and compare to resource - long date = request.getDateHeader(HttpHeader.IF_UNMODIFIED_SINCE.asString()); - if (date != -1 && resource.lastModified() / 1000 > date / 1000) { - response.sendError(HttpServletResponse.SC_PRECONDITION_FAILED); - return false; - } - - } - } catch (IllegalArgumentException iae) { - if (!response.isCommitted()) { - response.sendError(400, iae.getMessage()); - } - throw iae; - } - return true; - } - - - /* ------------------------------------------------------------------- */ - @Override - protected void sendDirectory(HttpServletRequest request, - HttpServletResponse response, - Resource resource, - String pathInContext) - throws IOException { - if (!_dirAllowed) { - response.sendError(HttpServletResponse.SC_FORBIDDEN); - return; - } - - byte[] data = null; - String base = URIUtil.addPaths(request.getRequestURI(), URIUtil.SLASH); - - String dir = resource.getListHTML(base, pathInContext.length() > 1); - if (dir == null) { - response.sendError(HttpServletResponse.SC_FORBIDDEN, - "No directory"); - return; - } - - data = dir.getBytes("UTF-8"); - response.setContentType("text/html; charset=UTF-8"); - response.setContentLength(data.length); - response.getOutputStream().write(data); - } - - /* ------------------------------------------------------------ */ - @Override - protected void sendData(HttpServletRequest request, - HttpServletResponse response, - boolean include, - Resource resource, - HttpContent content, - Enumeration reqRanges) - throws IOException { - final long content_length = (content == null) ? resource.length() : content.getContentLength(); - - // Get the output stream (or writer) - OutputStream out = null; - boolean written; - try { - out = response.getOutputStream(); - - // has a filter already written to the response? - written = out instanceof HttpOutput - ? ((HttpOutput) out).isWritten() - : true; - } catch (IllegalStateException e) { - out = new WriterOutputStream(response.getWriter()); - written = true; // there may be data in writer buffer, so assume written - } - - if (reqRanges == null || !reqRanges.hasMoreElements() || content_length < 0) { - // if there were no ranges, send entire entity - if (include) { - resource.writeTo(out, 0, content_length); - } // else if we can't do a bypass write because of wrapping - else if (content == null || written || !(out instanceof HttpOutput)) { - // write normally - writeHeaders(response, content, written ? -1 : content_length); - ByteBuffer buffer = (content == null) ? null : content.getIndirectBuffer(); - if (buffer != null) { - BufferUtil.writeTo(buffer, out); - } else { - resource.writeTo(out, 0, content_length); - } - } // else do a bypass write - else { - // write the headers - if (response instanceof Response) { - Response r = (Response) response; - writeOptionHeaders(r.getHttpFields()); - r.setHeaders(content); - } else { - writeHeaders(response, content, content_length); - } - - // write the content asynchronously if supported - if (request.isAsyncSupported()) { - final AsyncContext context = request.startAsync(); - - ((HttpOutput) out).sendContent(content, new Callback() { - @Override - public void succeeded() { - context.complete(); - } - - @Override - public void failed(Throwable x) { - ConcurrentLog.logException(x); - context.complete(); - } - }); - } // otherwise write content blocking - else { - ((HttpOutput) out).sendContent(content); - } - } - } else { - // Parse the satisfiable ranges - List ranges = InclusiveByteRange.satisfiableRanges(reqRanges, content_length); - - // if there are no satisfiable ranges, send 416 response - if (ranges == null || ranges.size() == 0) { - writeHeaders(response, content, content_length); - response.setStatus(HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE); - response.setHeader(HeaderFramework.CONTENT_RANGE, - InclusiveByteRange.to416HeaderRangeString(content_length)); - resource.writeTo(out, 0, content_length); - return; - } - - // if there is only a single valid range (must be satisfiable - // since were here now), send that range with a 216 response - if (ranges.size() == 1) { - InclusiveByteRange singleSatisfiableRange = ranges.get(0); - long singleLength = singleSatisfiableRange.getSize(content_length); - writeHeaders(response, content, singleLength); - response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT); - response.setHeader(HeaderFramework.CONTENT_RANGE, - singleSatisfiableRange.toHeaderRangeString(content_length)); - resource.writeTo(out, singleSatisfiableRange.getFirst(content_length), singleLength); - return; - } - - // multiple non-overlapping valid ranges cause a multipart - // 216 response which does not require an overall - // content-length header - // - writeHeaders(response, content, -1); - String mimetype = (content == null || content.getContentType() == null ? null : content.getContentType().toString()); - if (mimetype == null) { - ConcurrentLog.warn("YaCyDefaultServlet", "Unknown mimetype for " + request.getRequestURI()); - } - MultiPartOutputStream multi = new MultiPartOutputStream(out); - response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT); - - // If the request has a "Request-Range" header then we need to - // send an old style multipart/x-byteranges Content-Type. This - // keeps Netscape and acrobat happy. This is what Apache does. - String ctp; - if (request.getHeader(HttpHeader.REQUEST_RANGE.asString()) != null) { - ctp = "multipart/x-byteranges; boundary="; - } else { - ctp = "multipart/byteranges; boundary="; - } - response.setContentType(ctp + multi.getBoundary()); - - InputStream in = resource.getInputStream(); - long pos = 0; - - // calculate the content-length - int length = 0; - String[] header = new String[ranges.size()]; - for (int i = 0; i < ranges.size(); i++) { - InclusiveByteRange ibr = ranges.get(i); - header[i] = ibr.toHeaderRangeString(content_length); - length += - ((i > 0) ? 2 : 0) - + 2 + multi.getBoundary().length() + 2 - + (mimetype == null ? 0 : HeaderFramework.CONTENT_TYPE.length() + 2 + mimetype.length()) + 2 - + HeaderFramework.CONTENT_RANGE.length() + 2 + header[i].length() + 2 - + 2 - + (ibr.getLast(content_length) - ibr.getFirst(content_length)) + 1; - } - length += 2 + 2 + multi.getBoundary().length() + 2 + 2; - response.setContentLength(length); - - for (int i = 0; i < ranges.size(); i++) { - InclusiveByteRange ibr = ranges.get(i); - multi.startPart(mimetype, new String[]{HeaderFramework.CONTENT_RANGE + ": " + header[i]}); - - long start = ibr.getFirst(content_length); - long size = ibr.getSize(content_length); - if (in != null) { - // Handle non cached resource - if (start < pos) { - in.close(); - in = resource.getInputStream(); - pos = 0; - } - if (pos < start) { - in.skip(start - pos); - pos = start; - } - - FileUtils.copy(in, multi, size); - pos += size; - } else // Handle cached resource - { - (resource).writeTo(multi, start, size); - } - - } - if (in != null) { - in.close(); - } - multi.close(); - } - } - - /* ------------------------------------------------------------ */ - @Override - protected void writeHeaders(HttpServletResponse response, HttpContent content, long count) { - if (content.getContentType() != null && response.getContentType() == null) { - response.setContentType(content.getContentType().toString()); - } - - if (response instanceof Response) { - Response r = (Response) response; - HttpFields fields = r.getHttpFields(); - - if (content.getLastModified() != null) { - fields.put(HeaderFramework.LAST_MODIFIED, content.getLastModified()); - } else if (content.getResource() != null) { - long lml = content.getResource().lastModified(); - if (lml != -1) { - fields.putDateField(HeaderFramework.LAST_MODIFIED, lml); - } - } - - if (count != -1) { - r.setLongContentLength(count); - } - - writeOptionHeaders(fields); - - if (_etags) { - fields.put(HeaderFramework.ETAG, content.getETag()); - } - } else { - long lml = content.getResource().lastModified(); - if (lml >= 0) { - response.setDateHeader(HeaderFramework.LAST_MODIFIED, lml); - } - - if (count != -1) { - if (count < Integer.MAX_VALUE) { - response.setContentLength((int) count); - } else { - response.setHeader(HeaderFramework.CONTENT_LENGTH, Long.toString(count)); - } - } - - writeOptionHeaders(response); - - if (_etags) { - response.setHeader(HeaderFramework.ETAG, content.getETag().toString()); - } - } - } - - @Override - public void handleTemplate(String target, HttpServletRequest request, - HttpServletResponse response) throws IOException, ServletException { - Switchboard sb = Switchboard.getSwitchboard(); - - String localeSelection = Switchboard.getSwitchboard().getConfig("locale.language", "default"); - File targetFile = getLocalizedFile(target, localeSelection); - File targetClass = rewriteClassFile(_resourceBase.addPath(target).getFile()); - String targetExt = target.substring(target.lastIndexOf('.') + 1, target.length()); - - if ((targetClass != null)) { - serverObjects args = new serverObjects(); - @SuppressWarnings("unchecked") - Enumeration argNames = request.getParameterNames(); - while (argNames.hasMoreElements()) { - String argName = argNames.nextElement(); - args.put(argName, request.getParameter(argName)); - } - //TODO: for SSI request, local parameters are added as attributes, put them back as parameter for the legacy request - // likely this should be implemented via httpservletrequestwrapper to supply complete parameters - @SuppressWarnings("unchecked") - Enumeration attNames = request.getAttributeNames(); - while (attNames.hasMoreElements()) { - String argName = attNames.nextElement(); - args.put(argName, request.getAttribute(argName).toString()); - } - - // add multipart-form fields to parameter - if (request.getContentType() != null && request.getContentType().startsWith("multipart/form-data")) { - parseMultipart(request, args); - } - // eof modification to read attribute - RequestHeader legacyRequestHeader = generateLegacyRequestHeader(request, target, targetExt); - - Object tmp; - try { - tmp = invokeServlet(targetClass, legacyRequestHeader, args); - } catch (InvocationTargetException e) { - ConcurrentLog.logException(e); - throw new ServletException(); - } catch (IllegalArgumentException e) { - ConcurrentLog.logException(e); - throw new ServletException(); - } catch (IllegalAccessException e) { - ConcurrentLog.logException(e); - throw new ServletException(); - } - - if (tmp instanceof RasterPlotter || tmp instanceof EncodedImage || tmp instanceof Image) { - - net.yacy.cora.util.ByteBuffer result = null; - - if (tmp instanceof RasterPlotter) { - final RasterPlotter yp = (RasterPlotter) tmp; - // send an image to client - result = RasterPlotter.exportImage(yp.getImage(), "png"); - } - if (tmp instanceof EncodedImage) { - final EncodedImage yp = (EncodedImage) tmp; - result = yp.getImage(); - } - - if (tmp instanceof Image) { - final Image i = (Image) tmp; - - // generate an byte array from the generated image - int width = i.getWidth(null); - if (width < 0) { - width = 96; // bad hack - } - int height = i.getHeight(null); - if (height < 0) { - height = 96; // bad hack - } - final BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); - bi.createGraphics().drawImage(i, 0, 0, width, height, null); - result = RasterPlotter.exportImage(bi, targetExt); - } - - final String mimeType = Classification.ext2mime(targetExt, "text/html"); - response.setContentType(mimeType); - response.setContentLength(result.length()); - response.setStatus(HttpServletResponse.SC_OK); - - result.writeTo(response.getOutputStream()); - - return; - } - - servletProperties templatePatterns = null; - if (tmp == null) { - // if no args given, then tp will be an empty Hashtable object (not null) - templatePatterns = new servletProperties(); - } else if (tmp instanceof servletProperties) { - templatePatterns = (servletProperties) tmp; - } else { - templatePatterns = new servletProperties((serverObjects) tmp); - } - // add the application version, the uptime and the client name to every rewrite table - templatePatterns.put(servletProperties.PEER_STAT_VERSION, yacyBuildProperties.getVersion()); - templatePatterns.put(servletProperties.PEER_STAT_UPTIME, ((System.currentTimeMillis() - serverCore.startupTime) / 1000) / 60); // uptime in minutes - templatePatterns.putHTML(servletProperties.PEER_STAT_CLIENTNAME, sb.peers.mySeed().getName()); - templatePatterns.putHTML(servletProperties.PEER_STAT_CLIENTID, sb.peers.myID()); - templatePatterns.put(servletProperties.PEER_STAT_MYTIME, GenericFormatter.SHORT_SECOND_FORMATTER.format()); - Seed myPeer = sb.peers.mySeed(); - templatePatterns.put("newpeer", myPeer.getAge() >= 1 ? 0 : 1); - templatePatterns.putHTML("newpeer_peerhash", myPeer.hash); - templatePatterns.put("p2p", sb.getConfigBool(SwitchboardConstants.DHT_ENABLED, true) || !sb.isRobinsonMode() ? 1 : 0); - - if (targetFile.exists() && targetFile.isFile() && targetFile.canRead()) { - String mimeType = Classification.ext2mime(targetExt, "text/html"); - - InputStream fis = null; - long fileSize = targetFile.length(); - - if (fileSize <= Math.min(4 * 1024 * 1204, MemoryControl.available() / 100)) { - // read file completely into ram, avoid that too many files are open at the same time - fis = new ByteArrayInputStream(FileUtils.read(targetFile)); - } else { - fis = new BufferedInputStream(new FileInputStream(targetFile)); - } - - // set response header - response.setContentType(mimeType); - response.setStatus(HttpServletResponse.SC_OK); - ByteArrayOutputStream bas = new ByteArrayOutputStream(4096); - // apply templates - TemplateEngine.writeTemplate(fis, bas, templatePatterns, "-UNRESOLVED_PATTERN-".getBytes("UTF-8")); - fis.close(); - // handle SSI - doContentMod (bas.toByteArray(),request,response); - } - } - } - - protected void doContentMod(final byte[] in, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - net.yacy.cora.util.ByteBuffer buffer = new net.yacy.cora.util.ByteBuffer(in); - OutputStream out = response.getOutputStream(); - - - // remove virtual host "currentyacypeer" - int off = 0; // starting offset - int x = buffer.indexOf("/currentyacypeer/".getBytes(), off); - while (x >= 0) { - for (int i = 0; i < 16; i++) { - in[x + i] = 32; - } - off = x + 16; - x = buffer.indexOf("/currentyacypeer/".getBytes(), off); - } - - // check and handle SSI (ServerSideIncludes) - off = 0; - 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("