summaryrefslogtreecommitdiffstats
path: root/lib/puppet
diff options
context:
space:
mode:
Diffstat (limited to 'lib/puppet')
-rw-r--r--lib/puppet/indirector/rest.rb39
-rw-r--r--lib/puppet/network/http/handler.rb6
2 files changed, 36 insertions, 9 deletions
diff --git a/lib/puppet/indirector/rest.rb b/lib/puppet/indirector/rest.rb
index a2767d05b..4389dfb7e 100644
--- a/lib/puppet/indirector/rest.rb
+++ b/lib/puppet/indirector/rest.rb
@@ -32,31 +32,54 @@ class Puppet::Indirector::REST < Puppet::Indirector::Terminus
{"Accept" => model.supported_formats.join(", ")}
end
- def network
- Puppet::Network::HttpPool.http_instance(Puppet[:server], Puppet[:masterport].to_i)
+ def network(request)
+ if request.key =~ /^\w+:\/\// # it looks like a URI
+ begin
+ uri = URI.parse(URI.escape(request.key))
+ rescue => detail
+ raise ArgumentError, "Could not understand URL %s: %s" % [source, detail.to_s]
+ end
+ server = uri.host || Puppet[:server]
+ port = uri.port.to_i == 0 ? Puppet[:masterport].to_i : uri.port.to_i
+ else
+ server = Puppet[:server]
+ port = Puppet[:masterport].to_i
+ end
+
+ Puppet::Network::HttpPool.http_instance(server, port)
end
def find(request)
- deserialize network.get("/#{indirection.name}/#{request.key}", headers)
+ deserialize network(request).get("/#{indirection.name}/#{request.key}#{query_string(request)}", headers)
end
def search(request)
if request.key
- path = "/#{indirection.name}s/#{request.key}"
+ path = "/#{indirection.name}s/#{request.key}#{query_string(request)}"
else
- path = "/#{indirection.name}s"
+ path = "/#{indirection.name}s#{query_string(request)}"
end
- unless result = deserialize(network.get(path, headers), true)
+ unless result = deserialize(network(request).get(path, headers), true)
return []
end
return result
end
def destroy(request)
- deserialize network.delete("/#{indirection.name}/#{request.key}", headers)
+ raise ArgumentError, "DELETE does not accept options" unless request.options.empty?
+ deserialize network(request).delete("/#{indirection.name}/#{request.key}", headers)
end
def save(request)
- deserialize network.put("/#{indirection.name}/", request.instance.render, headers)
+ raise ArgumentError, "PUT does not accept options" unless request.options.empty?
+ deserialize network(request).put("/#{indirection.name}/", request.instance.render, headers)
+ end
+
+ private
+
+ # Create the qurey string, if options are present.
+ def query_string(request)
+ return "" unless request.options and ! request.options.empty?
+ "?" + request.options.collect { |key, value| "%s=%s" % [key, value] }.join("&")
end
end
diff --git a/lib/puppet/network/http/handler.rb b/lib/puppet/network/http/handler.rb
index 291481acd..6f5117b16 100644
--- a/lib/puppet/network/http/handler.rb
+++ b/lib/puppet/network/http/handler.rb
@@ -81,7 +81,11 @@ module Puppet::Network::HTTP::Handler
# Execute our search.
def do_search(request, response)
args = params(request)
- result = model.search(args)
+ if key = request_key(request)
+ result = model.search(key, args)
+ else
+ result = model.search(args)
+ end
if result.nil? or (result.is_a?(Array) and result.empty?)
return do_exception(response, "Could not find instances in %s with '%s'" % [model.name, args.inspect], 404)
end