Class AbstractProxyServlet

  • All Implemented Interfaces:
    Serializable, javax.servlet.Servlet, javax.servlet.ServletConfig
    Direct Known Subclasses:
    AsyncMiddleManServlet, ProxyServlet

    public abstract class AbstractProxyServlet
    extends javax.servlet.http.HttpServlet

    Abstract base class for proxy servlets.

    Forwards requests to another server either as a standard web reverse proxy or as a transparent reverse proxy (as defined by RFC 7230).

    To facilitate JMX monitoring, the HttpClient instance is set as ServletContext attribute, prefixed with this servlet's name and exposed by the mechanism provided by ServletContext.setAttribute(String, Object).

    The following init parameters may be used to configure the servlet:

    • preserveHost - the host header specified by the client is forwarded to the server
    • hostHeader - forces the host header to a particular value
    • viaHost - the name to use in the Via header: Via: http/1.1 <viaHost>
    • whiteList - comma-separated list of allowed proxy hosts
    • blackList - comma-separated list of forbidden proxy hosts

    In addition, see createHttpClient() for init parameters used to configure the HttpClient instance.

    NOTE: By default the Host header sent to the server by this proxy servlet is the server's host name. However, this breaks redirects. Set preserveHost to true to make redirects working, although this may break server's virtual host selection.

    The default behavior of not preserving the Host header mimics the default behavior of Apache httpd and Nginx, which both have a way to be configured to preserve the Host header.

    See Also:
    Serialized Form
    • Constructor Detail

      • AbstractProxyServlet

        public AbstractProxyServlet()
    • Method Detail

      • init

        public void init()
                  throws javax.servlet.ServletException
        Overrides:
        init in class javax.servlet.GenericServlet
        Throws:
        javax.servlet.ServletException
      • destroy

        public void destroy()
        Specified by:
        destroy in interface javax.servlet.Servlet
        Overrides:
        destroy in class javax.servlet.GenericServlet
      • getHostHeader

        public String getHostHeader()
      • getViaHost

        public String getViaHost()
      • getTimeout

        public long getTimeout()
      • setTimeout

        public void setTimeout​(long timeout)
      • getWhiteListHosts

        public Set<String> getWhiteListHosts()
      • getBlackListHosts

        public Set<String> getBlackListHosts()
      • createLogger

        protected Logger createLogger()
        Returns:
        a logger instance with a name derived from this servlet's name.
      • newHttpClient

        protected HttpClient newHttpClient()
        Returns:
        a new HttpClient instance
      • getHttpClient

        protected HttpClient getHttpClient()
      • validateDestination

        public boolean validateDestination​(String host,
                                           int port)
        Checks the given host and port against whitelist and blacklist.
        Parameters:
        host - the host to check
        port - the port to check
        Returns:
        true if it is allowed to be proxy to the given host and port
      • rewriteTarget

        protected String rewriteTarget​(javax.servlet.http.HttpServletRequest clientRequest)
      • onProxyRewriteFailed

        protected void onProxyRewriteFailed​(javax.servlet.http.HttpServletRequest clientRequest,
                                            javax.servlet.http.HttpServletResponse proxyResponse)

        Callback method invoked when the URI rewrite performed in rewriteTarget(HttpServletRequest) returns null indicating that no rewrite can be performed.

        It is possible to use blocking API in this method, like HttpServletResponse.sendError(int).

        Parameters:
        clientRequest - the client request
        proxyResponse - the client response
      • hasContent

        protected boolean hasContent​(javax.servlet.http.HttpServletRequest clientRequest)
      • expects100Continue

        protected boolean expects100Continue​(javax.servlet.http.HttpServletRequest request)
      • copyRequestHeaders

        protected void copyRequestHeaders​(javax.servlet.http.HttpServletRequest clientRequest,
                                          Request proxyRequest)
      • findConnectionHeaders

        protected Set<String> findConnectionHeaders​(javax.servlet.http.HttpServletRequest clientRequest)
      • addProxyHeaders

        protected void addProxyHeaders​(javax.servlet.http.HttpServletRequest clientRequest,
                                       Request proxyRequest)
      • addViaHeader

        protected void addViaHeader​(Request proxyRequest)
      • addXForwardedHeaders

        protected void addXForwardedHeaders​(javax.servlet.http.HttpServletRequest clientRequest,
                                            Request proxyRequest)
      • sendProxyRequest

        protected void sendProxyRequest​(javax.servlet.http.HttpServletRequest clientRequest,
                                        javax.servlet.http.HttpServletResponse proxyResponse,
                                        Request proxyRequest)
      • newProxyResponseListener

        protected abstract Response.CompleteListener newProxyResponseListener​(javax.servlet.http.HttpServletRequest clientRequest,
                                                                              javax.servlet.http.HttpServletResponse proxyResponse)
      • onClientRequestFailure

        protected void onClientRequestFailure​(javax.servlet.http.HttpServletRequest clientRequest,
                                              Request proxyRequest,
                                              javax.servlet.http.HttpServletResponse proxyResponse,
                                              Throwable failure)
      • onServerResponseHeaders

        protected void onServerResponseHeaders​(javax.servlet.http.HttpServletRequest clientRequest,
                                               javax.servlet.http.HttpServletResponse proxyResponse,
                                               Response serverResponse)
      • filterServerResponseHeader

        protected String filterServerResponseHeader​(javax.servlet.http.HttpServletRequest clientRequest,
                                                    Response serverResponse,
                                                    String headerName,
                                                    String headerValue)
      • onProxyResponseSuccess

        protected void onProxyResponseSuccess​(javax.servlet.http.HttpServletRequest clientRequest,
                                              javax.servlet.http.HttpServletResponse proxyResponse,
                                              Response serverResponse)
      • onProxyResponseFailure

        protected void onProxyResponseFailure​(javax.servlet.http.HttpServletRequest clientRequest,
                                              javax.servlet.http.HttpServletResponse proxyResponse,
                                              Response serverResponse,
                                              Throwable failure)
      • getRequestId

        protected int getRequestId​(javax.servlet.http.HttpServletRequest clientRequest)
      • sendProxyResponseError

        protected void sendProxyResponseError​(javax.servlet.http.HttpServletRequest clientRequest,
                                              javax.servlet.http.HttpServletResponse proxyResponse,
                                              int status)
      • onContinue

        protected void onContinue​(javax.servlet.http.HttpServletRequest clientRequest,
                                  Request proxyRequest)