class Proxy
Routes HTTP requests through the configured admission queues.
Definitions
def initialize(registry, configuration: Configuration.default)
Initialize an HTTP proxy.
Signature
-
parameter
registryRegistry The backend registry.
-
parameter
configurationConfiguration 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
requestProtocol::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