Skip to content

Commit

Permalink
Stop exposing embedded jetty out of SeleniumServer
Browse files Browse the repository at this point in the history
  • Loading branch information
barancev committed Oct 11, 2015
1 parent 2f12ebb commit 79a1fdb
Show file tree
Hide file tree
Showing 3 changed files with 107 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,6 @@
import org.openqa.grid.common.exception.GridException;
import org.openqa.grid.web.servlet.ResourceServlet;
import org.openqa.grid.web.utils.ExtraServletUtil;
import org.openqa.jetty.http.HttpContext;
import org.openqa.jetty.jetty.Server;
import org.openqa.jetty.jetty.servlet.ServletHandler;
import org.openqa.selenium.Platform;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.internal.HttpClientFactory;
Expand All @@ -54,8 +51,6 @@
import java.util.Map;
import java.util.logging.Logger;

import javax.servlet.Servlet;

public class SelfRegisteringRemote {

private static final Logger LOG = Logger.getLogger(SelfRegisteringRemote.class.getName());
Expand Down Expand Up @@ -107,30 +102,9 @@ public void startRemoteServer() throws Exception {

server = new SeleniumServer(nodeConfig.getConfiguration());

Server jetty = server.getServer();

String servletsStr = (String) nodeConfig.getConfiguration().get(RegistrationRequest.SERVLETS);
if (servletsStr != null) {
List<String> servlets = Arrays.asList(servletsStr.split(","));

HttpContext extra = new HttpContext();

extra.setContextPath("/extra");
ServletHandler handler = new ServletHandler();
handler.addServlet("/resources/*", ResourceServlet.class.getName());

for (String s : servlets) {
Class<? extends Servlet> servletClass = ExtraServletUtil.createServlet(s);
if (servletClass != null) {
String path = "/" + servletClass.getSimpleName() + "/*";
String clazz = servletClass.getCanonicalName();
handler.addServlet(path, clazz);
LOG.info("started extra node servlet visible at : http://xxx:"
+ nodeConfig.getConfiguration().get(RegistrationRequest.PORT) + "/extra" + path);
}
}
extra.addHandler(handler);
jetty.addContext(extra);
server.registerExtraServlets(Arrays.asList(servletsStr.split(",")));
}

server.boot();
Expand Down
71 changes: 71 additions & 0 deletions java/server/src/org/openqa/selenium/server/ResourceServlet.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
// Licensed to the Software Freedom Conservancy (SFC) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The SFC licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.

package org.openqa.selenium.server;

import com.google.common.io.ByteStreams;

import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* Serves the static resources used by the console for instance. Uses URL
* java.lang.ClassLoader.findResource(String name) to find the resources, allowing to add icons etc
* in the jars of the plugins.
*/
public class ResourceServlet extends HttpServlet {

private static final long serialVersionUID = 7253742807937667039L;

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
process(request, response);
}

protected void process(HttpServletRequest request, HttpServletResponse response)
throws IOException {
String resource = request.getPathInfo().replace(request.getServletPath(), "");
if (resource.startsWith("/"))
resource = resource.replaceFirst("/", "");
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(resource);
if (in == null) {
throw new Error("Cannot find resource " + resource);
}

try {
ByteStreams.copy(in, response.getOutputStream());
} finally {
in.close();
Calendar c = Calendar.getInstance();
c.setTime(new Date());
c.add(Calendar.DATE, 10);
response.setDateHeader("Expires", c.getTime().getTime());
response.setHeader("Cache-Control", "max-age=864000");
response.flushBuffer();
}

}

}
36 changes: 35 additions & 1 deletion java/server/src/org/openqa/selenium/server/SeleniumServer.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@
import java.util.Map;
import java.util.Properties;

import javax.servlet.Servlet;

/**
* Provides a server that can launch/terminate browsers and can receive remote Selenium commands
* over HTTP and send them on to the browser.
Expand Down Expand Up @@ -196,7 +198,6 @@ public class SeleniumServer implements SslCertificateGenerator {

private ProxyHandler proxyHandler;


public static int DEFAULT_JETTY_THREADS = 512;
// Number of jetty threads for the server
private int jettyThreads = DEFAULT_JETTY_THREADS;
Expand Down Expand Up @@ -580,11 +581,44 @@ public int getPort() {
*
* @return the internal Jetty server, pre-configured with the /selenium-server context as well as
* the proxy server on /
* @deprecated
*/
@Deprecated
public Server getServer() {
return server;
}

public void registerExtraServlets(List<String> servlets) {
HttpContext extra = new HttpContext();

extra.setContextPath("/extra");
ServletHandler handler = new ServletHandler();
handler.addServlet("/resources/*", ResourceServlet.class.getName());

for (String s : servlets) {
Class<? extends Servlet> servletClass = createServlet(s);
if (servletClass != null) {
String path = "/" + servletClass.getSimpleName() + "/*";
String clazz = servletClass.getCanonicalName();
handler.addServlet(path, clazz);
LOGGER.info("started extra node servlet visible at : http://xxx:"
+ configuration.getPort() + "/extra" + path);
}
}
extra.addHandler(handler);
server.addContext(extra);
}

private Class<? extends Servlet> createServlet(String className) {
try {
return Class.forName(className).asSubclass(Servlet.class);
} catch (ClassNotFoundException e) {
LOGGER.error(
"The specified class : " + className + " cannot be instantiated " + e.getMessage());
}
return null;
}

public InputStream getResourceAsStream(String path) throws IOException {
return staticContentHandler.getResource(path).getInputStream();
}
Expand Down

0 comments on commit 79a1fdb

Please sign in to comment.