Sha256: 8e5f5e7cd81c9205f987c1e8c0e9cec64e57196d6e196cf973ea21433b95b6b9
Contents?: true
Size: 1.86 KB
Versions: 1
Compression:
Stored size: 1.86 KB
Contents
# frozen_string_literal: true require 'passenger_api/version' 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) 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 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 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 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
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
passenger_api-0.2.0 | lib/passenger_api.rb |