Обнаружение перенаправления с механикой рубина

Я использую machize/nokogiri gems для разбора некоторых случайных страниц. У меня проблемы с перенаправлением 301/302. Вот фрагмент кода:

agent = Mechanize.new
page = agent.get('http://example.com/page1')

Сервер тестирования на mydomain.com перенаправит страницу1 на страницу2 с кодом статуса 301/302, поэтому я ожидал, что у вас будет

page.code == "301"

Вместо этого я всегда получаю page.code == "200".

Мои требования:

  • Я хочу, чтобы выполнялись переадресации (по умолчанию механизированное поведение, что хорошо)
  • Я хочу, чтобы можно было обнаружить, что страница была перенаправлена.

Я знаю, что я вижу страницу1 в agent.history, но это ненадежно. Мне также нужен код статуса перенаправления.

Как я могу добиться такого поведения с помощью механизации?

Ответ 1

Вы можете оставить перенаправление и просто следить за заголовком местоположения:

agent.redirect_ok = false
page = agent.get 'http://www.google.com'
status_code = page.code

while page.code[/30[12]/]
  page = agent.get page.header['location']
end

Ответ 2

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

agent = Mechanize.new

# deactivate redirects first
agent.redirect_ok = false

status_code = '200'
error_occurred = false

# request url
begin
  page = agent.get(url)
  status_code = page.code
rescue Mechanize::ResponseCodeError => ex
  status_code = ex.response_code
  error_occurred = true
end

if !error_occurred && status_code != '200' then
  # enable redirects and request the page again
  agent.redirect_ok = true
  page = agent.get(url)
end