Method: Puppet::HTTP::Redirector#redirect_to

Defined in:
lib/puppet/http/redirector.rb

#redirect_to(request, response, redirects) ⇒ Net::HTTP

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Implement the HTTP request redirection



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/puppet/http/redirector.rb', line 45

def redirect_to(request, response, redirects)
  raise Puppet::HTTP::TooManyRedirects, request.uri if redirects >= @redirect_limit

  location = parse_location(response)
  url = request.uri.merge(location)

  new_request = request.class.new(url)
  new_request.body = request.body
  request.each do |header, value|
    unless Puppet[:location_trusted]
      # skip adding potentially sensitive header to other hosts
      next if header.casecmp('Authorization').zero? && request.uri.host.casecmp(location.host) != 0
      next if header.casecmp('Cookie').zero? && request.uri.host.casecmp(location.host) != 0
    end
    # Allow Net::HTTP to set its own Accept-Encoding header to avoid errors with HTTP compression.
    # See https://github.com/puppetlabs/puppet/issues/9143
    next if header.casecmp('Accept-Encoding').zero?

    new_request[header] = value
  end

  # mimic private Net::HTTP#addr_port
  new_request['Host'] = if (location.scheme == 'https' && location.port == 443) ||
                           (location.scheme == 'http' && location.port == 80)
                          location.host
                        else
                          "#{location.host}:#{location.port}"
                        end

  new_request
end