Class HttpTunnelServer

java.lang.Object
org.springframework.boot.devtools.tunnel.server.HttpTunnelServer

public class HttpTunnelServer extends Object
A server that can be used to tunnel TCP traffic over HTTP. Similar in design to the Bidirectional-streams Over Synchronous HTTP (BOSH) XMPP extension protocol, the server uses long polling with HTTP requests held open until a response is available. A typical traffic pattern would be as follows:
 [ CLIENT ]                      [ SERVER ]
     | (a) Initial empty request     |
     |------------------------------>|
     | (b) Data I                    |
  -->|------------------------------>|--->
     | Response I (a)                |
  <--|<------------------------------|<---
     |                               |
     | (c) Data II                   |
  -->|------------------------------>|--->
     | Response II (b)               |
  <--|<------------------------------|<---
     .                               .
     .                               .
 
Each incoming request is held open to be used to carry the next available response. The server will hold at most two connections open at any given time.

Requests should be made using HTTP GET or POST (depending if there is a payload), with any payload contained in the body. The following response codes can be returned from the server:

Response Codes
Status Meaning
200 (OK) Data payload response.
204 (No Content) The long poll has timed out and the client should start a new request.
429 (Too many requests) There are already enough connections open, this one can be dropped.
410 (Gone) The target server has disconnected.
503 (Service Unavailable) The target server is unavailable

Requests and responses that contain payloads include a x-seq header that contains a running sequence number (used to ensure data is applied in the correct order). The first request containing a payload should have a x-seq value of 1.

Since:
1.3.0
Author:
Phillip Webb, Andy Wilkinson
See Also:
  • Constructor Details

    • HttpTunnelServer

      public HttpTunnelServer(TargetServerConnection serverConnection)
      Creates a new HttpTunnelServer instance.
      Parameters:
      serverConnection - the connection to the target server
  • Method Details

    • handle

      public void handle(ServerHttpRequest request, ServerHttpResponse response) throws IOException
      Handle an incoming HTTP connection.
      Parameters:
      request - the HTTP request
      response - the HTTP response
      Throws:
      IOException - in case of I/O errors
    • handle

      protected void handle(HttpTunnelServer.HttpConnection httpConnection) throws IOException
      Handle an incoming HTTP connection.
      Parameters:
      httpConnection - the HTTP connection
      Throws:
      IOException - in case of I/O errors
    • getServerThread

      protected HttpTunnelServer.ServerThread getServerThread() throws IOException
      Returns the active server thread, creating and starting it if necessary.
      Returns:
      the ServerThread (never null)
      Throws:
      IOException - in case of I/O errors
    • setLongPollTimeout

      public void setLongPollTimeout(int longPollTimeout)
      Set the long poll timeout for the server.
      Parameters:
      longPollTimeout - the long poll timeout in milliseconds
    • setDisconnectTimeout

      public void setDisconnectTimeout(long disconnectTimeout)
      Set the maximum amount of time to wait for a client before closing the connection.
      Parameters:
      disconnectTimeout - the disconnect timeout in milliseconds