org.apache.hadoop.http
Class HttpServer

java.lang.Object
  extended by org.apache.hadoop.http.HttpServer
All Implemented Interfaces:
FilterContainer

public class HttpServer
extends Object
implements FilterContainer

Create a Jetty embedded server to answer http requests. The primary goal is to serve up status information for the server. There are three contexts: "/logs/" -> points to the log directory "/static/" -> points to common static files (src/webapps/static) "/" -> the jsp server code from (src/webapps/)


Nested Class Summary
static class HttpServer.QuotingInputFilter
          A Servlet input filter that quotes all HTML active characters in the parameter names and values.
static class HttpServer.StackServlet
          A very simple servlet to serve up a text representation of the current stack traces.
 
Field Summary
static String CONF_CONTEXT_ATTRIBUTE
           
protected  Map<org.mortbay.jetty.servlet.Context,Boolean> defaultContexts
           
protected  List<String> filterNames
           
protected  boolean findPort
           
static String KRB5_FILTER
           
protected  org.mortbay.jetty.Connector listener
           
static org.apache.commons.logging.Log LOG
           
static String SPNEGO_FILTER
           
protected  org.mortbay.jetty.webapp.WebAppContext webAppContext
           
protected  org.mortbay.jetty.Server webServer
           
 
Constructor Summary
HttpServer(String name, String bindAddress, int port, boolean findPort)
          Same as this(name, bindAddress, port, findPort, null);
HttpServer(String name, String bindAddress, int port, boolean findPort, Configuration conf)
           
HttpServer(String name, String bindAddress, int port, boolean findPort, Configuration conf, AccessControlList adminsAcl)
          Create a status server on the given port.
HttpServer(String name, String bindAddress, int port, boolean findPort, Configuration conf, AccessControlList adminsAcl, org.mortbay.jetty.Connector connector)
           
HttpServer(String name, String bindAddress, int port, boolean findPort, Configuration conf, org.mortbay.jetty.Connector connector)
           
 
Method Summary
 void addContext(org.mortbay.jetty.servlet.Context ctxt, boolean isFiltered)
           
protected  void addContext(String pathSpec, String dir, boolean isFiltered)
          Add a context
protected  void addDefaultApps(org.mortbay.jetty.handler.ContextHandlerCollection parent, String appDir)
          Add default apps.
protected  void addDefaultServlets()
          Add default servlets.
 void addFilter(String name, String classname, Map<String,String> parameters)
          Add a filter to the container.
protected  void addFilterPathMapping(String pathSpec, org.mortbay.jetty.servlet.Context webAppCtx)
          Add the path spec to the filter path mapping.
 void addGlobalFilter(String name, String classname, Map<String,String> parameters)
          Add a global filter to the container.
 void addInternalServlet(String name, String pathSpec, Class<? extends javax.servlet.http.HttpServlet> clazz)
          Deprecated. this is a temporary method
 void addInternalServlet(String name, String pathSpec, Class<? extends javax.servlet.http.HttpServlet> clazz, boolean requireAuth, boolean useKsslForAuth)
          Add an internal servlet in the server, specifying whether or not to protect with Kerberos authentication.
 void addJerseyResourcePackage(String packageName, String pathSpec)
          Add a Jersey resource package.
 void addServlet(String name, String pathSpec, Class<? extends javax.servlet.http.HttpServlet> clazz)
          Add a servlet in the server.
 void addSslListener(InetSocketAddress addr, Configuration sslConf, boolean needClientAuth)
          Configure an ssl listener on the server.
 void addSslListener(InetSocketAddress addr, Configuration sslConf, boolean needCertsAuth, boolean needKrbAuth)
          Configure an ssl listener on the server.
 void addSslListener(InetSocketAddress addr, String keystore, String storPass, String keyPass)
          Deprecated. Use addSslListener(InetSocketAddress, Configuration, boolean)
 org.mortbay.jetty.Connector createBaseListener(Configuration conf)
          Create a required listener for the Jetty instance listening on the port provided.
static org.mortbay.jetty.Connector createDefaultChannelConnector()
           
protected  void defineFilter(org.mortbay.jetty.servlet.Context ctx, String name, String classname, Map<String,String> parameters, String[] urls)
          Define a filter for a context and set up default url mappings.
 Object getAttribute(String name)
          Get the value in the webapp context.
 int getPort()
          Get the port that the server is on
protected  String getWebAppsPath()
          Get the pathname to the webapps files.
