123456789_123456789_123456789_123456789_123456789_

Class: Net::HTTPResponse

Relationships & Source Files
Extension / Inclusion / Inheritance Descendants
Subclasses:
Net::HTTPAccepted, Net::HTTPBadGateway, Net::HTTPBadRequest, Net::HTTPClientError, Net::HTTPConflict, Net::HTTPContinue, Net::HTTPCreated, Net::HTTPExpectationFailed, Net::HTTPFailedDependency, Net::HTTPForbidden, Net::HTTPFound, Net::HTTPGatewayTimeOut, Net::HTTPGone, Net::HTTPIMUsed, Net::HTTPInformation, Net::HTTPInsufficientStorage, Net::HTTPInternalServerError, Net::HTTPLengthRequired, Net::HTTPLocked, Net::HTTPMethodNotAllowed, Net::HTTPMovedPermanently, Net::HTTPMultiStatus, Net::HTTPMultipleChoices, Net::HTTPNetworkAuthenticationRequired, Net::HTTPNoContent, Net::HTTPNonAuthoritativeInformation, Net::HTTPNotAcceptable, Net::HTTPNotFound, Net::HTTPNotImplemented, Net::HTTPNotModified, Net::HTTPOK, Net::HTTPPartialContent, Net::HTTPPaymentRequired, Net::HTTPPermanentRedirect, Net::HTTPPreconditionFailed, Net::HTTPPreconditionRequired, Net::HTTPProxyAuthenticationRequired, Net::HTTPRedirection, Net::HTTPRequestEntityTooLarge, Net::HTTPRequestHeaderFieldsTooLarge, Net::HTTPRequestTimeOut, Net::HTTPRequestURITooLong, Net::HTTPRequestedRangeNotSatisfiable, Net::HTTPResetContent, Net::HTTPSeeOther, Net::HTTPServerError, Net::HTTPServiceUnavailable, Net::HTTPSuccess, Net::HTTPSwitchProtocol, Net::HTTPTemporaryRedirect, Net::HTTPTooManyRequests, Net::HTTPUnauthorized, Net::HTTPUnknownResponse, Net::HTTPUnprocessableEntity, Net::HTTPUnsupportedMediaType, Net::HTTPUpgradeRequired, Net::HTTPUseProxy, Net::HTTPVersionNotSupported
Super Chains via Extension / Inclusion / Inheritance
Instance Chain:
self, HTTPHeader
Inherits: Object
Defined in: lib/net/http/response.rb,
lib/net/http/responses.rb

Overview

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. These are listed below.

All classes are defined under the ::Net module. Indentation indicates inheritance. For a list of the classes see HTTP.

Class Attribute Summary

Class Method Summary

Instance Attribute Summary

  • #body (also: #entity) rw

    Returns the full entity body.

  • #body=(value) rw

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

  • #decode_content rw

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

  • #uri rw

    The URI used to fetch this response.

  • #code readonly

    The HTTP result code string.

  • #http_version readonly

    The HTTP version supported by the server.

  • #message (also: #msg) readonly

    The HTTP result message sent by the server.

HTTPHeader - Included

#content_length

Returns an Integer object which represents the HTTP Content-Length: header field, or nil if that field was not provided.

#content_length=,
#chunked?

Returns “true” if the “transfer-encoding” header is present and set to “chunked”.

#connection_close?, #connection_keep_alive?

Instance Method Summary

HTTPHeader - Included

#[]

Returns the header field corresponding to the case-insensitive key.

#[]=

Sets the header field corresponding to the case-insensitive key.

#add_field
Ruby 1.8.3

Adds a value to a named header field, instead of replacing its value.

#basic_auth

Set the Authorization: header for “Basic” authorization.

#canonical_each
#content_range

Returns a Range object which represents the value of the Content-Range: header field.

#content_type

Returns a content type string such as “text/html”.

#content_type=
#delete

Removes a header field, specified by case-insensitive key.

#each
#each_capitalized

As for #each_header, except the keys are provided in capitalized form.

#each_capitalized_name

Iterates through the header names in the header, passing capitalized header names to the code block.

#each_header

Iterates through the header names and values, passing in the name and value to the code block supplied.

#each_key
#each_name

Iterates through the header names in the header, passing each header name to the code block.

#each_value

Iterates through header values, passing each value to the code block.

#fetch

