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
public abstract class ProxyHandler extends ChannelDuplexHandler
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private class
ProxyHandler.LazyChannelPromise
-
Nested classes/interfaces inherited from interface io.netty.channel.ChannelHandler
ChannelHandler.Sharable
-
-
Field Summary
Fields Modifier and Type Field Description (package private) static java.lang.String
AUTH_NONE
A string that signifies 'no authentication' or 'anonymous'.private ProxyHandler.LazyChannelPromise
connectPromise
private ScheduledFuture<?>
connectTimeoutFuture
private long
connectTimeoutMillis
private ChannelHandlerContext
ctx
private static long
DEFAULT_CONNECT_TIMEOUT_MILLIS
The default connect timeout: 10 seconds.private java.net.SocketAddress
destinationAddress
private boolean
finished
private boolean
flushedPrematurely
private static InternalLogger
logger
private PendingWriteQueue
pendingWrites
private java.net.SocketAddress
proxyAddress
private boolean
suppressChannelReadComplete
private ChannelFutureListener
writeListener
-
Constructor Summary
Constructors Modifier Constructor Description protected
ProxyHandler(java.net.SocketAddress proxyAddress)
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected abstract void
addCodec(ChannelHandlerContext ctx)
Adds the codec handlers required to communicate with the proxy server.private void
addPendingWrite(ChannelHandlerContext ctx, java.lang.Object msg, ChannelPromise promise)
abstract java.lang.String
authScheme()
Returns the name of the authentication scheme in use.private void
cancelConnectTimeoutFuture()
void
channelActive(ChannelHandlerContext ctx)
CallsChannelHandlerContext.fireChannelActive()
to forward to the nextChannelInboundHandler
in theChannelPipeline
.void
channelInactive(ChannelHandlerContext ctx)
CallsChannelHandlerContext.fireChannelInactive()
to forward to the nextChannelInboundHandler
in theChannelPipeline
.void
channelRead(ChannelHandlerContext ctx, java.lang.Object msg)
CallsChannelHandlerContext.fireChannelRead(Object)
to forward to the nextChannelInboundHandler
in theChannelPipeline
.void
channelReadComplete(ChannelHandlerContext ctx)
CallsChannelHandlerContext.fireChannelReadComplete()
to forward to the nextChannelInboundHandler
in theChannelPipeline
.void
connect(ChannelHandlerContext ctx, java.net.SocketAddress remoteAddress, java.net.SocketAddress localAddress, ChannelPromise promise)
CallsChannelOutboundInvoker.connect(SocketAddress, SocketAddress, ChannelPromise)
to forward to the nextChannelOutboundHandler
in theChannelPipeline
.Future<Channel>
connectFuture()
Returns aFuture
that is notified when the connection to the destination has been established or the connection attempt has failed.long
connectTimeoutMillis()
Returns the connect timeout in millis.<T extends java.net.SocketAddress>
TdestinationAddress()
Returns the address of the destination to connect to via the proxy server.void
exceptionCaught(ChannelHandlerContext ctx, java.lang.Throwable cause)
CallsChannelHandlerContext.fireExceptionCaught(Throwable)
to forward to the nextChannelHandler
in theChannelPipeline
.protected java.lang.String
exceptionMessage(java.lang.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(java.lang.Throwable cause)
private void
failPendingWritesAndClose(java.lang.Throwable cause)
void
flush(ChannelHandlerContext ctx)
CallsChannelHandlerContext.flush()
to forward to the nextChannelOutboundHandler
in theChannelPipeline
.void
handlerAdded(ChannelHandlerContext ctx)
Do nothing by default, sub-classes may override this method.protected abstract boolean
handleResponse(ChannelHandlerContext ctx, java.lang.Object response)
Handles the message received from the proxy server.boolean
isConnected()
Returnstrue
if and only if the connection to the destination has been established successfully.protected abstract java.lang.Object
newInitialMessage(ChannelHandlerContext ctx)
Returns a new message that is sent at first time when the connection to the proxy server has been established.abstract java.lang.String
protocol()
Returns the name of the proxy protocol in use.<T extends java.net.SocketAddress>
TproxyAddress()
Returns the address of the proxy server.private static void
readIfNeeded(ChannelHandlerContext ctx)
protected abstract void
removeDecoder(ChannelHandlerContext ctx)
Removes the decoders added inaddCodec(ChannelHandlerContext)
.protected abstract void
removeEncoder(ChannelHandlerContext ctx)
Removes the encoders added inaddCodec(ChannelHandlerContext)
.private boolean
safeRemoveDecoder()
private boolean
safeRemoveEncoder()
private void
sendInitialMessage(ChannelHandlerContext ctx)
Sends the initial message to be sent to the proxy server.protected void
sendToProxyServer(java.lang.Object msg)
Sends the specified message to the proxy server.private void
setConnectFailure(java.lang.Throwable cause)
private void
setConnectSuccess()
void
setConnectTimeoutMillis(long connectTimeoutMillis)
Sets the connect timeout in millis.void
write(ChannelHandlerContext ctx, java.lang.Object msg, ChannelPromise promise)
CallsChannelOutboundInvoker.write(Object, ChannelPromise)
to forward to the nextChannelOutboundHandler
in theChannelPipeline
.private void
writePendingWrites()
-
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 Detail
-
logger
private static final InternalLogger logger
-
DEFAULT_CONNECT_TIMEOUT_MILLIS
private static final long DEFAULT_CONNECT_TIMEOUT_MILLIS
The default connect timeout: 10 seconds.- See Also:
- Constant Field Values
-
AUTH_NONE
static final java.lang.String AUTH_NONE
A string that signifies 'no authentication' or 'anonymous'.- See Also:
- Constant Field Values
-
proxyAddress
private final java.net.SocketAddress proxyAddress
-
destinationAddress
private volatile java.net.SocketAddress destinationAddress
-
connectTimeoutMillis
private volatile long connectTimeoutMillis
-
ctx
private volatile ChannelHandlerContext ctx
-
pendingWrites
private PendingWriteQueue pendingWrites
-
finished
private boolean finished
-
suppressChannelReadComplete
private boolean suppressChannelReadComplete
-
flushedPrematurely
private boolean flushedPrematurely
-
connectPromise
private final ProxyHandler.LazyChannelPromise connectPromise
-
connectTimeoutFuture
private ScheduledFuture<?> connectTimeoutFuture
-
writeListener
private final ChannelFutureListener writeListener
-
-
Method Detail
-
protocol
public abstract java.lang.String protocol()
Returns the name of the proxy protocol in use.
-
authScheme
public abstract java.lang.String authScheme()
Returns the name of the authentication scheme in use.
-
proxyAddress
public final <T extends java.net.SocketAddress> T proxyAddress()
Returns the address of the proxy server.
-
destinationAddress
public final <T extends java.net.SocketAddress> T 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
public final Future<Channel> 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
public final void handlerAdded(ChannelHandlerContext ctx) throws java.lang.Exception
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:
java.lang.Exception
-
addCodec
protected abstract void addCodec(ChannelHandlerContext ctx) throws java.lang.Exception
Adds the codec handlers required to communicate with the proxy server.- Throws:
java.lang.Exception
-
removeEncoder
protected abstract void removeEncoder(ChannelHandlerContext ctx) throws java.lang.Exception
Removes the encoders added inaddCodec(ChannelHandlerContext)
.- Throws:
java.lang.Exception
-
removeDecoder
protected abstract void removeDecoder(ChannelHandlerContext ctx) throws java.lang.Exception
Removes the decoders added inaddCodec(ChannelHandlerContext)
.- Throws:
java.lang.Exception
-
connect
public final void connect(ChannelHandlerContext ctx, java.net.SocketAddress remoteAddress, java.net.SocketAddress localAddress, ChannelPromise promise) throws java.lang.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:
java.lang.Exception
- thrown if an error occurs
-
channelActive
public final void channelActive(ChannelHandlerContext ctx) throws java.lang.Exception
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:
java.lang.Exception
-
sendInitialMessage
private void sendInitialMessage(ChannelHandlerContext ctx) throws java.lang.Exception
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:
java.lang.Exception
-
newInitialMessage
protected abstract java.lang.Object newInitialMessage(ChannelHandlerContext ctx) throws java.lang.Exception
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:
java.lang.Exception
-
sendToProxyServer
protected final void sendToProxyServer(java.lang.Object msg)
Sends the specified message to the proxy server. Use this method to send a response to the proxy server inhandleResponse(ChannelHandlerContext, Object)
.
-
channelInactive
public final void channelInactive(ChannelHandlerContext ctx) throws java.lang.Exception
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:
java.lang.Exception
-
exceptionCaught
public final void exceptionCaught(ChannelHandlerContext ctx, java.lang.Throwable cause) throws java.lang.Exception
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:
java.lang.Exception
-
channelRead
public final void channelRead(ChannelHandlerContext ctx, java.lang.Object msg) throws java.lang.Exception
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:
java.lang.Exception
-
handleResponse
protected abstract boolean handleResponse(ChannelHandlerContext ctx, java.lang.Object response) throws java.lang.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:
java.lang.Exception
-
setConnectSuccess
private void setConnectSuccess()
-
safeRemoveDecoder
private boolean safeRemoveDecoder()
-
safeRemoveEncoder
private boolean safeRemoveEncoder()
-
setConnectFailure
private void setConnectFailure(java.lang.Throwable cause)
-
failPendingWritesAndClose
private void failPendingWritesAndClose(java.lang.Throwable cause)
-
cancelConnectTimeoutFuture
private void cancelConnectTimeoutFuture()
-
exceptionMessage
protected final java.lang.String exceptionMessage(java.lang.String msg)
Decorates the specified exception message with the common information such as the current protocol, authentication scheme, proxy address, and destination address.
-
channelReadComplete
public final void channelReadComplete(ChannelHandlerContext ctx) throws java.lang.Exception
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:
java.lang.Exception
-
write
public final void write(ChannelHandlerContext ctx, java.lang.Object msg, ChannelPromise promise) throws java.lang.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:
java.lang.Exception
- thrown if an error occurs
-
flush
public final void flush(ChannelHandlerContext ctx) throws java.lang.Exception
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:
java.lang.Exception
- thrown if an error occurs
-
readIfNeeded
private static void readIfNeeded(ChannelHandlerContext ctx)
-
writePendingWrites
private void writePendingWrites()
-
failPendingWrites
private void failPendingWrites(java.lang.Throwable cause)
-
addPendingWrite
private void addPendingWrite(ChannelHandlerContext ctx, java.lang.Object msg, ChannelPromise promise)
-
-