Spec-Zone.ru › Ruby 3

класс Net::HTTPResponse

Родитель:
Объект
Включенные модули:
Net::HTTPHeader

Класс ответа HTTP.

Этот класс объединяет заголовок ответа и тело ответа (запрашиваемый контент).

Он использует модуль HTTPHeader, который предоставляет доступ к значениям заголовков ответа как через методы типа хэша, так и через отдельные методы-читатели.

Обратите внимание, что каждый возможный код ответа HTTP определяет свой собственный HTTPResponse подкласс. Все классы определены в модуле Net. Отступы указывают на наследование. Список классов см. в Net::HTTP.

Соответствие HTTP code => class хранится в константе CODE_TO_OBJ:

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

Константы

CODE_CLASS_TO_OBJ
CODE_TO_OBJ

Атрибуты

code[R]

Строка кода результата HTTP. Например, '302'. Вы также можете определить тип ответа, исследуя, к какому подклассу ответа относится объект ответа.

decode_content[RW]

Set устанавливается в true автоматически, если запрос не содержал заголовка Accept-Encoding от пользователя.

http_version[R]

Версия HTTP, поддерживаемая сервером.

message[R]

Сообщение результата HTTP, отправленное сервером. Например, 'Not Found'.

msg[R]

Сообщение результата HTTP, отправленное сервером. Например, 'Not Found'.

uri[R]

Используемый для получения этого ответа URI. Ответ URI доступен только в том случае, если для создания запроса был использован URI.

Публичные методы класса

body_permitted?() Показать исходный код
# File lib/net/http/response.rb, line 22
def body_permitted?
  self::HAS_BODY
end

true, если у ответа есть тело.

Приватные методы класса

each_response_header(sock) { |key, value| ... } Показать исходный код
# 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) Показать исходный код
# 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) Показать исходный код
# 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

Публичные методы экземпляра

body() Показать исходный код
# File lib/net/http/response.rb, line 234
def body
  read_body()
end

Возвращает полное тело контента.

Вызов этого метода второй или последующий раз вернёт уже прочитанную строку.

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
}
Также алиас: entity
body=(value) Показать исходный код
# File lib/net/http/response.rb, line 240
def body=(value)
  @body = value
end

Поскольку может потребоваться модифицировать тело (например, декомпрессия), этот метод это облегчает.

entity()
Алиас для: body
inspect() Показать исходный код
# File lib/net/http/response.rb, line 109
def inspect
  "#<#{self.class} #{@code} #{@message} readbody=#{@read}>"
end
read_body(dest = nil, &block) Показать исходный код
# File lib/net/http/response.rb, line 202
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

Получает тело контента, возвращаемое удалённым HTTP сервером.

Если задан блок, тело передаётся в этот блок, и тело предоставляется фрагментами по мере чтения из сокета.

Если задан аргумент dest, ответ читается в эту переменную с помощью метода dest#<< (это может быть String или IO, или любой другой объект, отвечающий на <<).

Вызов этого метода второй или последующий раз для того же объекта HTTPResponse вернёт уже прочитанное значение.

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
}
value() Показать исходный код
# File lib/net/http/response.rb, line 132
def value
  error! unless self.kind_of?(Net::HTTPSuccess)
end

Вызывает ошибку HTTP, если ответ не 2xx (успех).

Приватные методы экземпляра

procdest(dest, block) Показать исходный код
# File lib/net/http/response.rb, line 343
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_0(dest) Показать исходный код
# File lib/net/http/response.rb, line 289
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() Показать исходный код
# File lib/net/http/response.rb, line 339
def stream_check
  raise IOError, 'attempt to read body out of block' if @socket.closed?
end

Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API