Перенаправленный на неверный URI с Mechanize вызывает ошибку недействительного URI - PullRequest
0 голосов
/ 07 декабря 2011

Я пытаюсь связаться с плохо спроектированным веб-сервером, но все же хочу разобраться с этим.Дело в том, что когда я отправляю свою форму входа в систему, она пытается встроить сообщения в URI, что останавливает библиотеку URI.

Сервер перенаправляет меня на

/path/ConvolutedNameForMenuPage.menu?name=bmenu.P_MainMnu&msg=WELCOME+<b>Welcome,+Jonathan+Allard,+to+our+poorly+designed+Administrative+Systems!<%2Fb>Dec+07,+201102%3A27+PM

Это верно,он пытается передать мне неразобранный HTML-код внутри URI перенаправления, который я должен запросить, чтобы получить его обратно.Боже, стандарты!

И теперь библиотека URI, явно страстно расстроенная такой плохой практикой, восклицает

URI::InvalidURIError: bad URI(is not URI?): /path/ConvolutedNameForMenuPage.menu?name=bmenu.P_MainMnu&msg=WELCOME+<b>Welcome,+Jonathan+Allard,+to+our+poorly+designed+Administrative+Systems!<%2Fb>Dec+07,+201102%3A27+PM   from /home/jon/.rbenv/versions/1.9.3-p0/lib/ruby/1.9.1/uri/generic.rb:1202:in `rescue in merge'
from /home/jon/.rbenv/versions/1.9.3-p0/lib/ruby/1.9.1/uri/generic.rb:1199:in `merge'
from /home/jon/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/mechanize-2.0.1/lib/mechanize/page/meta_refresh.rb:32:in `parse'
from /home/jon/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/mechanize-2.0.1/lib/mechanize/page/meta_refresh.rb:41:in `from_node'
from /home/jon/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/mechanize-2.0.1/lib/mechanize/page.rb:282:in `block in meta_refresh'
from /home/jon/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/nokogiri-1.5.0/lib/nokogiri/xml/node_set.rb:239:in `block in each'
from /home/jon/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/nokogiri-1.5.0/lib/nokogiri/xml/node_set.rb:238:in `upto'
from /home/jon/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/nokogiri-1.5.0/lib/nokogiri/xml/node_set.rb:238:in `each'

Я чувствую вашу боль, URI lib.

Теперь, как мне это перехватить, правильно проанализировать URI (или просто полностью его отбросить) и отправить обратно, как будто ничего не произошло?Или это ошибка где-то между URI и Mechanize?

1 Ответ

0 голосов
/ 21 декабря 2011

После некоторого копания в коде я нашел, откуда возникла проблема.

Как я объяснил в # 177 :

в /lib/mechanize/page/meta_refresh.rb:40

class Mechanize::Page::MetaRefresh

def self.parse content, base_uri
  return unless content =~ CONTENT_REGEXP

  delay, refresh_uri = $1, $3

  dest = base_uri
  dest += refresh_uri if refresh_uri     # Oops!

  return delay, dest
end

Ссылочная строка будет увеличиваться URI::InvalidURIError, если refresh_uri содержит недопустимые символы (например, <).Я не совсем знаю, где следует проводить очистку.

URI#merge моего журнала ошибок скрыт в +=оператор на линии oops , если вам интересно.

...