class Puppet::Network::HTTP::RackREST

Constants

CHUNK_SIZE
ContentType
HEADER_ACCEPT

Public Class Methods

new(args={}) click to toggle source
Calls superclass method Object.new
# File lib/puppet/network/http/rack/rest.rb, line 29
def initialize(args={})
  super()
  initialize_for_puppet(args)
end

Public Instance Methods

accept_header(request) click to toggle source

Retrieve the accept header from the http request.

# File lib/puppet/network/http/rack/rest.rb, line 50
def accept_header(request)
  request.env[HEADER_ACCEPT]
end
body(request) click to toggle source

return the request body

# File lib/puppet/network/http/rack/rest.rb, line 76
def body(request)
  request.body.read
end
cleanup(request) click to toggle source

Passenger freaks out if we finish handling the request without reading any part of the body, so make sure we have.

# File lib/puppet/network/http/rack/rest.rb, line 92
def cleanup(request)
  request.body.read(1)
  nil
end
client_cert(request) click to toggle source
# File lib/puppet/network/http/rack/rest.rb, line 80
def client_cert(request)
  # This environment variable is set by mod_ssl, note that it
  # requires the `+ExportCertData` option in the `SSLOptions` directive
  cert = request.env['SSL_CLIENT_CERT']
  # NOTE: The SSL_CLIENT_CERT environment variable will be the empty string
  # when Puppet agent nodes have not yet obtained a signed certificate.
  return nil if cert.nil? or cert.empty?
  OpenSSL::X509::Certificate.new(cert)
end
content_type_header(request) click to toggle source

Retrieve the accept header from the http request.

# File lib/puppet/network/http/rack/rest.rb, line 55
def content_type_header(request)
  request.content_type
end
extract_client_info(request) click to toggle source
# File lib/puppet/network/http/rack/rest.rb, line 97
def extract_client_info(request)
  result = {}
  result[:ip] = request.ip

  # if we find SSL info in the headers, use them to get a hostname.
  # try this with :ssl_client_header, which defaults should work for
  # Apache with StdEnvVars.
  if dn = request.env[Puppet[:ssl_client_header]] and dn_matchdata = dn.match(/^.*?CN\s*=\s*(.*)/)
    result[:node] = dn_matchdata[1].to_str
    result[:authenticated] = (request.env[Puppet[:ssl_client_verify_header]] == 'SUCCESS')
  else
    result[:node] = resolve_node(result)
    result[:authenticated] = false
  end

  result
end
http_method(request) click to toggle source

Return which HTTP verb was used in this request.

# File lib/puppet/network/http/rack/rest.rb, line 60
def http_method(request)
  request.request_method
end
params(request) click to toggle source

Return the query params for this request.

# File lib/puppet/network/http/rack/rest.rb, line 65
def params(request)
  result = decode_params(request.params)
  result.merge(extract_client_info(request))
end
path(request) click to toggle source

what path was requested? (this is, without any query parameters)

# File lib/puppet/network/http/rack/rest.rb, line 71
def path(request)
  request.path
end
set_content_type(response, format) click to toggle source
# File lib/puppet/network/http/rack/rest.rb, line 34
def set_content_type(response, format)
  response[ContentType] = format_to_mime(format)
end
set_response(response, result, status = 200) click to toggle source

produce the body of the response

# File lib/puppet/network/http/rack/rest.rb, line 39
def set_response(response, result, status = 200)
  response.status = status
  unless result.is_a?(File)
    response.write result
  else
    response["Content-Length"] = result.stat.size.to_s
    response.body = RackFile.new(result)
  end
end