2013-07-27 2 views
3

В Ruby, как я могу получить заголовки HTTP-запросов, которые будут отправляться с помощью net/http (s) или запроса open-uri, прежде чем он на самом деле делает запрос.Получение заголовков из Ruby Net :: HTTP-запрос перед выполнением запроса

В некоторых случаях заголовки используются при создании подписанной строки в URI. Конечно, есть способ получить заголовки запросов, которые будут отправлены. Например, они должны включать заголовок «Host:».

ответ

2

В классах Net :: HTTP все, кажется, используют Net :: HTTPHeader как mixin. Вы должны иметь возможность использовать to_hash() на объекте запроса, чтобы сразу получить все заголовки, или each_header()/each() для повторения одного заголовка за раз.

+0

Хотя вышеприведенное должно работать, чтобы получить список явно заданных заголовков, я не уверен, будет ли он включать в adva nce любые дополнительные заголовки Net :: HTTP может добавить в момент, когда он отправит запрос («Хост» - идеальный пример ... вполне возможно, что этот заголовок будет автоматически генерироваться только в последнюю секунду). –

+0

Хм .. Да, это меня беспокоило. Я уже нашел each_header. Я рад предположить заголовок «Host:» из строки URI, но я обеспокоен тем, что могут быть созданы другие заголовки автоматически, которые я пропущу. – rewolf

4

см http://ruby-doc.org/stdlib-2.0/libdoc/net/http/rdoc/Net/HTTP.html#label-Setting+Headers

хорошо работает в рубин 2.0.0 - но вы правы, различное поведение в 1.9.3

Руби 2.0.0

require 'net/http' 
uri = URI('http://github.com/ruby') 

http_request = Net::HTTP::Get.new(uri) 
http_request.each_header { |header| puts header } 

# => accept-encoding 
# => accept 
# => user-agent 
# => host  

http_response = Net::HTTP.start(uri.hostname, uri.port) do |http| 
    http.request(http_request) 
end 

рубин 1.9.3

require 'uri' 
require 'net/http' 
uri = URI.parse('http://github.com/ruby') 

http_request = Net::HTTP::Get.new(uri.path) 
http_request.each_header { |header| puts header } 

# => accept 
# => user-agent 

http_response = Net::HTTP.start(uri.hostname, uri.port) do |http| 
    http.request(http_request) 
end 

http_request.each_header { |header| puts header } 

# => accept 
# => user-agent 
# => host 
+0

Кажется, что не работает в 1.9.3 – rewolf

+0

интересно работает отлично в ruby ​​2.0.0 - обновленный ответ, но, вероятно, не помогает – house9

+0

Спасибо :) но, к сожалению, как вы предполагали, мне нужен этот предварительный запрос заголовка hahaha: ( – rewolf

Смежные вопросы