Class WWW::Mechanize::Chain::URIResolver
In: lib/www/mechanize/chain/uri_resolver.rb
Parent: Object
Mechanize\n[lib/www/mechanize.rb\nlib/www/mechanize/chain.rb\nlib/www/mechanize/chain/auth_headers.rb\nlib/www/mechanize/chain/body_decoding_handler.rb\nlib/www/mechanize/chain/connection_resolver.rb\nlib/www/mechanize/chain/custom_headers.rb\nlib/www/mechanize/chain/header_resolver.rb\nlib/www/mechanize/chain/parameter_resolver.rb\nlib/www/mechanize/chain/pre_connect_hook.rb\nlib/www/mechanize/chain/request_resolver.rb\nlib/www/mechanize/chain/response_body_parser.rb\nlib/www/mechanize/chain/response_header_handler.rb\nlib/www/mechanize/chain/response_reader.rb\nlib/www/mechanize/chain/ssl_resolver.rb\nlib/www/mechanize/chain/uri_resolver.rb\nlib/www/mechanize/content_type_error.rb\nlib/www/mechanize/cookie.rb\nlib/www/mechanize/cookie_jar.rb\nlib/www/mechanize/file.rb\nlib/www/mechanize/file_response.rb\nlib/www/mechanize/file_saver.rb\nlib/www/mechanize/form.rb\nlib/www/mechanize/form/button.rb\nlib/www/mechanize/form/check_box.rb\nlib/www/mechanize/form/field.rb\nlib/www/mechanize/form/file_upload.rb\nlib/www/mechanize/form/image_button.rb\nlib/www/mechanize/form/multi_select_list.rb\nlib/www/mechanize/form/option.rb\nlib/www/mechanize/form/radio_button.rb\nlib/www/mechanize/form/select_list.rb\nlib/www/mechanize/headers.rb\nlib/www/mechanize/history.rb\nlib/www/mechanize/monkey_patch.rb\nlib/www/mechanize/page.rb\nlib/www/mechanize/page/base.rb\nlib/www/mechanize/page/frame.rb\nlib/www/mechanize/page/link.rb\nlib/www/mechanize/page/meta.rb\nlib/www/mechanize/pluggable_parsers.rb\nlib/www/mechanize/redirect_limit_reached_error.rb\nlib/www/mechanize/redirect_not_get_or_head_error.rb\nlib/www/mechanize/response_code_error.rb\nlib/www/mechanize/unsupported_scheme_error.rb\nlib/www/mechanize/util.rb] lib/www/mechanize.rb Handler WWW dot/m_52_0.png

Methods

handle   new  

Included Modules

WWW::Handler

Public Class methods

[Source]

   # File lib/www/mechanize/chain/uri_resolver.rb, line 7
7:         def initialize(scheme_handlers)
8:           @scheme_handlers = scheme_handlers
9:         end

Public Instance methods

[Source]

    # File lib/www/mechanize/chain/uri_resolver.rb, line 11
11:         def handle(ctx, params)
12:           raise ArgumentError.new('uri must be specified') unless params[:uri]
13:           params[:uri] = params[:uri].dup if params[:uri].is_a?(URI)
14:           uri     = params[:uri]
15:           referer = params[:referer]
16:           unless uri.is_a?(URI)
17:             uri = uri.to_s.strip.gsub(/[^#{0.chr}-#{126.chr}]/) { |match|
18:               if RUBY_VERSION >= "1.9.0"
19:                 CGI.escape(match)
20:               else
21:                 sprintf('%%%X', match.unpack($KCODE == 'UTF8' ? 'U' : 'c')[0])
22:               end
23:             }
24: 
25:             escaped_uri = Util.html_unescape(
26:               uri.split(/(?:%[0-9A-Fa-f]{2})+|#/).zip(
27:                 uri.scan(/(?:%[0-9A-Fa-f]{2})+|#/)
28:               ).map { |x,y|
29:                 "#{URI.escape(x)}#{y}"
30:               }.join('')
31:             )
32: 
33:             begin
34:               uri = URI.parse(escaped_uri)
35:             rescue
36:               uri = URI.parse(URI.escape(escaped_uri))
37:             end
38: 
39:           end
40:           uri = @scheme_handlers[
41:             uri.relative? ? 'relative' : uri.scheme.downcase
42:           ].call(uri, params[:referer])
43: 
44:           if params[:referer] && params[:referer].uri
45:             if uri.path.length == 0 && uri.relative?
46:               uri.path = params[:referer].uri.path
47:             end
48:           end
49: 
50:           uri.path = '/' if uri.path.length == 0
51: 
52:           if uri.relative?
53:             raise 'need absolute URL' unless referer && referer.uri
54:             base = nil
55:             if referer.respond_to?(:bases) && referer.parser
56:               base = referer.bases.last
57:             end
58: 
59:             uri = ((base && base.uri && base.uri.absolute?) ?
60:                     base.uri :
61:                     referer.uri) + uri
62:             uri = referer.uri + uri
63:             # Strip initial "/.." bits from the path
64:             uri.path.sub!(/^(\/\.\.)+(?=\/)/, '')
65:           end
66: 
67:           unless ['http', 'https', 'file'].include?(uri.scheme.downcase)
68:             raise "unsupported scheme: #{uri.scheme}"
69:           end
70:           params[:uri] = uri
71: 
72:           super
73:         end

[Validate]