Returns the header field corresponding to the case-insensitive key.

#form_data=
#get_fields
Ruby 1.8.3

Returns an array of header field strings corresponding to the case-insensitive key.

#initialize_http_header,
#key?

true if key header exists.

#main_type

Returns a content type string such as “text”.

#proxy_basic_auth

Set Proxy-Authorization: header for “Basic” authorization.

#range

Returns an Array of Range objects which represent the Range: HTTP header field, or nil if there is no such header.

#range=
#range_length

The length of the range represented in Content-Range: header.

#set_content_type

Sets the content type in an HTTP header.

#set_form

Set a HTML form data set.

#set_form_data

Set header fields and a body from HTML form data.

#set_range

Sets the HTTP Range: header.

#sub_type

Returns a content type string such as “html”.

#to_hash

Returns a Hash consisting of header names and array of values.

#type_params

Any parameters specified for the content type, returned as a Hash.

#append_field_value, #basic_encode, #capitalize, #set_field, #tokens

Class Attribute Details

.body_permitted?Boolean (readonly)

true if the response has a body.

[ GitHub ]

  
# File 'lib/net/http/response.rb', line 20

def body_permitted?
  self::HAS_BODY
end

Class Method Details

.each_response_header(sock) {|key, value| ... } (private)

Yields:

[ GitHub ]

  
# File 'lib/net/http/response.rb', line 52

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) (private)

[ GitHub ]

  
# File 'lib/net/http/response.rb', line 39

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) (private)

[ GitHub ]

  
# File 'lib/net/http/response.rb', line 46

def response_class(code)
  CODE_TO_OBJ[code] or
  CODE_CLASS_TO_OBJ[code[0,1]] or
  Net::HTTPUnknownResponse
end

Instance Attribute Details

#body (rw) Also known as: #entity

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
}
[ GitHub ]

  
# File 'lib/net/http/response.rb', line 226

def body
  read_body()
end

#body=(value) (rw)

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

[ GitHub ]

  
# File 'lib/net/http/response.rb', line 232

def body=(value)
  @body = value
end

#code (readonly)

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.

[ GitHub ]

  
# File 'lib/net/http/response.rb', line 93

attr_reader :code

#decode_content (rw)

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

[ GitHub ]

  
# File 'lib/net/http/response.rb', line 105

attr_accessor :decode_content

#http_version (readonly)

The HTTP version supported by the server.

[ GitHub ]

  
# File 'lib/net/http/response.rb', line 88

attr_reader :http_version

#message (readonly) Also known as: #msg

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

[ GitHub ]

  
# File 'lib/net/http/response.rb', line 96

attr_reader :message

#uri (rw)

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

[ GitHub ]

  
# File 'lib/net/http/response.rb', line 101

attr_reader :uri

Instance Method Details

#inspect

[ GitHub ]

  
# File 'lib/net/http/response.rb', line 107

def inspect
  "#<#{self.class} #{@code} #{@message} readbody=#{@read}>"
end

#procdest(dest, block) (private)

Raises:

  • (ArgumentError)
[ GitHub ]

  
# File 'lib/net/http/response.rb', line 334

def procdest(dest, block)
  raise ArgumentError, 'both arg and block given for HTTP method' if
    dest and block
  if block
    Net::ReadAdapter.new(block)
  else
    dest || ''
  end
end

#read_body(dest = nil, &block)

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.

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
}
[ GitHub ]

  
# File 'lib/net/http/response.rb', line 194

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

  @body
end

#read_body_0(dest) (private)

[ GitHub ]

  
# File 'lib/net/http/response.rb', line 280

def read_body_0(dest)
  inflater do |inflate_body_io|
    if chunked?
      read_chunked dest, inflate_body_io
      return
    end

    @socket = inflate_body_io

    clen = content_length()
    if clen
      @socket.read clen, dest, true   # ignore EOF
      return
    end
    clen = range_length()
    if clen
      @socket.read clen, dest
      return
    end
    @socket.read_all dest
  end
end

#stream_check (private)

Raises:

  • (IOError)
[ GitHub ]

  
# File 'lib/net/http/response.rb', line 330

def stream_check
  raise IOError, 'attempt to read body out of block' if @socket.closed?
end

#value

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

[ GitHub ]

  
# File 'lib/net/http/response.rb', line 128

def value
  error! unless self.kind_of?(Net::HTTPSuccess)
end