Class ProxyServlet

java.lang.Object
org.ocpsoft.rewrite.servlet.config.proxy.ProxyServlet

public class ProxyServlet extends Object
An HTTP reverse proxy/gateway servlet. It is designed to be extended for customization if desired. Most of the work is handled by Apache HttpClient.

There are alternatives to a servlet based proxy such as Apache mod_proxy if that is available to you. However this servlet is easily customizable by Java, secure-able by your web application's security (e.g. spring-security), portable across servlet engines, and is embeddable into another web application.

Inspiration: http://httpd.apache.org/docs/2.0/mod/mod_proxy.html

Author:
David Smiley dsmiley@mitre.org
  • Field Details

    • P_LOG

      public static final String P_LOG
      A boolean parameter name to enable logging of input and target URLs to the servlet log.
      See Also:
    • doLog

      protected boolean doLog
    • targetUriObj

      protected URI targetUriObj
    • targetUri

      protected String targetUri
    • proxyClient

      protected org.apache.http.impl.client.CloseableHttpClient proxyClient
    • hopByHopHeaders

      protected static final org.apache.http.message.HeaderGroup hopByHopHeaders
      These are the "hop-by-hop" headers that should not be copied. http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html I use an HttpClient HeaderGroup class instead of Set because this approach does case insensitive lookup faster.
    • asciiQueryChars

      protected static final BitSet asciiQueryChars
  • Constructor Details

    • ProxyServlet

      public ProxyServlet()
  • Method Details

    • getServletConfig

      public ServletConfig getServletConfig()
    • init

      public void init(ServletConfig servletConfig) throws ServletException
      Throws:
      ServletException
    • destroy

      public void destroy()
    • service

      protected void service(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws ServletException, IOException
      Throws:
      ServletException
      IOException
    • doResponseRedirectOrNotModifiedLogic

      protected boolean doResponseRedirectOrNotModifiedLogic(HttpServletRequest servletRequest, HttpServletResponse servletResponse, org.apache.http.HttpResponse proxyResponse, int statusCode) throws ServletException, IOException
      Throws:
      ServletException
      IOException
    • closeQuietly

      protected void closeQuietly(Closeable closeable)
    • copyRequestHeaders

      protected void copyRequestHeaders(HttpServletRequest servletRequest, org.apache.http.HttpRequest proxyRequest)
      Copy request headers from the servlet client to the proxy request.
    • copyResponseHeaders

      protected void copyResponseHeaders(org.apache.http.HttpResponse proxyResponse, HttpServletResponse servletResponse)
      Copy proxied response headers back to the servlet client.
    • copyResponseEntity

      protected void copyResponseEntity(org.apache.http.HttpResponse proxyResponse, HttpServletResponse servletResponse) throws IOException
      Copy response body data (the entity) from the proxy to the servlet client.
      Throws:
      IOException
    • rewriteUrlFromResponse

      protected String rewriteUrlFromResponse(HttpServletRequest servletRequest, String theUrl)
      For a redirect response from the target server, this translates theUrl to redirect to and translates it to one the original client can use.
    • encodeUriQuery

      protected static CharSequence encodeUriQuery(CharSequence in)
      Encodes characters in the query or fragment part of the URI.

      Unfortunately, an incoming URI sometimes has characters disallowed by the spec. HttpClient insists that the outgoing proxied request has a valid URI because it uses Java's URI. To be more forgiving, we must escape the problematic characters. See the URI class for the spec.

      Parameters:
      in - example: name=value&foo=bar#fragment