Class: HT2P::Header

Inherits:
Hash
  • Object
show all
Defined in:
lib/ht2p/header.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.load(io) ⇒ Object



2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/ht2p/header.rb', line 2

def self.load(io)
  code = nil
  header = self.new

  key = nil
  while line = io.gets
    line.chop!
    line.empty? && break

    if md = %r!HTTP[\w\./]+\s+(\d+)!.match(line)
      code = md[1].to_i
    elsif md = /(.+?):\s*(.*)/.match(line)
      key, val = md[1].downcase, md[2]
      if header.key? key
        header.add key, val
      else
        header[key] = val
      end
    elsif md = /\s+(.*)/.match(line)
      header.append key, md[1]
    end
  end

  [code, header]
end

Instance Method Details

#add(key, val) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
# File 'lib/ht2p/header.rb', line 28

def add(key, val)
  if key? key
    if self[key].is_a? Array
      self[key] << val
    else
      self[key] = [self[key], val]
    end
  else
    self[key] = [val]
  end
end

#append(key, val) ⇒ Object



40
41
42
43
44
45
46
# File 'lib/ht2p/header.rb', line 40

def append(key, val)
  if self[key].is_a? Array
    self[key].last << val
  else
    self[key] << val
  end
end

#format(method, uri) ⇒ Object



62
63
64
65
66
67
68
# File 'lib/ht2p/header.rb', line 62

def format(method, uri)
  "%s %s%s HTTP/1.1\r\n" % [
    method.to_s.upcase,
    uri.path,
    uri.query && "?#{uri.query}"
  ] << "Host: #{uri.host}\r\n" << to_s << "\r\n"
end

#to_sObject



48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/ht2p/header.rb', line 48

def to_s
  inject('') do |ret, (key, val)|
    if val.is_a? Array
      val.each do |v|
        ret << "#{key}: #{v}\r\n"
      end
    else
      ret << "#{key}: #{val}\r\n"
    end

    ret
  end
end