Как сделать HTTP GET с измененными заголовками? - PullRequest
15 голосов
/ 25 февраля 2009

Каков наилучший способ сделать HTTP-запрос GET в Ruby с измененными заголовками?

Я хочу получить диапазон байтов из конца файла журнала и играю со следующим кодом, но сервер возвращает ответ, говорящий, что «это запрос, который сервер не может понять» сервер Apache).

require 'net/http'
require 'uri'

#with @address, @port, @path all defined elsewhere

httpcall = Net::HTTP.new(@address, @port)

headers = {
  'Range' => 'bytes=1000-'
}

resp, data = httpcall.get2(@path, headers)
  1. Есть ли лучший способ определить заголовки в Ruby?
  2. Кто-нибудь знает, почему это не помогло бы Apache? Если я получаю в браузере http://[address]:[port]/[path], я получаю данные, которые я ищу, без проблем.

Ответы [ 2 ]

25 голосов
/ 16 мая 2009

Создано решение, которое работало для меня (работало очень хорошо) - в этом примере показано смещение диапазона:

require 'uri'
require 'net/http'

size = 1000 #the last offset (for the range header)
uri = URI("http://localhost:80/index.html")
http = Net::HTTP.new(uri.host, uri.port)
headers = {
    'Range' => "bytes=#{size}-"
}
path = uri.path.empty? ? "/" : uri.path

#test to ensure that the request will be valid - first get the head
code = http.head(path, headers).code.to_i
if (code >= 200 && code < 300) then

    #the data is available...
    http.get(uri.path, headers) do |chunk|
        #provided the data is good, print it...
        print chunk unless chunk =~ />416.+Range/
    end
end
6 голосов
/ 25 февраля 2009

Если у вас есть доступ к журналам сервера, попробуйте сравнить запрос из браузера с запросом из Ruby и посмотреть, говорит ли он вам что-нибудь. Если это не практично, запустите Webrick как макет файлового сервера. Не беспокойтесь о результатах, просто сравните запросы, чтобы увидеть, что они делают по-другому.

Что касается стиля Ruby, вы можете перемещать заголовки, например, так:

httpcall = Net::HTTP.new(@address, @port)

resp, data = httpcall.get2(@path, 'Range' => 'bytes=1000-')

Также обратите внимание, что в Ruby 1.8+, который вы почти наверняка используете, Net::HTTP#get2 возвращает один HTTPResponse объект, а не resp, data пару.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...