Module: CommandTower::Clients::Url

Defined in:
app/services/command_tower/clients/url.rb

Overview

URI-aware URL helpers for ClientBase absolutization. Joins provider base_url with relative endpoint paths without URI.join replacing intentional base path prefixes (e.g. /api/v1).

Class Method Summary collapse

Class Method Details

.absolute?(url) ⇒ Boolean

Returns:

  • (Boolean)


13
14
15
16
17
18
# File 'app/services/command_tower/clients/url.rb', line 13

def absolute?(url)
  uri = URI.parse(url.to_s)
  uri.absolute? && uri.host.present?
rescue URI::InvalidURIError
  false
end

.join(base_url, relative_path) ⇒ Object



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
# File 'app/services/command_tower/clients/url.rb', line 20

def join(base_url, relative_path)
  base = base_url.to_s.strip
  if base.empty?
    raise Errors::ConfigurationError, "base_url is required to resolve a relative request URL"
  end

  uri = URI.parse(base)
  unless uri.absolute? && uri.host.present?
    raise Errors::ConfigurationError,
          "base_url must be an absolute URL with a host (got: #{base_url.inspect})"
  end

  suffix = relative_path.to_s.delete_prefix("/")
  prefix = uri.path.to_s
  prefix = "" if prefix == "/"
  prefix = prefix.delete_suffix("/")

  combined = if prefix.empty?
               "/#{suffix}"
  else
               "#{prefix}/#{suffix}"
  end
  combined = "/" if combined.empty?

  result = uri.dup
  result.path = combined
  result.query = nil
  result.fragment = nil
  result.to_s
rescue URI::InvalidURIError => e
  raise Errors::ConfigurationError,
        "invalid base_url: #{base_url.inspect}",
        cause: e
end