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/list.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:           uri     = params[:uri]
14:           referer = params[:referer]
15:           unless uri.is_a?(URI)
16:             uri = uri.to_s.strip.gsub(/[^#{0.chr}-#{126.chr}]/) { |match|
17:               sprintf('%%%X', match.unpack($KCODE == 'UTF8' ? 'U' : 'c')[0])
18:             }
19: 
20:             escaped_uri = Util.html_unescape(
21:               uri.split(/(?:%[0-9A-Fa-f]{2})+|#/).zip(
22:                 uri.scan(/(?:%[0-9A-Fa-f]{2})+|#/)
23:               ).map { |x,y|
24:                 "#{URI.escape(x)}#{y}"
25:               }.join('')
26:             )
27: 
28:             begin
29:               uri = URI.parse(escaped_uri)
30:             rescue
31:               uri = URI.parse(URI.escape(escaped_uri))
32:             end
33: 
34:           end
35:           uri = @scheme_handlers[
36:             uri.relative? ? 'relative' : uri.scheme.downcase
37:           ].call(uri, params[:referer])
38: 
39:           if params[:referer] && params[:referer].uri
40:             if uri.path.length == 0 && uri.relative?
41:               uri.path = params[:referer].uri.path
42:             end
43:           end
44: 
45:           uri.path = '/' if uri.path.length == 0
46: 
47:           if uri.relative?
48:             raise 'need absolute URL' unless referer && referer.uri
49:             base = referer.respond_to?(:bases) ? referer.bases.last : nil
50:             uri = ((base && base.uri && base.uri.absolute?) ?
51:                     base.uri :
52:                     referer.uri) + uri
53:             uri = referer.uri + uri
54:             # Strip initial "/.." bits from the path
55:             uri.path.sub!(/^(\/\.\.)+(?=\/)/, '')
56:           end
57: 
58:           unless ['http', 'https', 'file'].include?(uri.scheme.downcase)
59:             raise "unsupported scheme: #{uri.scheme}"
60:           end
61:           params[:uri] = uri
62: 
63:           super
64:         end

[Validate]