Class: Proxi::Server
- Inherits:
-
Object
- Object
- Proxi::Server
- Includes:
- Wisper::Publisher
- Defined in:
- lib/proxi/server.rb
Overview
‘Proxi::Server` accepts TCP requests, and forwards them, by creating an outbound connection and forwarding traffic in both directions.
The destination of the outbound connection, and the forwarding of data, is handled by a ‘Proxi::Connection`, created by a factory object, which can be a lambda.
Start listening for connections by calling #call.
‘Proxi::Server` broadcasts the following events:
-
‘new_connection(Proxi::Connection)`
-
‘dead_connection(Proxi::Connection)`
Instance Method Summary collapse
-
#call ⇒ Object
Public: Start the server.
-
#close ⇒ Object
Public: close the TCP server socket.
-
#initialize(listen_port, connection_factory, max_connections: 5) ⇒ Server
constructor
Public: Initialize a Server.
Constructor Details
#initialize(listen_port, connection_factory, max_connections: 5) ⇒ Server
Public: Initialize a Server
listen_port - The String or Integer of the port to listen to for
incoming connections
connection_factory - Implements #call(in_socket) and returns a
Proxi::Connection
max_connections - The maximum amount of parallel connections to handle
at once
29 30 31 32 33 34 |
# File 'lib/proxi/server.rb', line 29 def initialize(listen_port, connection_factory, max_connections: 5) @listen_port = listen_port @connection_factory = connection_factory @max_connections = 5 @connections = [] end |
Instance Method Details
#call ⇒ Object
Public: Start the server
Start accepting and forwarding requests
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/proxi/server.rb', line 39 def call @server = TCPServer.new('localhost', @listen_port) until @server.closed? in_socket = @server.accept connection = @connection_factory.call(in_socket) broadcast(:new_connection, connection) @connections.push(connection) connection.call # spawns a new thread that handles proxying reap_connections while @connections.size >= @max_connections sleep 1 reap_connections end end ensure close unless @server.closed? end |
#close ⇒ Object
Public: close the TCP server socket
Included for completeness, note that if the proxy server is active it will likely be blocking on TCPServer#accept, and the server port will stay open until it has accepted one final request.
67 68 69 |
# File 'lib/proxi/server.rb', line 67 def close @server.close end |