Package io.netty.handler.proxy
Class ProxyHandler
java.lang.Object
io.netty.channel.ChannelHandlerAdapter
io.netty.channel.ChannelInboundHandlerAdapter
io.netty.channel.ChannelDuplexHandler
io.netty.handler.proxy.ProxyHandler
- All Implemented Interfaces:
ChannelHandler
,ChannelInboundHandler
,ChannelOutboundHandler
- Direct Known Subclasses:
HttpProxyHandler
,Socks4ProxyHandler
,Socks5ProxyHandler
A common abstraction for protocols that establish blind forwarding proxy tunnels.
-
Nested Class Summary
Nested ClassesNested classes/interfaces inherited from interface io.netty.channel.ChannelHandler
ChannelHandler.Sharable
-
Field Summary
FieldsModifier and TypeFieldDescription(package private) static final String
A string that signifies 'no authentication' or 'anonymous'.private final ProxyHandler.LazyChannelPromise
private Future
<?> private long
private ChannelHandlerContext
private static final long
The default connect timeout: 10 seconds.private SocketAddress
private boolean
private boolean
private static final InternalLogger
private PendingWriteQueue
private final SocketAddress
private boolean
private final ChannelFutureListener
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected abstract void
Adds the codec handlers required to communicate with the proxy server.private void
addPendingWrite
(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) abstract String
Returns the name of the authentication scheme in use.private void
final void
CallsChannelHandlerContext.fireChannelActive()
to forward to the nextChannelInboundHandler
in theChannelPipeline
.final void
CallsChannelHandlerContext.fireChannelInactive()
to forward to the nextChannelInboundHandler
in theChannelPipeline
.final void
channelRead
(ChannelHandlerContext ctx, Object msg) CallsChannelHandlerContext.fireChannelRead(Object)
to forward to the nextChannelInboundHandler
in theChannelPipeline
.final void
CallsChannelHandlerContext.fireChannelReadComplete()
to forward to the nextChannelInboundHandler
in theChannelPipeline
.final void
connect
(ChannelHandlerContext ctx, SocketAddress remoteAddress, SocketAddress localAddress, ChannelPromise promise) CallsChannelOutboundInvoker.connect(SocketAddress, SocketAddress, ChannelPromise)
to forward to the nextChannelOutboundHandler
in theChannelPipeline
.Returns aFuture
that is notified when the connection to the destination has been established or the connection attempt has failed.final long
Returns the connect timeout in millis.final <T extends SocketAddress>
TReturns the address of the destination to connect to via the proxy server.final void
exceptionCaught
(ChannelHandlerContext ctx, Throwable cause) CallsChannelHandlerContext.fireExceptionCaught(Throwable)
to forward to the nextChannelHandler
in theChannelPipeline
.protected final String
exceptionMessage
(String msg) Decorates the specified exception message with the common information such as the current protocol, authentication scheme, proxy address, and destination address.private void
failPendingWrites
(Throwable cause) private void
final void
CallsChannelHandlerContext.flush()
to forward to the nextChannelOutboundHandler
in theChannelPipeline
.final void
Do nothing by default, sub-classes may override this method.protected abstract boolean
handleResponse
(ChannelHandlerContext ctx, Object response) Handles the message received from the proxy server.final boolean
Returnstrue
if and only if the connection to the destination has been established successfully.protected abstract Object
Returns a new message that is sent at first time when the connection to the proxy server has been established.abstract String
protocol()
Returns the name of the proxy protocol in use.final <T extends SocketAddress>
TReturns the address of the proxy server.private static void
protected abstract void
Removes the decoders added inaddCodec(ChannelHandlerContext)
.protected abstract void
Removes the encoders added inaddCodec(ChannelHandlerContext)
.private boolean
private boolean
private void
Sends the initial message to be sent to the proxy server.protected final void
sendToProxyServer
(Object msg) Sends the specified message to the proxy server.private void
setConnectFailure
(Throwable cause) private void
final void
setConnectTimeoutMillis
(long connectTimeoutMillis) Sets the connect timeout in millis.final void
write
(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) CallsChannelOutboundInvoker.write(Object, ChannelPromise)
to forward to the nextChannelOutboundHandler
in theChannelPipeline
.private void
Methods inherited from class io.netty.channel.ChannelDuplexHandler
bind, close, deregister, disconnect, read
Methods inherited from class io.netty.channel.ChannelInboundHandlerAdapter
channelRegistered, channelUnregistered, channelWritabilityChanged, userEventTriggered
Methods inherited from class io.netty.channel.ChannelHandlerAdapter
ensureNotSharable, handlerRemoved, isSharable
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface io.netty.channel.ChannelHandler
handlerRemoved
-
Field Details
-
logger
-
DEFAULT_CONNECT_TIMEOUT_MILLIS
private static final long DEFAULT_CONNECT_TIMEOUT_MILLISThe default connect timeout: 10 seconds.- See Also:
-
AUTH_NONE
A string that signifies 'no authentication' or 'anonymous'.- See Also:
-
proxyAddress
-
destinationAddress
-
connectTimeoutMillis
private volatile long connectTimeoutMillis -
ctx
-
pendingWrites
-
finished
private boolean finished -
suppressChannelReadComplete
private boolean suppressChannelReadComplete -
flushedPrematurely
private boolean flushedPrematurely -
connectPromise
-
connectTimeoutFuture
-
writeListener
-
-
Constructor Details
-
ProxyHandler
-
-
Method Details
-
protocol
Returns the name of the proxy protocol in use. -
authScheme
Returns the name of the authentication scheme in use. -
proxyAddress
Returns the address of the proxy server. -
destinationAddress
Returns the address of the destination to connect to via the proxy server. -
isConnected
public final boolean isConnected()Returnstrue
if and only if the connection to the destination has been established successfully. -
connectFuture
Returns aFuture
that is notified when the connection to the destination has been established or the connection attempt has failed. -
connectTimeoutMillis
public final long connectTimeoutMillis()Returns the connect timeout in millis. If the connection attempt to the destination does not finish within the timeout, the connection attempt will be failed. -
setConnectTimeoutMillis
public final void setConnectTimeoutMillis(long connectTimeoutMillis) Sets the connect timeout in millis. If the connection attempt to the destination does not finish within the timeout, the connection attempt will be failed. -
handlerAdded
Description copied from class:ChannelHandlerAdapter
Do nothing by default, sub-classes may override this method.- Specified by:
handlerAdded
in interfaceChannelHandler
- Overrides:
handlerAdded
in classChannelHandlerAdapter
- Throws:
Exception
-
addCodec
Adds the codec handlers required to communicate with the proxy server.- Throws:
Exception
-
removeEncoder
Removes the encoders added inaddCodec(ChannelHandlerContext)
.- Throws:
Exception
-
removeDecoder
Removes the decoders added inaddCodec(ChannelHandlerContext)
.- Throws:
Exception
-
connect
public final void connect(ChannelHandlerContext ctx, SocketAddress remoteAddress, SocketAddress localAddress, ChannelPromise promise) throws Exception Description copied from class:ChannelDuplexHandler
CallsChannelOutboundInvoker.connect(SocketAddress, SocketAddress, ChannelPromise)
to forward to the nextChannelOutboundHandler
in theChannelPipeline
. Sub-classes may override this method to change behavior.- Specified by:
connect
in interfaceChannelOutboundHandler
- Overrides:
connect
in classChannelDuplexHandler
- Parameters:
ctx
- theChannelHandlerContext
for which the connect operation is maderemoteAddress
- theSocketAddress
to which it should connectlocalAddress
- theSocketAddress
which is used as source on connectpromise
- theChannelPromise
to notify once the operation completes- Throws:
Exception
- thrown if an error occurs
-
channelActive
Description copied from class:ChannelInboundHandlerAdapter
CallsChannelHandlerContext.fireChannelActive()
to forward to the nextChannelInboundHandler
in theChannelPipeline
. Sub-classes may override this method to change behavior.- Specified by:
channelActive
in interfaceChannelInboundHandler
- Overrides:
channelActive
in classChannelInboundHandlerAdapter
- Throws:
Exception
-
sendInitialMessage
Sends the initial message to be sent to the proxy server. This method also starts a timeout task which marks theconnectPromise
as failure if the connection attempt does not success within the timeout.- Throws:
Exception
-
newInitialMessage
Returns a new message that is sent at first time when the connection to the proxy server has been established.- Returns:
- the initial message, or
null
if the proxy server is expected to send the first message instead - Throws:
Exception
-
sendToProxyServer
Sends the specified message to the proxy server. Use this method to send a response to the proxy server inhandleResponse(ChannelHandlerContext, Object)
. -
channelInactive
Description copied from class:ChannelInboundHandlerAdapter
CallsChannelHandlerContext.fireChannelInactive()
to forward to the nextChannelInboundHandler
in theChannelPipeline
. Sub-classes may override this method to change behavior.- Specified by:
channelInactive
in interfaceChannelInboundHandler
- Overrides:
channelInactive
in classChannelInboundHandlerAdapter
- Throws:
Exception
-
exceptionCaught
Description copied from class:ChannelInboundHandlerAdapter
CallsChannelHandlerContext.fireExceptionCaught(Throwable)
to forward to the nextChannelHandler
in theChannelPipeline
. Sub-classes may override this method to change behavior.- Specified by:
exceptionCaught
in interfaceChannelHandler
- Specified by:
exceptionCaught
in interfaceChannelInboundHandler
- Overrides:
exceptionCaught
in classChannelInboundHandlerAdapter
- Throws:
Exception
-
channelRead
Description copied from class:ChannelInboundHandlerAdapter
CallsChannelHandlerContext.fireChannelRead(Object)
to forward to the nextChannelInboundHandler
in theChannelPipeline
. Sub-classes may override this method to change behavior.- Specified by:
channelRead
in interfaceChannelInboundHandler
- Overrides:
channelRead
in classChannelInboundHandlerAdapter
- Throws:
Exception
-
handleResponse
protected abstract boolean handleResponse(ChannelHandlerContext ctx, Object response) throws Exception Handles the message received from the proxy server.- Returns:
true
if the connection to the destination has been established,false
if the connection to the destination has not been established and more messages are expected from the proxy server- Throws:
Exception
-
setConnectSuccess
private void setConnectSuccess() -
safeRemoveDecoder
private boolean safeRemoveDecoder() -
safeRemoveEncoder
private boolean safeRemoveEncoder() -
setConnectFailure
-
failPendingWritesAndClose
-
cancelConnectTimeoutFuture
private void cancelConnectTimeoutFuture() -
exceptionMessage
Decorates the specified exception message with the common information such as the current protocol, authentication scheme, proxy address, and destination address. -
channelReadComplete
Description copied from class:ChannelInboundHandlerAdapter
CallsChannelHandlerContext.fireChannelReadComplete()
to forward to the nextChannelInboundHandler
in theChannelPipeline
. Sub-classes may override this method to change behavior.- Specified by:
channelReadComplete
in interfaceChannelInboundHandler
- Overrides:
channelReadComplete
in classChannelInboundHandlerAdapter
- Throws:
Exception
-
write
public final void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception Description copied from class:ChannelDuplexHandler
CallsChannelOutboundInvoker.write(Object, ChannelPromise)
to forward to the nextChannelOutboundHandler
in theChannelPipeline
. Sub-classes may override this method to change behavior.- Specified by:
write
in interfaceChannelOutboundHandler
- Overrides:
write
in classChannelDuplexHandler
- Parameters:
ctx
- theChannelHandlerContext
for which the write operation is mademsg
- the message to writepromise
- theChannelPromise
to notify once the operation completes- Throws:
Exception
- thrown if an error occurs
-
flush
Description copied from class:ChannelDuplexHandler
CallsChannelHandlerContext.flush()
to forward to the nextChannelOutboundHandler
in theChannelPipeline
. Sub-classes may override this method to change behavior.- Specified by:
flush
in interfaceChannelOutboundHandler
- Overrides:
flush
in classChannelDuplexHandler
- Parameters:
ctx
- theChannelHandlerContext
for which the flush operation is made- Throws:
Exception
- thrown if an error occurs
-
readIfNeeded
-
writePendingWrites
private void writePendingWrites() -
failPendingWrites
-
addPendingWrite
-