- java.lang.Object
-
- org.eclipse.jetty.util.component.AbstractLifeCycle
-
- org.eclipse.jetty.util.component.ContainerLifeCycle
-
- org.eclipse.jetty.server.handler.AbstractHandler
-
- org.eclipse.jetty.server.handler.AbstractHandlerContainer
-
- org.eclipse.jetty.server.handler.HandlerWrapper
-
- org.eclipse.jetty.proxy.ConnectHandler
-
- All Implemented Interfaces:
org.eclipse.jetty.server.Handler
,org.eclipse.jetty.server.HandlerContainer
,org.eclipse.jetty.util.component.Container
,org.eclipse.jetty.util.component.Destroyable
,org.eclipse.jetty.util.component.Dumpable
,org.eclipse.jetty.util.component.LifeCycle
public class ConnectHandler extends org.eclipse.jetty.server.handler.HandlerWrapper
Implementation of a
Handler
that supports HTTP CONNECT.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description protected static class
ConnectHandler.ConnectContext
protected class
ConnectHandler.ConnectManager
class
ConnectHandler.DownstreamConnection
class
ConnectHandler.UpstreamConnection
-
Nested classes/interfaces inherited from class org.eclipse.jetty.server.handler.AbstractHandler
org.eclipse.jetty.server.handler.AbstractHandler.ErrorDispatchHandler
-
Nested classes/interfaces inherited from class org.eclipse.jetty.util.component.AbstractLifeCycle
org.eclipse.jetty.util.component.AbstractLifeCycle.AbstractLifeCycleListener, org.eclipse.jetty.util.component.AbstractLifeCycle.StopException
-
-
Field Summary
Fields Modifier and Type Field Description protected static org.slf4j.Logger
LOG
-
Constructor Summary
Constructors Constructor Description ConnectHandler()
ConnectHandler(org.eclipse.jetty.server.Handler handler)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected void
connectToServer(javax.servlet.http.HttpServletRequest request, java.lang.String host, int port, org.eclipse.jetty.util.Promise<java.nio.channels.SocketChannel> promise)
protected void
doStart()
java.util.Set<java.lang.String>
getBlackListHosts()
int
getBufferSize()
org.eclipse.jetty.io.ByteBufferPool
getByteBufferPool()
long
getConnectTimeout()
java.util.concurrent.Executor
getExecutor()
long
getIdleTimeout()
org.eclipse.jetty.util.thread.Scheduler
getScheduler()
java.util.Set<java.lang.String>
getWhiteListHosts()
void
handle(java.lang.String target, org.eclipse.jetty.server.Request jettyRequest, javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
protected boolean
handleAuthentication(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, java.lang.String address)
Handles the authentication before setting up the tunnel to the remote server.protected void
handleConnect(org.eclipse.jetty.server.Request baseRequest, javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, java.lang.String serverAddress)
Handles a CONNECT request.protected java.net.InetSocketAddress
newConnectAddress(java.lang.String host, int port)
Creates the server address to connect to.protected ConnectHandler.DownstreamConnection
newDownstreamConnection(org.eclipse.jetty.io.EndPoint endPoint, java.util.concurrent.ConcurrentMap<java.lang.String,java.lang.Object> context)
protected org.eclipse.jetty.io.SelectorManager
newSelectorManager()
protected ConnectHandler.UpstreamConnection
newUpstreamConnection(org.eclipse.jetty.io.EndPoint endPoint, ConnectHandler.ConnectContext connectContext)
protected void
onConnectFailure(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, javax.servlet.AsyncContext asyncContext, java.lang.Throwable failure)
protected void
onConnectSuccess(ConnectHandler.ConnectContext connectContext, ConnectHandler.UpstreamConnection upstreamConnection)
protected void
prepareContext(javax.servlet.http.HttpServletRequest request, java.util.concurrent.ConcurrentMap<java.lang.String,java.lang.Object> context)
protected int
read(org.eclipse.jetty.io.EndPoint endPoint, java.nio.ByteBuffer buffer, java.util.concurrent.ConcurrentMap<java.lang.String,java.lang.Object> context)
Reads (with non-blocking semantic) into the givenbuffer
from the givenendPoint
.void
setBufferSize(int bufferSize)
void
setByteBufferPool(org.eclipse.jetty.io.ByteBufferPool bufferPool)
void
setConnectTimeout(long connectTimeout)
void
setExecutor(java.util.concurrent.Executor executor)
void
setIdleTimeout(long idleTimeout)
void
setScheduler(org.eclipse.jetty.util.thread.Scheduler scheduler)
boolean
validateDestination(java.lang.String host, int port)
Checks the givenhost
andport
against whitelist and blacklist.protected void
write(org.eclipse.jetty.io.EndPoint endPoint, java.nio.ByteBuffer buffer, org.eclipse.jetty.util.Callback callback, java.util.concurrent.ConcurrentMap<java.lang.String,java.lang.Object> context)
Writes (with non-blocking semantic) the given buffer of data onto the given endPoint.-
Methods inherited from class org.eclipse.jetty.server.handler.HandlerWrapper
destroy, expandChildren, getHandler, getHandlers, insertHandler, setHandler
-
Methods inherited from class org.eclipse.jetty.server.handler.AbstractHandlerContainer
expandHandler, findContainerOf, getChildHandlerByClass, getChildHandlers, getChildHandlersByClass, setServer
-
Methods inherited from class org.eclipse.jetty.server.handler.AbstractHandler
doError, doStop, getServer
-
Methods inherited from class org.eclipse.jetty.util.component.ContainerLifeCycle
addBean, addBean, addEventListener, addManaged, contains, dump, dump, dump, dumpObjects, dumpStdErr, getBean, getBeans, getBeans, getContainedBeans, getContainedBeans, isAuto, isManaged, isUnmanaged, manage, removeBean, removeBeans, removeEventListener, setBeans, start, stop, unmanage, updateBean, updateBean, updateBeans
-
Methods inherited from class org.eclipse.jetty.util.component.AbstractLifeCycle
getEventListeners, getState, getState, isFailed, isRunning, isStarted, isStarting, isStopped, isStopping, setEventListeners, start, stop, toString
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-
-
-
-
Method Detail
-
getExecutor
public java.util.concurrent.Executor getExecutor()
-
setExecutor
public void setExecutor(java.util.concurrent.Executor executor)
-
getScheduler
public org.eclipse.jetty.util.thread.Scheduler getScheduler()
-
setScheduler
public void setScheduler(org.eclipse.jetty.util.thread.Scheduler scheduler)
-
getByteBufferPool
public org.eclipse.jetty.io.ByteBufferPool getByteBufferPool()
-
setByteBufferPool
public void setByteBufferPool(org.eclipse.jetty.io.ByteBufferPool bufferPool)
-
getConnectTimeout
public long getConnectTimeout()
- Returns:
- the timeout, in milliseconds, to connect to the remote server
-
setConnectTimeout
public void setConnectTimeout(long connectTimeout)
- Parameters:
connectTimeout
- the timeout, in milliseconds, to connect to the remote server
-
getIdleTimeout
public long getIdleTimeout()
- Returns:
- the idle timeout, in milliseconds
-
setIdleTimeout
public void setIdleTimeout(long idleTimeout)
- Parameters:
idleTimeout
- the idle timeout, in milliseconds
-
getBufferSize
public int getBufferSize()
-
setBufferSize
public void setBufferSize(int bufferSize)
-
doStart
protected void doStart() throws java.lang.Exception
- Overrides:
doStart
in classorg.eclipse.jetty.server.handler.AbstractHandler
- Throws:
java.lang.Exception
-
newSelectorManager
protected org.eclipse.jetty.io.SelectorManager newSelectorManager()
-
handle
public void handle(java.lang.String target, org.eclipse.jetty.server.Request jettyRequest, javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException
- Specified by:
handle
in interfaceorg.eclipse.jetty.server.Handler
- Overrides:
handle
in classorg.eclipse.jetty.server.handler.HandlerWrapper
- Throws:
javax.servlet.ServletException
java.io.IOException
-
handleConnect
protected void handleConnect(org.eclipse.jetty.server.Request baseRequest, javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, java.lang.String serverAddress)
Handles a CONNECT request.
CONNECT requests may have authentication headers such as
Proxy-Authorization
that authenticate the client with the proxy.- Parameters:
baseRequest
- Jetty-specific http requestrequest
- the http requestresponse
- the http responseserverAddress
- the remote server address in the formhost:port
-
connectToServer
protected void connectToServer(javax.servlet.http.HttpServletRequest request, java.lang.String host, int port, org.eclipse.jetty.util.Promise<java.nio.channels.SocketChannel> promise)
-
newConnectAddress
protected java.net.InetSocketAddress newConnectAddress(java.lang.String host, int port)
Creates the server address to connect to.- Parameters:
host
- The host from the CONNECT requestport
- The port from the CONNECT request- Returns:
- The InetSocketAddress to connect to.
-
onConnectSuccess
protected void onConnectSuccess(ConnectHandler.ConnectContext connectContext, ConnectHandler.UpstreamConnection upstreamConnection)
-
onConnectFailure
protected void onConnectFailure(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, javax.servlet.AsyncContext asyncContext, java.lang.Throwable failure)
-
handleAuthentication
protected boolean handleAuthentication(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, java.lang.String address)
Handles the authentication before setting up the tunnel to the remote server.
The default implementation returns true.
- Parameters:
request
- the HTTP requestresponse
- the HTTP responseaddress
- the address of the remote server in the formhost:port
.- Returns:
- true to allow to connect to the remote host, false otherwise
-
newDownstreamConnection
protected ConnectHandler.DownstreamConnection newDownstreamConnection(org.eclipse.jetty.io.EndPoint endPoint, java.util.concurrent.ConcurrentMap<java.lang.String,java.lang.Object> context)
-
newUpstreamConnection
protected ConnectHandler.UpstreamConnection newUpstreamConnection(org.eclipse.jetty.io.EndPoint endPoint, ConnectHandler.ConnectContext connectContext)
-
prepareContext
protected void prepareContext(javax.servlet.http.HttpServletRequest request, java.util.concurrent.ConcurrentMap<java.lang.String,java.lang.Object> context)
-
read
protected int read(org.eclipse.jetty.io.EndPoint endPoint, java.nio.ByteBuffer buffer, java.util.concurrent.ConcurrentMap<java.lang.String,java.lang.Object> context) throws java.io.IOException
Reads (with non-blocking semantic) into the given
buffer
from the givenendPoint
.- Parameters:
endPoint
- the endPoint to read frombuffer
- the buffer to read data intocontext
- the context information related to the connection- Returns:
- the number of bytes read (possibly 0 since the read is non-blocking) or -1 if the channel has been closed remotely
- Throws:
java.io.IOException
- if the endPoint cannot be read
-
write
protected void write(org.eclipse.jetty.io.EndPoint endPoint, java.nio.ByteBuffer buffer, org.eclipse.jetty.util.Callback callback, java.util.concurrent.ConcurrentMap<java.lang.String,java.lang.Object> context)
Writes (with non-blocking semantic) the given buffer of data onto the given endPoint.
- Parameters:
endPoint
- the endPoint to write tobuffer
- the buffer to writecallback
- the completion callback to invokecontext
- the context information related to the connection
-
getWhiteListHosts
public java.util.Set<java.lang.String> getWhiteListHosts()
-
getBlackListHosts
public java.util.Set<java.lang.String> getBlackListHosts()
-
validateDestination
public boolean validateDestination(java.lang.String host, int port)
Checks the givenhost
andport
against whitelist and blacklist.- Parameters:
host
- the host to checkport
- the port to check- Returns:
- true if it is allowed to connect to the given host and port
-
-