class Server
An HTTP server that accepts connections on a specific endpoint and dispatches requests to an application handler.
Definitions
def self.for(*arguments, **options, &block)
Create a server using a block as the application handler.
Signature
-
parameter
argumentsArray Arguments to pass to
Async::HTTP::Server#initialize.-
parameter
optionsHash Options to pass to
Async::HTTP::Server#initialize.
Implementation
def self.for(*arguments, **options, &block)
self.new(block, *arguments, **options)
end
def initialize(app, endpoint, protocol: endpoint.protocol, scheme: endpoint.scheme)
Initialize the server with an application handler and endpoint.
Signature
-
parameter
appProtocol::HTTP::Middleware The Rack-compatible application to serve.
-
parameter
endpointEndpoint The endpoint to bind to.
-
parameter
protocolProtocol The protocol to use for incoming connections.
-
parameter
schemeString The default scheme to set on requests.
Implementation
def initialize(app, endpoint, protocol: endpoint.protocol, scheme: endpoint.scheme)
super(app)
@endpoint = endpoint
@protocol = protocol
@scheme = scheme
end
def as_json(...)
Signature
-
returns
Hash A JSON-compatible representation of this server.
Implementation
def as_json(...)
{
endpoint: @endpoint.to_s,
protocol: @protocol,
scheme: @scheme,
}
end
def to_json(...)
Signature
-
returns
String A JSON string representation of this server.
Implementation
def to_json(...)
as_json.to_json(...)
end
def accept(peer, address, task: Task.current)
Accept an incoming connection and process requests.
Signature
-
parameter
peerIO The connected peer.
-
parameter
addressAddrinfo The remote address of the peer.
Implementation
def accept(peer, address, task: Task.current)
connection = @protocol.server(peer)
Console.debug(self){"Incoming connnection from #{address.inspect} to #{@protocol}"}
connection.each do |request|
# We set the default scheme unless it was otherwise specified.
# https://tools.ietf.org/html/rfc7230#section-5.5
request.scheme ||= self.scheme
# Console.debug(self) {"Incoming request from #{address.inspect}: #{request.method} #{request.path}"}
# If this returns nil, we assume that the connection has been hijacked.
self.call(request)
end
ensure
connection&.close
end
def run
Signature
-
returns
Async::Task The task that is running the server.
Implementation
def run
Async do |task|
@endpoint.accept(&self.method(:accept))
# Wait for all children to finish:
task.children.each(&:wait)
end
end