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:
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.
Modifier and Type | Class | Description |
---|---|---|
protected static class |
AbstractProxyServlet.TransparentDelegate |
Utility class that implement transparent proxy functionalities.
|
Modifier and Type | Field | Description |
---|---|---|
protected org.eclipse.jetty.util.log.Logger |
_log |
|
protected static java.lang.String |
CLIENT_REQUEST_ATTRIBUTE |
|
protected static java.util.Set<java.lang.String> |
HOP_HEADERS |
Constructor | Description |
---|---|
AbstractProxyServlet() |
Modifier and Type | Method | Description |
---|---|---|
protected void |
addProxyHeaders(javax.servlet.http.HttpServletRequest clientRequest,
Request proxyRequest) |
|
protected void |
addViaHeader(Request proxyRequest) |
|
protected void |
addXForwardedHeaders(javax.servlet.http.HttpServletRequest clientRequest,
Request proxyRequest) |
|
protected void |
copyRequestHeaders(javax.servlet.http.HttpServletRequest clientRequest,
Request proxyRequest) |
|
protected HttpClient |
createHttpClient() |
Creates a
HttpClient instance, configured with init parameters of this servlet. |
protected org.eclipse.jetty.util.log.Logger |
createLogger() |
|
void |
destroy() |
|
protected boolean |
expects100Continue(javax.servlet.http.HttpServletRequest request) |
|
protected java.lang.String |
filterServerResponseHeader(javax.servlet.http.HttpServletRequest clientRequest,
Response serverResponse,
java.lang.String headerName,
java.lang.String headerValue) |
|
protected java.util.Set<java.lang.String> |
findConnectionHeaders(javax.servlet.http.HttpServletRequest clientRequest) |
|
java.util.Set<java.lang.String> |
getBlackListHosts() |
|
java.lang.String |
getHostHeader() |
|
protected HttpClient |
getHttpClient() |
|
protected int |
getRequestId(javax.servlet.http.HttpServletRequest clientRequest) |
|
long |
getTimeout() |
|
java.lang.String |
getViaHost() |
|
java.util.Set<java.lang.String> |
getWhiteListHosts() |
|
protected boolean |
hasContent(javax.servlet.http.HttpServletRequest clientRequest) |
|
void |
init() |
|
protected HttpClient |
newHttpClient() |
|
protected abstract Response.CompleteListener |
newProxyResponseListener(javax.servlet.http.HttpServletRequest clientRequest,
javax.servlet.http.HttpServletResponse proxyResponse) |
|
protected void |
onClientRequestFailure(javax.servlet.http.HttpServletRequest clientRequest,
Request proxyRequest,
javax.servlet.http.HttpServletResponse proxyResponse,
java.lang.Throwable failure) |
|
protected void |
onContinue(javax.servlet.http.HttpServletRequest clientRequest,
Request proxyRequest) |
|
protected void |
onProxyResponseFailure(javax.servlet.http.HttpServletRequest clientRequest,
javax.servlet.http.HttpServletResponse proxyResponse,
Response serverResponse,
java.lang.Throwable failure) |
|
protected void |
onProxyResponseSuccess(javax.servlet.http.HttpServletRequest clientRequest,
javax.servlet.http.HttpServletResponse proxyResponse,
Response serverResponse) |
|
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. |
protected void |
onServerResponseHeaders(javax.servlet.http.HttpServletRequest clientRequest,
javax.servlet.http.HttpServletResponse proxyResponse,
Response serverResponse) |
|
protected java.lang.String |
rewriteTarget(javax.servlet.http.HttpServletRequest clientRequest) |
|
protected void |
sendProxyRequest(javax.servlet.http.HttpServletRequest clientRequest,
javax.servlet.http.HttpServletResponse proxyResponse,
Request proxyRequest) |
|
protected void |
sendProxyResponseError(javax.servlet.http.HttpServletRequest clientRequest,
javax.servlet.http.HttpServletResponse proxyResponse,
int status) |
|
void |
setTimeout(long timeout) |
|
boolean |
validateDestination(java.lang.String host,
int port) |
Checks the given
host and port against whitelist and blacklist. |
getInitParameter, getInitParameterNames, getServletConfig, getServletContext, getServletInfo, getServletName, init, log, log
protected static final java.lang.String CLIENT_REQUEST_ATTRIBUTE
protected static final java.util.Set<java.lang.String> HOP_HEADERS
protected org.eclipse.jetty.util.log.Logger _log
public void init() throws javax.servlet.ServletException
init
in class javax.servlet.GenericServlet
javax.servlet.ServletException
public void destroy()
destroy
in class javax.servlet.GenericServlet
public java.lang.String getHostHeader()
public java.lang.String getViaHost()
public long getTimeout()
public void setTimeout(long timeout)
public java.util.Set<java.lang.String> getWhiteListHosts()
public java.util.Set<java.lang.String> getBlackListHosts()
protected org.eclipse.jetty.util.log.Logger createLogger()
protected HttpClient createHttpClient() throws javax.servlet.ServletException
Creates a HttpClient
instance, configured with init parameters of this servlet.
The init parameters used to configure the HttpClient
instance are:
init-param | default | description |
---|---|---|
maxThreads | 256 | The max number of threads of HttpClient's Executor. If not set, or set to the value of "-", then the Jetty server thread pool will be used. |
maxConnections | 32768 | The max number of connections per destination, see HttpClient.setMaxConnectionsPerDestination(int) |
idleTimeout | 30000 | The idle timeout in milliseconds, see HttpClient.setIdleTimeout(long) |
timeout | 60000 | The total timeout in milliseconds, see Request.timeout(long, java.util.concurrent.TimeUnit) |
requestBufferSize | HttpClient's default | The request buffer size, see HttpClient.setRequestBufferSize(int) |
responseBufferSize | HttpClient's default | The response buffer size, see HttpClient.setResponseBufferSize(int) |
HttpClient
configured from the servlet configuration
javax.servlet.ServletException
- if the HttpClient
cannot be createdprotected HttpClient newHttpClient()
protected HttpClient getHttpClient()
public boolean validateDestination(java.lang.String host, int port)
host
and port
against whitelist and blacklist.host
- the host to checkport
- the port to checkprotected java.lang.String rewriteTarget(javax.servlet.http.HttpServletRequest clientRequest)
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)
.
clientRequest
- the client requestproxyResponse
- the client responseprotected boolean hasContent(javax.servlet.http.HttpServletRequest clientRequest)
protected boolean expects100Continue(javax.servlet.http.HttpServletRequest request)
protected void copyRequestHeaders(javax.servlet.http.HttpServletRequest clientRequest, Request proxyRequest)
protected java.util.Set<java.lang.String> findConnectionHeaders(javax.servlet.http.HttpServletRequest clientRequest)
protected void addProxyHeaders(javax.servlet.http.HttpServletRequest clientRequest, Request proxyRequest)
protected void addViaHeader(Request proxyRequest)
protected void addXForwardedHeaders(javax.servlet.http.HttpServletRequest clientRequest, Request proxyRequest)
protected void sendProxyRequest(javax.servlet.http.HttpServletRequest clientRequest, javax.servlet.http.HttpServletResponse proxyResponse, Request proxyRequest)
protected abstract Response.CompleteListener newProxyResponseListener(javax.servlet.http.HttpServletRequest clientRequest, javax.servlet.http.HttpServletResponse proxyResponse)
protected void onClientRequestFailure(javax.servlet.http.HttpServletRequest clientRequest, Request proxyRequest, javax.servlet.http.HttpServletResponse proxyResponse, java.lang.Throwable failure)
protected void onServerResponseHeaders(javax.servlet.http.HttpServletRequest clientRequest, javax.servlet.http.HttpServletResponse proxyResponse, Response serverResponse)
protected java.lang.String filterServerResponseHeader(javax.servlet.http.HttpServletRequest clientRequest, Response serverResponse, java.lang.String headerName, java.lang.String headerValue)
protected void onProxyResponseSuccess(javax.servlet.http.HttpServletRequest clientRequest, javax.servlet.http.HttpServletResponse proxyResponse, Response serverResponse)
protected void onProxyResponseFailure(javax.servlet.http.HttpServletRequest clientRequest, javax.servlet.http.HttpServletResponse proxyResponse, Response serverResponse, java.lang.Throwable failure)
protected int getRequestId(javax.servlet.http.HttpServletRequest clientRequest)
protected void sendProxyResponseError(javax.servlet.http.HttpServletRequest clientRequest, javax.servlet.http.HttpServletResponse proxyResponse, int status)
protected void onContinue(javax.servlet.http.HttpServletRequest clientRequest, Request proxyRequest)
Copyright © 1995–2018 Webtide. All rights reserved.