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