Class: Excon::Response

Inherits:
Object
  • Object
show all
Defined in:
lib/excon/response.rb

Instance Attribute Summary (collapse)

Class Method Summary (collapse)

Instance Method Summary (collapse)

Constructor Details

- (Response) initialize(attrs = {})

A new instance of Response



14
15
16
17
18
# File 'lib/excon/response.rb', line 14

def initialize(attrs={})
  @body    = attrs[:body]    || ''
  @headers = attrs[:headers] || {}
  @status  = attrs[:status]
end

Instance Attribute Details

- (Object) body

Returns the value of attribute body



4
5
6
# File 'lib/excon/response.rb', line 4

def body
  @body
end

- (Object) headers

Returns the value of attribute headers



4
5
6
# File 'lib/excon/response.rb', line 4

def headers
  @headers
end

- (Object) status

Returns the value of attribute status



4
5
6
# File 'lib/excon/response.rb', line 4

def status
  @status
end

Class Method Details

+ (Object) parse(socket, params = {})



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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/excon/response.rb', line 20

def self.parse(socket, params={})
  response = new(:status => socket.readline[9, 11].to_i)
  block_given = block_given?

  until ((data = socket.readline).chop!).empty?
    key, value = data.split(/:\s*/, 2)
    response.headers[key] = ([*response.headers[key]] << value).compact.join(', ')
    if key.casecmp('Content-Length') == 0
      content_length = value.to_i
    elsif (key.casecmp('Transfer-Encoding') == 0) && (value.casecmp('chunked') == 0)
      transfer_encoding_chunked = true
    end
  end

  unless (params[:method].to_s.casecmp('HEAD') == 0) || NO_ENTITY.include?(response.status)

    # don't pass stuff into a block if there was an error
    if params[:expects] && ![*params[:expects]].include?(response.status)
      block_given = false
    end

    if block_given
      if transfer_encoding_chunked
        # 2 == "/r/n".length
        while (chunk_size = socket.readline.chop!.to_i(16)) > 0
          yield(socket.read(chunk_size + 2).chop!, nil, content_length)
        end
        socket.read(2)
      elsif remaining = content_length
        remaining = content_length
        while remaining > 0
          yield(socket.read([CHUNK_SIZE, remaining].min), [remaining - CHUNK_SIZE, 0].max, content_length)
          remaining -= CHUNK_SIZE
        end
      else
        while remaining = socket.read(CHUNK_SIZE)
          yield(remaining, remaining.length, content_length)
        end
      end
    else
      if transfer_encoding_chunked
        while (chunk_size = socket.readline.chop!.to_i(16)) > 0
          response.body << socket.read(chunk_size + 2).chop! # 2 == "/r/n".length
        end
        socket.read(2) # 2 == "/r/n".length
      elsif remaining = content_length
        while remaining > 0
          response.body << socket.read([CHUNK_SIZE, remaining].min)
          remaining -= CHUNK_SIZE
        end
      else
        response.body << socket.read
      end
    end
  end

  response
end

Instance Method Details

- (Object) attributes



6
7
8
9
10
11
12
# File 'lib/excon/response.rb', line 6

def attributes
  {
    :body     => body,
    :headers  => headers,
    :status   => status
  }
end

- (Object) get_header(name)

Retrieve a specific header value. Header names are treated case-insensitively.

@param [String] name Header name


81
82
83
84
85
86
87
88
# File 'lib/excon/response.rb', line 81

def get_header(name)
  headers.each do |key,value|
    if key.casecmp(name) == 0
      return value
    end
  end
  nil
end