Module: Rack::Utils

Defined in:
lib/ext/rack/utils.rb

Constant Summary collapse

DEFAULT_SEP =
/[&;] */n

Class Method Summary collapse

Class Method Details

.bytesize(string) ⇒ Object



59
60
61
# File 'lib/ext/rack/utils.rb', line 59

def self.bytesize(string)
  string.bytesize
end

.escape(s) ⇒ Object



15
16
17
18
19
# File 'lib/ext/rack/utils.rb', line 15

def self.escape(s)
  s.to_s.gsub(/([^ a-zA-Z0-9_.-]+)/n) {
    '%'+$1.unpack('H2'*bytesize($1)).join('%').upcase
  }.tr(' ', '+')
end

.key_space_limitObject



9
10
11
# File 'lib/ext/rack/utils.rb', line 9

def self.key_space_limit
  @@key_space_limit
end

.key_space_limit=(value) ⇒ Object



5
6
7
# File 'lib/ext/rack/utils.rb', line 5

def self.key_space_limit=(value)
  @@key_space_limit = value
end

.parse_query(qs, d = nil) ⇒ Object



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
# File 'lib/ext/rack/utils.rb', line 28

def self.parse_query(qs, d = nil)
  params = {}

  max_key_space = key_space_limit
  bytes = 0

  (qs || '').split(d ? /[#{d}] */n : DEFAULT_SEP).each do |p|
    k, v = p.split('=', 2).map { |x| unescape(x) }

    if k
      bytes += k.size
      if bytes > max_key_space
        raise RangeError, "exceeded available parameter key space"
      end
    end

    if cur = params[k]
      if cur.class == Array
        params[k] << v
      else
        params[k] = [cur, v]
      end
    else
      params[k] = v
    end
  end

  return params
end

.unescape(s) ⇒ Object

Unescapes a URI escaped string. (Stolen from Camping).



22
23
24
25
26
# File 'lib/ext/rack/utils.rb', line 22

def self.unescape(s)
  s.tr('+', ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n){
    [$1.delete('%')].pack('H*')
  }
end