Class: Hurley::Url

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/hurley/url.rb,
lib/hurley/addressable.rb

Direct Known Subclasses

Empty

Defined Under Namespace

Classes: Empty

Constant Summary collapse

@@parser =
Addressable::URI.method(:parse)

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(parsed) ⇒ Url

Returns a new instance of Url.



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/hurley/url.rb', line 27

def initialize(parsed)
  @parsed = parsed
  if u = @parsed.user
    @user = CGI.unescape(u)
    @parsed.user = nil
  else
    @user = nil
  end

  if pwd = @parsed.password
    @password = CGI.unescape(pwd)
    @parsed.password = nil
  else
    @password = nil
  end

  @parsed.userinfo = nil
end

Instance Attribute Details

#passwordObject

Returns the value of attribute password.



58
59
60
# File 'lib/hurley/url.rb', line 58

def password
  @password
end

#userObject

Returns the value of attribute user.



57
58
59
# File 'lib/hurley/url.rb', line 57

def user
  @user
end

Class Method Details

.escape_path(path) ⇒ Object



9
10
11
# File 'lib/hurley/url.rb', line 9

def self.escape_path(path)
  ERB::Util.url_encode(path.to_s)
end

.escape_paths(*paths) ⇒ Object



13
14
15
16
17
# File 'lib/hurley/url.rb', line 13

def self.escape_paths(*paths)
  paths.map do |path|
    escape_path(path)
  end.join(SLASH)
end

.join(absolute, relative) ⇒ Object



46
47
48
# File 'lib/hurley/url.rb', line 46

def self.join(absolute, relative)
  parse(absolute).join(parse(relative))
end

.parse(raw_url) ⇒ Object



19
20
21
22
23
24
25
# File 'lib/hurley/url.rb', line 19

def self.parse(raw_url)
  case raw_url
  when Url then raw_url
  when nil, EMPTY then Empty.new
  else new(@@parser.call(raw_url.to_s))
  end
end

Instance Method Details

#basic_authObject



152
153
154
155
156
# File 'lib/hurley/url.rb', line 152

def basic_auth
  return unless @user
  userinfo = @password ? "#{@user}:#{@password}" : @user
  "Basic #{Base64.encode64(userinfo).gsub(/\n/, EMPTY)}"
end

#inspectObject



167
168
169
170
171
172
# File 'lib/hurley/url.rb', line 167

def inspect
  "#<%s %s>" % [
    self.class.name,
    to_s,
  ]
end

#join(relative) ⇒ Object



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
# File 'lib/hurley/url.rb', line 76

def join(relative)
  has_host = false

  query.each do |key, value|
    relative.query[key] = value unless relative.query.key?(key)
  end

  if !path.empty? && !relative.path.start_with?(SLASH)
    rel_path = relative.path
    relative.path = path
    if !rel_path.empty?
      joiner = path.end_with?(SLASH) ? nil : SLASH
      relative.path += "#{joiner}#{rel_path}"
    end
  end

  if !relative.path.empty? && !relative.path.start_with?(SLASH)
    relative.path = "/#{relative.path}"
  end

  if relative.host
    has_host = true
  else
    relative.host = host
  end

  if has_host && relative.host != host
    relative.user = relative.password = nil
  else
    relative.user ||= user
    relative.password ||= password
  end

  if relative.scheme
    has_host = true
  else
    relative.scheme = scheme
  end

  inferred_port = INFERRED_PORTS[relative.scheme]
  if !has_host && relative.port == inferred_port
    relative.port = port == inferred_port ? nil : port
  end

  relative
end

#pathObject



64
65
66
# File 'lib/hurley/url.rb', line 64

def path
  @parsed.path
end

#path=(new_path) ⇒ Object



68
69
70
# File 'lib/hurley/url.rb', line 68

def path=(new_path)
  @parsed.path = new_path
end

#portObject



60
61
62
# File 'lib/hurley/url.rb', line 60

def port
  @parsed.port || INFERRED_PORTS[@parsed.scheme]
end

#queryObject



72
73
74
# File 'lib/hurley/url.rb', line 72

def query
  @query ||= query_class.parse(@parsed.query)
end

#query_classObject



158
159
160
# File 'lib/hurley/url.rb', line 158

def query_class
  @query_class ||= Query.default
end

#query_class=(new_query) ⇒ Object



162
163
164
165
# File 'lib/hurley/url.rb', line 162

def query_class=(new_query)
  @query = query ? new_query.new(@query) : nil
  @query_class = new_query
end

#raw_queryObject



139
140
141
142
143
144
145
# File 'lib/hurley/url.rb', line 139

def raw_query
  if (q = query.to_query_string).empty?
    nil
  else
    q
  end
end

#raw_query=(new_query) ⇒ Object



147
148
149
150
# File 'lib/hurley/url.rb', line 147

def raw_query=(new_query)
  @query = nil
  @parsed.query = new_query
end

#request_uriObject



123
124
125
126
127
128
129
130
131
132
# File 'lib/hurley/url.rb', line 123

def request_uri
  req_path = path
  req_path = SLASH if req_path.empty?

  if (q = query.to_query_string).empty?
    req_path
  else
    "#{req_path}?#{q}"
  end
end

#to_sObject



134
135
136
137
# File 'lib/hurley/url.rb', line 134

def to_s
  @parsed.query = raw_query
  @parsed.to_s
end