Request/response class skeletons
This commit is contained in:
parent
3af7a372da
commit
9d483aa163
|
@ -1,21 +1,87 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'uri'
|
||||
|
||||
module Hyde
|
||||
# Request wrapper for Rack protocol
|
||||
class Request
|
||||
# @param env [Array]
|
||||
def initialize(env)
|
||||
@env = env
|
||||
@method = env["REQUEST_METHOD"]
|
||||
@path = env["PATH_INFO"]
|
||||
# Should not be used under regular circumstances or depended upon.
|
||||
@_original_env = env
|
||||
# Rack environment variable bindings. Should be public.
|
||||
@request_method = env["REQUEST_METHOD"]
|
||||
@script_name = env["SCRIPT_NAME"]
|
||||
@query_string = env["QUERY_STRING"]
|
||||
@host = env["SERVER_NAME"]
|
||||
@port = env["SERVER_PORT"]
|
||||
@virtual_host = env["HTTP_HOST"]
|
||||
@headers = env.filter { |k, _| k.start_with? "HTTP_" }
|
||||
@path_info = env["PATH_INFO"]
|
||||
@server_name = env["SERVER_NAME"]
|
||||
@server_port = env["SERVER_PORT"]
|
||||
@server_protocol = env["SERVER_PROTOCOL"]
|
||||
@headers = init_headers(env)
|
||||
# Encapsulates all rack variables. Should not be public.
|
||||
@rack = init_rack_vars(env)
|
||||
end
|
||||
|
||||
attr_reader @host
|
||||
attr_reader @port
|
||||
# Returns request body (if POST data exists)
|
||||
def body
|
||||
@rack.input&.gets
|
||||
end
|
||||
|
||||
attr_reader :request_method, :script_name, :path_info, :server_name, :server_port, :server_protocol, :headers
|
||||
|
||||
private
|
||||
|
||||
# Initialize rack parameters struct
|
||||
# @param env [Hash]
|
||||
# @return Object
|
||||
def init_rack_vars(env)
|
||||
rack_vars = env.filter_map do |k|
|
||||
k.delete_prefix "rack." if k.start_with? "rack."
|
||||
end
|
||||
rack_vars["multipart"] = init_multipart_vars
|
||||
rack_keys = rack_vars.keys.map(&:to_sym)
|
||||
Struct.new(*rack_keys)
|
||||
.new(*rack_vars.values_at(rack_keys))
|
||||
.freeze
|
||||
end
|
||||
|
||||
# Initialize multipart parameters struct
|
||||
# @param env [Hash]
|
||||
# @return Object
|
||||
def init_multipart_vars
|
||||
multipart_vars = env.filter_map do |k|
|
||||
k.delete_prefix "rack.multipart." if k.start_with? "rack.multipart"
|
||||
end
|
||||
multipart_keys = multipart_vars.keys.map(&:to_sym)
|
||||
Struct.new(*multipart_keys)
|
||||
.new(*multipart_vars.values_at(multipart_keys))
|
||||
.freeze
|
||||
end
|
||||
|
||||
# Iniitalize headers hash
|
||||
# @param env [Hash]
|
||||
# @return Hash
|
||||
def init_headers(env)
|
||||
headers = env.filter_map do |name, value|
|
||||
[name.delete_prefix("HTTP_"), value] if name.start_with?("HTTP_")
|
||||
end.to_h
|
||||
headers.merge!({ "CONTENT_TYPE" => env["CONTENT_TYPE"],
|
||||
"CONTENT_LENGTH" => env["CONTENT_LENGTH"] })
|
||||
headers.freeze
|
||||
end
|
||||
end
|
||||
|
||||
# Rack protocol response wrapper.
|
||||
class Response
|
||||
def initialize
|
||||
@status = 404
|
||||
@headers = {}
|
||||
@body = []
|
||||
end
|
||||
|
||||
# Finish constructing Rack protocol response.
|
||||
# @return [Array(Integer,Hash,Array)]
|
||||
def finalize
|
||||
[@status, @headers, @body]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue