Class ConnectHandler

All Implemented Interfaces:
Handler, HandlerContainer, Container, Destroyable, Dumpable, Dumpable.DumpableContainer, LifeCycle

public class ConnectHandler extends HandlerWrapper

Implementation of a Handler that supports HTTP CONNECT.

  • Field Details

    • LOG

      protected static final org.slf4j.Logger LOG
  • Constructor Details

    • ConnectHandler

      public ConnectHandler()
    • ConnectHandler

      public ConnectHandler(Handler handler)
  • Method Details

    • getExecutor

      public Executor getExecutor()
    • setExecutor

      public void setExecutor(Executor executor)
    • getScheduler

      public Scheduler getScheduler()
    • setScheduler

      public void setScheduler(Scheduler scheduler)
    • getByteBufferPool

      public ByteBufferPool getByteBufferPool()
    • setByteBufferPool

      public void setByteBufferPool(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 Exception
      Description copied from class: ContainerLifeCycle
      Starts the managed lifecycle beans in the order they were added.
      Overrides:
      doStart in class AbstractHandler
      Throws:
      AbstractLifeCycle.StopException - If thrown, the lifecycle will immediately be stopped.
      Exception - If there was a problem starting. Will cause a transition to FAILED state
    • newSelectorManager

      protected SelectorManager newSelectorManager()
    • handle

      public void handle(String target, Request jettyRequest, jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response) throws jakarta.servlet.ServletException, IOException
      Description copied from interface: Handler
      Handle a request.
      Specified by:
      handle in interface Handler
      Overrides:
      handle in class HandlerWrapper
      Parameters:
      target - The target of the request - either a URI or a name.
      jettyRequest - The original unwrapped request object.
      request - The request either as the Request object or a wrapper of that request. The HttpConnection.getCurrentConnection().getHttpChannel().getRequest() method can be used access the Request object if required.
      response - The response as the Response object or a wrapper of that request. The HttpConnection.getCurrentConnection().getHttpChannel().getResponse() method can be used access the Response object if required.
      Throws:
      jakarta.servlet.ServletException - if unable to handle the request or response due to underlying servlet issue
      IOException - if unable to handle the request or response processing
    • handleConnect

      protected void handleConnect(Request baseRequest, jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response, 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 request
      request - the http request
      response - the http response
      serverAddress - the remote server address in the form host:port
    • connectToServer

      protected void connectToServer(jakarta.servlet.http.HttpServletRequest request, String host, int port, Promise<SocketChannel> promise)
    • newConnectAddress

      protected InetSocketAddress newConnectAddress(String host, int port)
      Creates the server address to connect to.
      Parameters:
      host - The host from the CONNECT request
      port - 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(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response, jakarta.servlet.AsyncContext asyncContext, Throwable failure)
    • handleAuthentication

      protected boolean handleAuthentication(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response, String address)

      Handles the authentication before setting up the tunnel to the remote server.

      The default implementation returns true.

      Parameters:
      request - the HTTP request
      response - the HTTP response
      address - the address of the remote server in the form host:port.
      Returns:
      true to allow to connect to the remote host, false otherwise
    • newDownstreamConnection

      protected ConnectHandler.DownstreamConnection newDownstreamConnection(EndPoint endPoint, ConcurrentMap<String,Object> context)
    • newUpstreamConnection

      protected ConnectHandler.UpstreamConnection newUpstreamConnection(EndPoint endPoint, ConnectHandler.ConnectContext connectContext)
    • prepareContext

      protected void prepareContext(jakarta.servlet.http.HttpServletRequest request, ConcurrentMap<String,Object> context)
    • read

      protected int read(EndPoint endPoint, ByteBuffer buffer, ConcurrentMap<String,Object> context) throws IOException

      Reads (with non-blocking semantic) into the given buffer from the given endPoint.

      Parameters:
      endPoint - the endPoint to read from
      buffer - the buffer to read data into
      context - 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:
      IOException - if the endPoint cannot be read
    • write

      protected void write(EndPoint endPoint, ByteBuffer buffer, Callback callback, ConcurrentMap<String,Object> context)

      Writes (with non-blocking semantic) the given buffer of data onto the given endPoint.

      Parameters:
      endPoint - the endPoint to write to
      buffer - the buffer to write
      callback - the completion callback to invoke
      context - the context information related to the connection
    • getWhiteListHosts

      public Set<String> getWhiteListHosts()
    • getBlackListHosts

      public Set<String> getBlackListHosts()
    • validateDestination

      public boolean validateDestination(String host, int port)
      Checks the given host and port against whitelist and blacklist.
      Parameters:
      host - the host to check
      port - the port to check
      Returns:
      true if it is allowed to connect to the given host and port