Spec-Zone.ru › Ruby 2.4

класс Net::HTTPResponse

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

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

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

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

Обратите внимание, что каждый возможный код HTTP-ответа определяет свой собственный подкласс HTTPResponse. Эти подклассы перечислены ниже.

Все классы определены в модуле Net. Отступы указывают на наследование. Список классов см. в Net::HTTP.

Константы

CODE_CLASS_TO_OBJ
CODE_TO_OBJ

Атрибуты

code[R]

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

decode_content[RW]

Устанавливается в 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 19
def body_permitted?
  self::HAS_BODY
end

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

Закрытые методы класса

each_response_header(sock) { |key, value| ... } Показать исходный код
# File lib/net/http/response.rb, line 51
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 38
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 45
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 227
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 233
def body=(value)
  @body = value
end

Поскольку может потребоваться изменение тела, например, декомпрессия, этот метод это позволяет.

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

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

Вызов этого метода второй или последующий раз для одного и того же объекта 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 129
def value
  error! unless self.kind_of?(Net::HTTPSuccess)
end

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

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

procdest(dest, block) Показать исходный код
# File lib/net/http/response.rb, line 335
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 281
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 331
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