class Net::HTTPResponse - RDoc Documentation

# class Net::HTTPResponse

HTTP response class.

This class wraps together the response header and the response body (the entity requested).

It mixes in the HTTPHeader module, which provides access to response header values both via hash-like methods and via individual readers.

Note that each possible HTTP response code defines its own `HTTPResponse` subclass. All classes are defined under the `Net` module. Indentation indicates inheritance. For a list of the classes see `Net::HTTP`.

Correspondence `HTTP code => class` is stored in `CODE_TO_OBJ` constant:

    Net::HTTPResponse::CODE_TO_OBJ['404'] #=> Net::HTTPNotFound

### Constants

CODE_CLASS_TO_OBJ
CODE_TO_OBJ

### Attributes

body_encoding[R]

The encoding to use for the response body. If `Encoding`, use that encoding. If other true value, attempt to detect the appropriate encoding, and use that.

code[R]

The HTTP result code string. For example, ‘302’. You can also determine the response type by examining which response subclass the response object is an instance of.

decode_content[RW]

`Set` to true automatically when the request did not contain an Accept-Encoding header from the user.

http_version[R]

The HTTP version supported by the server.

ignore_eof[RW]

Whether to ignore EOF when reading bodies with a specified Content-Length header.

message[R]

The HTTP result message sent by the server. For example, ‘Not Found’.

msg[R]

The HTTP result message sent by the server. For example, ‘Not Found’.

uri[R]

The `URI` used to fetch this response. The response `URI` is only available if a `URI` was used to create the request.

### Public Class Methods

body_permitted?() click to toggle source

true if the response has a body.

    # File lib/net/http/response.rb, line 22
    def body_permitted?
      self::HAS_BODY
    end

### Private Class Methods

each_response_header(sock) { |key, value| ... } click to toggle source

    # File lib/net/http/response.rb, line 54
    def each_response_header(sock)
      key = value = nil
      while true
        line = sock.readuntil("\n", true).sub(/\s+\z/, '')
        break if line.empty?
        if line[0] == ?\s or line[0] == ?\t and value
          value << ' ' unless value.empty?
          value << line.strip
        else
          yield key, value if key
          key, value = line.strip.split(/\s*:\s*/, 2)
          raise Net::HTTPBadResponse, 'wrong header line format' if value.nil?
        end
      end
      yield key, value if key
    end

read_status_line(sock) click to toggle source

    # File lib/net/http/response.rb, line 41
    def read_status_line(sock)
      str = sock.readline
      m = /\AHTTP(?:\/(\d+\.\d+))?\s+(\d\d\d)(?:\s+(.*))?\z/in.match(str) or
        raise Net::HTTPBadResponse, "wrong status line: #{str.dump}"
      m.captures
    end

response_class(code) click to toggle source

    # File lib/net/http/response.rb, line 48
    def response_class(code)
      CODE_TO_OBJ[code] or
      CODE_CLASS_TO_OBJ[code[0,1]] or
      Net::HTTPUnknownResponse
    end

### Public Instance Methods

body() click to toggle source

Returns the full entity body.

Calling this method a second or subsequent time will return the string already read.

    http.request_get('/index.html') {|res|
      puts res.body
    }

    http.request_get('/index.html') {|res|
      p res.body.object_id   # 538149362
      p res.body.object_id   # 538149362
    }

    # File lib/net/http/response.rb, line 263
    def body
      read_body()
    end

Also aliased as: entity
body=(value) click to toggle source

Because it may be necessary to modify the body, Eg, decompression this method facilitates that.

    # File lib/net/http/response.rb, line 269
    def body=(value)
      @body = value
    end

body_encoding=(value) click to toggle source

`Set` the encoding to use for the response body. If given a `String`, find the related `Encoding`.

    # File lib/net/http/response.rb, line 118
    def body_encoding=(value)
      value = Encoding.find(value) if value.is_a?(String)
      @body_encoding = value
    end

entity()
Alias for: body
inspect() click to toggle source

    # File lib/net/http/response.rb, line 127
    def inspect
      "#<#{self.class} #{@code} #{@message} readbody=#{@read}>"
    end

read_body(dest = nil, &block) click to toggle source

Gets the entity body returned by the remote HTTP server.

If a block is given, the body is passed to the block, and the body is provided in fragments, as it is read in from the socket.

If `dest` argument is given, response is read into that variable, with `dest#<<` method (it could be `String` or `IO`, or any other object responding to `<<`).

Calling this method a second or subsequent time for the same `HTTPResponse` object will return the value already read.

    http.request_get('/index.html') {|res|
      puts res.read_body
    }

    http.request_get('/index.html') {|res|
      p res.read_body.object_id   # 538149362
      p res.read_body.object_id   # 538149362
    }

    # using iterator
    http.request_get('/index.html') {|res|
      res.read_body do |segment|
        print segment
      end
    }

    # File lib/net/http/response.rb, line 220
    def read_body(dest = nil, &block)
      if @read
        raise IOError, "#{self.class}\#read_body called twice" if dest or block
        return @body
      end
      to = procdest(dest, block)
      stream_check
      if @body_exist
        read_body_0 to
        @body = to
      else
        @body = nil
      end
      @read = true

      case enc = @body_encoding
      when Encoding, false, nil
        # Encoding: force given encoding
        # false/nil: do not force encoding
      else
        # other value: detect encoding from body
        enc = detect_encoding(@body)
      end

      @body.force_encoding(enc) if enc

      @body
    end

value() click to toggle source

Raises an HTTP error if the response is not 2xx (success).

    # File lib/net/http/response.rb, line 150
    def value
      error! unless self.kind_of?(Net::HTTPSuccess)
    end