/usr/lib/ruby/vendor_ruby/berkshelf/api/rest_gateway.rb is in berkshelf-api 2.2.0-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | require 'reel'
module Berkshelf::API
class RESTGateway < Reel::Server::HTTP
extend Forwardable
include Berkshelf::API::GenericServer
include Berkshelf::API::Logging
DEFAULT_OPTIONS = {
host: '0.0.0.0',
port: 26200,
quiet: false,
workers: 10
}.freeze
INITIAL_BODY = ''
CONTENT_TYPE_ORIG = 'Content-Type'.freeze
CONTENT_LENGTH_ORIG = 'Content-Length'.freeze
CONTENT_TYPE = 'CONTENT_TYPE'.freeze
CONTENT_LENGTH = 'CONTENT_LENGTH'.freeze
SERVER_SOFTWARE = 'SERVER_SOFTWARE'.freeze
SERVER_NAME = 'SERVER_NAME'.freeze
SERVER_PORT = 'SERVER_PORT'.freeze
SERVER_PROTOCOL = 'SERVER_PROTOCOL'.freeze
GATEWAY_INTERFACE = "GATEWAY_INTERFACE".freeze
LOCALHOST = 'localhost'.freeze
HTTP_VERSION = 'HTTP_VERSION'.freeze
CGI_1_1 = 'CGI/1.1'.freeze
REMOTE_ADDR = 'REMOTE_ADDR'.freeze
CONNECTION = 'HTTP_CONNECTION'.freeze
SCRIPT_NAME = 'SCRIPT_NAME'.freeze
PATH_INFO = 'PATH_INFO'.freeze
REQUEST_METHOD = 'REQUEST_METHOD'.freeze
QUERY_STRING = 'QUERY_STRING'.freeze
HTTP_1_0 = 'HTTP/1.0'.freeze
HTTP_1_1 = 'HTTP/1.1'.freeze
HTTP_ = 'HTTP_'.freeze
HOST = 'Host'.freeze
RACK_INPUT = 'rack.input'.freeze
RACK_LOGGER = 'rack.logger'.freeze
RACK_VERSION = 'rack.version'.freeze
RACK_ERRORS = 'rack.errors'.freeze
RACK_MULTITHREAD = 'rack.multithread'.freeze
RACK_MULTIPROCESS = 'rack.multiprocess'.freeze
RACK_RUN_ONCE = 'rack.run_once'.freeze
RACK_URL_SCHEME = 'rack.url_scheme'.freeze
RACK_WEBSOCKET = 'rack.websocket'.freeze
PROTO_RACK_ENV = {
RACK_VERSION => ::Rack::VERSION,
RACK_ERRORS => STDERR,
RACK_MULTITHREAD => true,
RACK_MULTIPROCESS => false,
RACK_RUN_ONCE => false,
RACK_URL_SCHEME => "http".freeze,
SCRIPT_NAME => ENV[SCRIPT_NAME] || "",
SERVER_PROTOCOL => HTTP_1_1,
SERVER_SOFTWARE => "berkshelf-api/#{Berkshelf::API::VERSION}".freeze,
GATEWAY_INTERFACE => CGI_1_1
}.freeze
# @return [String]
attr_reader :host
# @return [Integer]
attr_reader :port
# @return [Integer]
attr_reader :workers
# @return [Berkshelf::API::RackApp]
attr_reader :app
server_name :rest_gateway
# @option options [String] :host ('0.0.0.0')
# @option options [Integer] :port (26200)
# @option options [Boolean] :quiet (false)
# @option options [Integer] :workers (10)
def initialize(options = {})
options = DEFAULT_OPTIONS.merge(options)
@host = options[:host]
@port = options[:port]
log.info "REST Gateway listening on #{@host}:#{@port}"
super(@host, @port, &method(:on_connect))
@app = Berkshelf::API::RackApp.new
end
def on_connect(connection)
while request = connection.request
case request
when request.websocket?
request.respond(:bad_request, "WebSockets not supported")
else
route_request(connection, request)
end
end
end
def route_request(connection, request)
status, headers, body_parts = app.call(request_env(request, connection))
body, is_stream = response_body(body_parts)
response_klass = is_stream ? Reel::StreamResponse : Reel::Response
response = response_klass.new(status, headers, body)
connection.respond(response)
end
def request_env(request, connection)
env = env(request)
env[REMOTE_ADDR] = connection.remote_ip
env
end
private
def env(request)
env = Hash[PROTO_RACK_ENV]
env[RACK_INPUT] = StringIO.new(request.body.to_s || INITIAL_BODY)
env[RACK_INPUT].set_encoding(Encoding::BINARY) if env[RACK_INPUT].respond_to?(:set_encoding)
env[SERVER_NAME], env[SERVER_PORT] = (request[HOST]||'').split(':', 2)
env[SERVER_PORT] ||= port.to_s
env[HTTP_VERSION] = request.version || env[SERVER_PROTOCOL]
env[REQUEST_METHOD] = request.method
env[PATH_INFO] = request.path
env[QUERY_STRING] = request.query_string || ''
(_ = request.headers.delete CONTENT_TYPE_ORIG) && (env[CONTENT_TYPE] = _)
(_ = request.headers.delete CONTENT_LENGTH_ORIG) && (env[CONTENT_LENGTH] = _)
request.headers.each_pair do |key, val|
env[HTTP_ + key.gsub('-', '_').upcase] = val
end
env
end
def response_body(body_parts)
if body_parts.respond_to?(:to_path)
::File.new(body_parts.to_path)
else
body = ''
body_parts.each do |c|
return [c, true] if c.is_a?(Reel::Stream)
body << c
end
body_parts.close if body_parts.respond_to?(:close)
body
end
end
end
end
|