class PassengerAPI

Constants

VERSION

Public Instance Methods

call(env) click to toggle source
# File lib/passenger_api.rb, line 17
def call(env)
  rack_request = Rack::Request.new(env)
  case rack_request.path
  when '/health'
    [200, { 'Content-Type' => 'text/plain' }, ["OK\n"]]
  else
    proxy_api(rack_request)
  end
end

Private Instance Methods

build_response(instance, net_http_response) click to toggle source
# File lib/passenger_api.rb, line 41
def build_response(instance, net_http_response)
  {
    instance: instance.as_json.merge(state: instance.state),
    status:   net_http_response.code.to_i,
    header:   net_http_response.each_capitalized.to_h,
    body:     net_http_response.body,
  }
end
call_api(instance, net_http_request) click to toggle source
# File lib/passenger_api.rb, line 50
def call_api(instance, net_http_request)
  net_http_request.basic_auth('admin', instance.full_admin_password)
  instance.http_request('agents.s/core_api', net_http_request)
end
convert_rack_request_to_net_http_request(rack_request) click to toggle source
# File lib/passenger_api.rb, line 55
def convert_rack_request_to_net_http_request(rack_request)
  klass = Net::HTTP.const_get(rack_request.request_method.capitalize)
  header = {}
  if rack_request.content_type
    header['Content-Type'] = rack_request.content_type
  end
  net_http_request = klass.new(rack_request.fullpath, header)
  body = rack_request.body.read
  net_http_request.body = body unless body.empty?
  net_http_request
end
proxy_api(rack_request) click to toggle source
# File lib/passenger_api.rb, line 29
def proxy_api(rack_request)
  dir = rack_request.get_header('HTTP_X_PASSENGER_INSTANCE_REGISTRY_DIR')
  instances = PhusionPassenger::AdminTools::InstanceRegistry.new(dir).list
  net_http_request = convert_rack_request_to_net_http_request(rack_request)

  responses = instances.map do |instance|
    build_response(instance, call_api(instance, net_http_request))
  end

  [200, { 'Content-Type' => 'application/json' }, [responses.to_json]]
end