class Puppet::Network::HTTP::API::V1

Constants

METHOD_MAP

How we map http methods and the indirection name in the URI to an indirection method.

Public Instance Methods

call(request, response) click to toggle source

handle an HTTP request

# File lib/puppet/network/http/api/v1.rb, line 32
def call(request, response)
  indirection_name, method, key, params = uri2indirection(request.method, request.path, request.params)
  certificate = request.client_cert

  check_authorization(method, "/#{indirection_name}/#{key}", params)

  indirection = Puppet::Indirector::Indirection.instance(indirection_name.to_sym)
  raise ArgumentError, "Could not find indirection '#{indirection_name}'" unless indirection

  if !indirection.allow_remote_requests?
    # TODO: should we tell the user we found an indirection but it doesn't
    # allow remote requests, or just pretend there's no handler at all? what
    # are the security implications for the former?
    raise Puppet::Network::HTTP::Error::HTTPNotFoundError.new("No handler for #{indirection.name}", :NO_INDIRECTION_REMOTE_REQUESTS)
  end

  trusted = Puppet::Context::TrustedInformation.remote(params[:authenticated], params[:node], certificate)
  Puppet.override(:trusted_information => trusted) do
    send("do_#{method}", indirection, key, params, request, response)
  end
rescue Puppet::Network::HTTP::Error::HTTPError => e
  return do_http_control_exception(response, e)
rescue Exception => e
  return do_exception(response, e)
end
uri2indirection(http_method, uri, params) click to toggle source
# File lib/puppet/network/http/api/v1.rb, line 58
def uri2indirection(http_method, uri, params)
  environment, indirection, key = uri.split("/", 4)[1..-1] # the first field is always nil because of the leading slash

  raise ArgumentError, "The environment must be purely alphanumeric, not '#{environment}'" unless Puppet::Node::Environment.valid_name?(environment)
  raise ArgumentError, "The indirection name must be purely alphanumeric, not '#{indirection}'" unless indirection =~ /^\w+$/

  method = indirection_method(http_method, indirection)

  configured_environment = Puppet.lookup(:environments).get(environment)
  if configured_environment.nil?
    raise Puppet::Network::HTTP::Error::HTTPNotFoundError.new("Could not find environment '#{environment}'", Puppet::Network::HTTP::Issues::ENVIRONMENT_NOT_FOUND)
  else
    configured_environment = configured_environment.override_from_commandline(Puppet.settings)
    params[:environment] = configured_environment
  end

  params.delete(:bucket_path)

  raise ArgumentError, "No request key specified in #{uri}" if key == "" or key.nil?

  key = URI.unescape(key)

  [indirection, method, key, params]
end

Public Class Methods

routes() click to toggle source
# File lib/puppet/network/http/api/v1.rb, line 27
def self.routes
  Puppet::Network::HTTP::Route.path(/.*/).any(new)
end