static boolean hasAdministratorAccess(javax.servlet.ServletContext servletContext, javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
          Does the user sending the HttpServletRequest has the administrator ACLs? If it isn't the case, response will be modified to send an error to the user.
static boolean isInstrumentationAccessAllowed(javax.servlet.ServletContext servletContext, javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
          Checks the user has privileges to access to instrumentation servlets.
 void join()
           
 void setAttribute(org.mortbay.jetty.servlet.Context context, String name, Object value)
          Set a value in the webapp context.
 void setAttribute(String name, Object value)
          Set a value in the webapp context.
 void setThreads(int min, int max)
          Set the min, max number of worker threads (simultaneous connections).
 void start()
          Start the server.
 void stop()
          stop the server
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

LOG

public static final org.apache.commons.logging.Log LOG

CONF_CONTEXT_ATTRIBUTE

public static final String CONF_CONTEXT_ATTRIBUTE
See Also:
Constant Field Values

SPNEGO_FILTER

public static final String SPNEGO_FILTER
See Also:
Constant Field Values

KRB5_FILTER

public static final String KRB5_FILTER
See Also:
Constant Field Values

webServer

protected final org.mortbay.jetty.Server webServer

listener

protected final org.mortbay.jetty.Connector listener

webAppContext

protected final org.mortbay.jetty.webapp.WebAppContext webAppContext

findPort

protected final boolean findPort

defaultContexts

protected final Map<org.mortbay.jetty.servlet.Context,Boolean> defaultContexts

filterNames

protected final List<String> filterNames
Constructor Detail

HttpServer

public HttpServer(String name,
                  String bindAddress,
                  int port,
                  boolean findPort)
           throws IOException
Same as this(name, bindAddress, port, findPort, null);

Throws:
IOException

HttpServer

public HttpServer(String name,
                  String bindAddress,
                  int port,
                  boolean findPort,
                  Configuration conf)
           throws IOException
Throws:
IOException

HttpServer

public HttpServer(String name,
                  String bindAddress,
                  int port,
                  boolean findPort,
                  Configuration conf,
                  org.mortbay.jetty.Connector connector)
           throws IOException
Throws:
IOException

HttpServer

public HttpServer(String name,
                  String bindAddress,
                  int port,
                  boolean findPort,
                  Configuration conf,
                  AccessControlList adminsAcl)
           throws IOException
Create a status server on the given port. The jsp scripts are taken from src/webapps/.

Parameters:
name - The name of the server
port - The port to use on the server
findPort - whether the server should start at the given port and increment by 1 until it finds a free port.
conf - Configuration
adminsAcl - AccessControlList of the admins
Throws:
IOException

HttpServer

public HttpServer(String name,
                  String bindAddress,
                  int port,
                  boolean findPort,
                  Configuration conf,
                  AccessControlList adminsAcl,
                  org.mortbay.jetty.Connector connector)
           throws IOException
Throws:
IOException
Method Detail

createBaseListener

public org.mortbay.jetty.Connector createBaseListener(Configuration conf)
                                               throws IOException
Create a required listener for the Jetty instance listening on the port provided. This wrapper and all subclasses must create at least one listener.

Throws:
IOException

createDefaultChannelConnector

public static org.mortbay.jetty.Connector createDefaultChannelConnector()

addDefaultApps

protected void addDefaultApps(org.mortbay.jetty.handler.ContextHandlerCollection parent,
                              String appDir)
                       throws IOException
Add default apps.

Parameters:
appDir - The application directory
Throws:
IOException

addDefaultServlets

protected void addDefaultServlets()
Add default servlets.


addContext

public void addContext(org.mortbay.jetty.servlet.Context ctxt,
                       boolean isFiltered)
                throws IOException
Throws:
IOException

addContext

protected void addContext(String pathSpec,
                          String dir,
                          boolean isFiltered)
                   throws IOException
Add a context

Parameters:
pathSpec - The path spec for the context
dir - The directory containing the context
isFiltered - if true, the servlet is added to the filter path mapping
Throws:
IOException

setAttribute

public void setAttribute(String name,
                         Object value)
Set a value in the webapp context. These values are available to the jsp pages as "application.getAttribute(name)".

Parameters:
name - The name of the attribute
value - The value of the attribute

setAttribute

public void setAttribute(org.mortbay.jetty.servlet.Context context,
                         String name,
                         Object value)
Set a value in the webapp context. These values are available to the jsp pages as "application.getAttribute(name)".

Parameters:
context - Context to add attribute
name - The name of the attribute
value - The value of the attribute

addJerseyResourcePackage

public void addJerseyResourcePackage(String packageName,
                                     String pathSpec)
Add a Jersey resource package.

Parameters:
packageName - The Java package name containing the Jersey resource.
pathSpec - The path spec for the servlet

addServlet

public void addServlet(String name,
                       String pathSpec,
                       Class<? extends javax.servlet.http.HttpServlet> clazz)
Add a servlet in the server.

Parameters:
name - The name of the servlet (can be passed as null)
pathSpec - The path spec for the servlet
clazz - The servlet class

addInternalServlet

@Deprecated
public void addInternalServlet(String name,
                                          String pathSpec,
                                          Class<? extends javax.servlet.http.HttpServlet> clazz)
Deprecated. this is a temporary method

Add an internal servlet in the server.

Parameters:
name - The name of the servlet (can be passed as null)
pathSpec - The path spec for the servlet
clazz - The servlet class

addInternalServlet

public void addInternalServlet(String name,
                               String pathSpec,
                               Class<? extends javax.servlet.http.HttpServlet> clazz,
                               boolean requireAuth,
                               boolean useKsslForAuth)
Add an internal servlet in the server, specifying whether or not to protect with Kerberos authentication. Note: This method is to be used for adding servlets that facilitate internal communication and not for user facing functionality. For servlets added using this method, filters (except internal Kerberos filters) are not enabled.

Parameters:
name - The name of the servlet (can be passed as null)
pathSpec - The path spec for the servlet
clazz - The servlet class
requireAuth - Require Kerberos authenticate to access servlet
useKsslForAuth - true to use KSSL for auth, false to use SPNEGO

addFilter

public void addFilter(String name,
                      String classname,
                      Map<String,String> parameters)
Add a filter to the container.

Specified by:
addFilter in interface FilterContainer
Parameters:
name - Filter name
classname - Filter class name
parameters - a map from parameter names to initial values

addGlobalFilter

public void addGlobalFilter(String name,
                            String classname,
                            Map<String,String> parameters)
Add a global filter to the container.

Specified by:
addGlobalFilter in interface FilterContainer
Parameters:
name - filter name
classname - filter class name
parameters - a map from parameter names to initial values

defineFilter

protected void defineFilter(org.mortbay.jetty.servlet.Context ctx,
                            String name,
                            String classname,
                            Map<String,String> parameters,
                            String[] urls)
Define a filter for a context and set up default url mappings.


addFilterPathMapping

protected void addFilterPathMapping(String pathSpec,
                                    org.mortbay.jetty.servlet.Context webAppCtx)
Add the path spec to the filter path mapping.

Parameters:
pathSpec - The path spec
webAppCtx - The WebApplicationContext to add to

getAttribute

public Object getAttribute(String name)
Get the value in the webapp context.

Parameters:
name - The name of the attribute
Returns:
The value of the attribute

getWebAppsPath

protected String getWebAppsPath()
                         throws IOException
Get the pathname to the webapps files.

Returns:
the pathname as a URL
Throws:
IOException - if 'webapps' directory cannot be found on CLASSPATH.

getPort

public int getPort()
Get the port that the server is on

Returns:
the port

setThreads

public void setThreads(int min,
                       int max)
Set the min, max number of worker threads (simultaneous connections).


addSslListener

@Deprecated
public void addSslListener(InetSocketAddress addr,
                                      String keystore,
                                      String storPass,
                                      String keyPass)
                    throws IOException
Deprecated. Use addSslListener(InetSocketAddress, Configuration, boolean)

Configure an ssl listener on the server.

Parameters:
addr - address to listen on
keystore - location of the keystore
storPass - password for the keystore
keyPass - password for the key
Throws:
IOException

addSslListener

public void addSslListener(InetSocketAddress addr,
                           Configuration sslConf,
                           boolean needClientAuth)
                    throws IOException
Configure an ssl listener on the server.

Parameters:
addr - address to listen on
sslConf - conf to retrieve ssl options
needClientAuth - whether client authentication is required
Throws:
IOException

addSslListener

public void addSslListener(InetSocketAddress addr,
                           Configuration sslConf,
                           boolean needCertsAuth,
                           boolean needKrbAuth)
                    throws IOException
Configure an ssl listener on the server.

Parameters:
addr - address to listen on
sslConf - conf to retrieve ssl options
needCertsAuth - whether x509 certificate authentication is required
needKrbAuth - whether to allow kerberos auth
Throws:
IOException

start

public void start()
           throws IOException
Start the server. Does not wait for the server to start.

Throws:
IOException

stop

public void stop()
          throws Exception
stop the server

Throws:
Exception

join

public void join()
          throws InterruptedException
Throws:
InterruptedException

isInstrumentationAccessAllowed

public static boolean isInstrumentationAccessAllowed(javax.servlet.ServletContext servletContext,
                                                     javax.servlet.http.HttpServletRequest request,
                                                     javax.servlet.http.HttpServletResponse response)
                                              throws IOException
Checks the user has privileges to access to instrumentation servlets.

If hadoop.security.instrumentation.requires.admin is set to FALSE (default value) it returns always returns TRUE.

If hadoop.security.instrumentation.requires.admin is set to TRUE it will check that if the current user is in the admin ACLS. If the user is in the admin ACLs it returns TRUE, otherwise it returns FALSE.

Parameters:
servletContext - the servlet context.
request - the servlet request.
response - the servlet response.
Returns:
TRUE/FALSE based on the logic decribed above.
Throws:
IOException

hasAdministratorAccess

public static boolean hasAdministratorAccess(javax.servlet.ServletContext servletContext,
                                             javax.servlet.http.HttpServletRequest request,
                                             javax.servlet.http.HttpServletResponse response)
                                      throws IOException
Does the user sending the HttpServletRequest has the administrator ACLs? If it isn't the case, response will be modified to send an error to the user.

Parameters:
servletContext -
request -
response -
Returns:
true if admin-authorized, false otherwise
Throws:
IOException


Copyright © 2009 The Apache Software Foundation