lib/passenger_api.rb in passenger_api-0.1.0 vs lib/passenger_api.rb in passenger_api-0.2.0

- old
+ new

@@ -1,38 +1,66 @@ # frozen_string_literal: true -require 'passenger_api/request' require 'passenger_api/version' -class PassengerAPI - def initialize - require 'passenger_api/ext' - end +require 'json' +require 'net/http' +require 'rack/request' + +unless defined?(PhusionPassenger) + require 'phusion_passenger' + PhusionPassenger.locate_directories +end +PhusionPassenger.require_passenger_lib('admin_tools/instance_registry') + +class PassengerAPI def call(env) - to_rack_response(call_api(build_argv(Request.new(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 - def build_argv(req) - argv = [req.method, req.path] - argv << '--data' << req.body unless req.body.empty? - argv - end + 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) - def call_api(argv) - argv += ['--show-headers'] - catch :response do - PhusionPassenger::Config::ApiCallCommand.new(argv).run + responses = instances.map do |instance| + build_response(instance, call_api(instance, net_http_request)) end + + [200, { 'Content-Type' => 'application/json' }, [responses.to_json]] end - def to_rack_response(res) - # for Ruby 1.8.7 - # headers = res.each_capitalized.to_h - headers = {} - res.each_capitalized { |n, v| headers[n] = v } + 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 - [res.code, headers, [res.body]] + 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 + + 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 end