2014-12-10 1 views
26

У меня есть этот простой HTML-анализатор (для целей обучения), что я работаю над .:Рубин открытого редирект запрещено URI

require 'open-uri' 
puts "Enter URL to parse HTML: " 
url = gets.chomp 
puts "Enter tag to parse from: " 
tag = gets.chomp 
response = open(url).read 
title1 = response.index(tag) 
title2 = response.index(tag.insert(1,'/')) -1 
result = response[(title1 + tag.length - 1)..title2] 
print result 

и когда я входная http://twitter.com, я получаю сообщение об ошибке:

ERROR: `open_loop': redirection forbidden: http://twitter.com -> https://twitter.com/ (RuntimeError) 
from /usr/local/rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/open-uri.rb:149:in `open_uri' 
from /usr/local/rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/open-uri.rb:704:in `open' 
from /usr/local/rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/open-uri.rb:34:in `open' 
from /home/ubuntu/workspace/htmlparse.rb:6:in `<main>' 

Посоветуйте или помогите? Я новичок в Ruby, и мне известно о других модулях синтаксического анализа html, но я делаю это, чтобы изучить основы Ruby. Благодарю.

+0

Я считаю, что это потому, что происходит twitter использует 'https'. FWIW - вы можете захотеть попасть на сайт, например, 'http: // www.example.org' вместо твиттера, если вы просто хотите учиться и ткнуть. – orde

+1

Я знаю 'http: //' работа на сайте, но я думал, что open-uri автоматически перенаправляется на https, 'https: // twitter.com' работает, но http doesnt, есть ли какие-либо решения? – Vikaton

ответ

25

Посмотрите на драгоценный камень open_uri_redirections.

Он исправляет OpenURI Ruby, чтобы разрешить перенаправление с HTTP на HTTPS или наоборот.

12

Вы также можете поймать исключение, а затем повторить попытку с помощью «https» url.

url = "http://classic.ona.io/api/v1/files/3538545?filename=gringgo/attachments/1485229166168.jpg" 

uri = URI.parse(url) 
tries = 3 

begin 
    uri.open(redirect: false) 
rescue OpenURI::HTTPRedirect => redirect 
    uri = redirect.uri # assigned from the "Location" response header 
    retry if (tries -= 1) > 0 
    raise 
end 

Источник: https://twin.github.io/improving-open-uri/

+2

Это сработало, камень open_uri_redirections этого не сделал. –

+2

Гораздо более элегантный, чем добавление другой зависимости для обработки этого. – ACIDSTEALTH

+0

Блестящий! Фрагмент стерлингов, именно то, что мне нужно. –

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

  • Нет связанных вопросов^_^