lib/mlb/request_builder.rb
require "net/http"
require "uri"
require_relative "version"
module MLB
class RequestBuilder
DEFAULT_HEADERS = {
"Content-Type" => "application/json; charset=utf-8",
"User-Agent" => "MLB-Client/#{VERSION} #{RUBY_ENGINE}/#{RUBY_VERSION} (#{RUBY_PLATFORM})"
}.freeze
HTTP_METHODS = {
get: Net::HTTP::Get,
post: Net::HTTP::Post,
put: Net::HTTP::Put,
delete: Net::HTTP::Delete
}.freeze
def build(http_method:, uri:, body: nil, headers: {})
request = create_request(http_method:, uri:, body:)
add_headers(request:, headers:)
request
end
private
def create_request(http_method:, uri:, body:)
http_method_class = HTTP_METHODS[http_method]
raise ArgumentError, "Unsupported HTTP method: #{http_method}" unless http_method_class
escaped_uri = escape_query_params(uri)
request = http_method_class.new(escaped_uri)
request.body = body
request
end
def add_headers(request:, headers:)
DEFAULT_HEADERS.merge(headers).each do |key, value|
request.delete(key)
request.add_field(key, value)
end
end
def escape_query_params(uri)
URI(uri).tap { |u| u.query = URI.encode_www_form(URI.decode_www_form(u.query)) if u.query }
end
end
end