Class: Puppet::Network::HTTP::Rack

Inherits:
Object
  • Object
show all
Defined in:
lib/vendor/puppet/network/http/rack.rb

Overview

An rack application, for running the Puppet HTTP Server.

Instance Method Summary collapse

Constructor Details

#initialize(args) ⇒ Rack

Returns a new instance of Rack.

Raises:

  • (ArgumentError)


12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/vendor/puppet/network/http/rack.rb', line 12

def initialize(args)
  raise ArgumentError, ":protocols must be specified." if !args[:protocols] or args[:protocols].empty?
  protocols = args[:protocols]

  # Always prepare a REST handler
  @rest_http_handler = Puppet::Network::HTTP::RackREST.new
  protocols.delete :rest

  # Prepare the XMLRPC handler, for backward compatibility (if requested)
  @xmlrpc_path = '/RPC2'
  if args[:protocols].include?(:xmlrpc)
    raise ArgumentError, "XMLRPC was requested, but no handlers were given" if !args.include?(:xmlrpc_handlers)

    @xmlrpc_http_handler = Puppet::Network::HTTP::RackXMLRPC.new(args[:xmlrpc_handlers])
    protocols.delete :xmlrpc
  end

  raise ArgumentError, "there were unknown :protocols specified." if !protocols.empty?
end

Instance Method Details

#call(env) ⇒ Object

The real rack application (which needs to respond to call). The work we need to do, roughly is:

  • Read request (from env) and prepare a response

  • Route the request to the correct handler

  • Return the response (in rack-format) to our caller.



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/vendor/puppet/network/http/rack.rb', line 37

def call(env)
  request = Rack::Request.new(env)
  response = Rack::Response.new
  Puppet.debug 'Handling request: %s %s' % [request.request_method, request.fullpath]

  # if we shall serve XMLRPC, have /RPC2 go to the xmlrpc handler
  if @xmlrpc_http_handler and @xmlrpc_path == request.path_info[0, @xmlrpc_path.size]
    handler = @xmlrpc_http_handler
  else
    # everything else is handled by the new REST handler
    handler = @rest_http_handler
  end

  begin
    handler.process(request, response)
  rescue => detail
    # Send a Status 500 Error on unhandled exceptions.
    response.status = 500
    response['Content-Type'] = 'text/plain'
    response.write 'Internal Server Error: "%s"' % detail.message
    # log what happened
    Puppet.err "Puppet Server (Rack): Internal Server Error: Unhandled Exception: \"%s\"" % detail.message
    Puppet.err "Backtrace:"
    detail.backtrace.each { |line| Puppet.err " > #{line}" }
  end
  response.finish
end