Async::HTTPSourceAsyncHTTPServer

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 arguments Array

Arguments to pass to Async::HTTP::Server#initialize.

parameter options Hash

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 app Protocol::HTTP::Middleware

The Rack-compatible application to serve.

parameter endpoint Endpoint

The endpoint to bind to.

parameter protocol Protocol

The protocol to use for incoming connections.

parameter scheme String

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 peer IO

The connected peer.

parameter address Addrinfo

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