class Proxy

Routes HTTP requests through the configured admission queues.

Definitions

def initialize(registry, configuration: Configuration.default)

Initialize an HTTP proxy.

Signature

parameter registry Registry

The backend registry.

parameter configuration Configuration

Request classification and scheduling policy.

Implementation

def initialize(registry, configuration: Configuration.default)
	@scheduler = Scheduler.new(registry, configuration)
end

def call(request)

Route a request to the next available backend.

Signature

parameter request Protocol::HTTP::Request

The downstream request.

returns Protocol::HTTP::Response

The upstream or generated response.

Implementation

def call(request)
	unless backend_reservation = @scheduler.acquire(request)
		return Protocol::HTTP::Response[503, {"content-type" => "text/plain"}, ["No backends available.\n"]]
	end
	
	return backend_reservation.response if backend_reservation.is_a?(Scheduler::Rejection)
	
	reservation = :processing
	backend = backend_reservation.backend
	upstream_request = build_request(request)
	response = backend.call(upstream_request)
	backend_reservation.processed
	reservation = :exchange
	
	if body = response.body
		response.body = ResponseBody.new(body){backend_reservation.release}
	else
		backend_reservation.release
	end
	reservation = nil
	
	return response
rescue => error
	case reservation
	when :processing
		backend_reservation.failed
	when :exchange
		backend_reservation.release
	end
	
	return Protocol::HTTP::Response[502, {"content-type" => "text/plain"}, ["Bad Gateway: #{error.class}\n"]]
end