Как сделать HTTP GET с измененными заголовками?
Каков наилучший способ сделать 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)
- Есть ли лучший способ определить заголовки в Ruby?
- Кто-нибудь знает, почему это было бы неудачно с Apache? Если я получаю в браузере
http://[address]:[port]/[path]
, я получаю данные, которые я ищу, без проблем.
Ответы
Ответ 1
Создал решение, которое сработало для меня (отлично работало) - этот пример получил смещение диапазона:
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
Ответ 2
Если у вас есть доступ к журналам сервера, попробуйте сравнить запрос из браузера с адресом из 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
.