diff options
author | Luke Kanies <luke@madstop.com> | 2009-02-19 16:09:58 -0600 |
---|---|---|
committer | Luke Kanies <luke@madstop.com> | 2009-02-19 17:51:22 -0600 |
commit | 262937ff6e505bbf86d15500279ff23398f9e1c8 (patch) | |
tree | 66084a1e14ed86f19982b800f60d332c139c8a36 /lib | |
parent | b800bde30bd5a08f5e222725588062e2bca37a79 (diff) | |
download | puppet-262937ff6e505bbf86d15500279ff23398f9e1c8.tar.gz puppet-262937ff6e505bbf86d15500279ff23398f9e1c8.tar.xz puppet-262937ff6e505bbf86d15500279ff23398f9e1c8.zip |
Correctly handling URI escaping throughout the REST process
This means, at the least, that we can now serve files
via REST when they have spaces and other weird characters
in their names.
This involves a small change to many files.
Signed-off-by: Luke Kanies <luke@madstop.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/puppet/file_serving/configuration.rb | 6 | ||||
-rw-r--r-- | lib/puppet/indirector/direct_file_server.rb | 2 | ||||
-rw-r--r-- | lib/puppet/indirector/file_content/rest.rb | 1 | ||||
-rw-r--r-- | lib/puppet/indirector/file_metadata/rest.rb | 1 | ||||
-rw-r--r-- | lib/puppet/indirector/request.rb | 9 | ||||
-rw-r--r-- | lib/puppet/indirector/rest.rb | 6 | ||||
-rw-r--r-- | lib/puppet/network/http/handler.rb | 3 | ||||
-rw-r--r-- | lib/puppet/util/uri_helper.rb | 22 |
8 files changed, 14 insertions, 36 deletions
diff --git a/lib/puppet/file_serving/configuration.rb b/lib/puppet/file_serving/configuration.rb index de5995d7e..608924c8b 100644 --- a/lib/puppet/file_serving/configuration.rb +++ b/lib/puppet/file_serving/configuration.rb @@ -9,10 +9,8 @@ require 'puppet/file_serving/mount/file' require 'puppet/file_serving/mount/modules' require 'puppet/file_serving/mount/plugins' require 'puppet/util/cacher' -require 'puppet/util/uri_helper' class Puppet::FileServing::Configuration - include Puppet::Util::URIHelper require 'puppet/file_serving/configuration/parser' class << self @@ -70,9 +68,7 @@ class Puppet::FileServing::Configuration # Reparse the configuration if necessary. readconfig - uri = key2uri(request.key) - - mount_name, path = uri.path.sub(/^\//, '').split(File::Separator, 2) + mount_name, path = request.key.split(File::Separator, 2) raise(ArgumentError, "Cannot find file: Invalid path '%s'" % mount_name) unless mount_name =~ %r{^[-\w]+$} diff --git a/lib/puppet/indirector/direct_file_server.rb b/lib/puppet/indirector/direct_file_server.rb index bcda92366..f69f9e14b 100644 --- a/lib/puppet/indirector/direct_file_server.rb +++ b/lib/puppet/indirector/direct_file_server.rb @@ -3,12 +3,10 @@ # Copyright (c) 2007. All rights reserved. require 'puppet/file_serving/terminus_helper' -require 'puppet/util/uri_helper' require 'puppet/indirector/terminus' class Puppet::Indirector::DirectFileServer < Puppet::Indirector::Terminus - include Puppet::Util::URIHelper include Puppet::FileServing::TerminusHelper def find(request) diff --git a/lib/puppet/indirector/file_content/rest.rb b/lib/puppet/indirector/file_content/rest.rb index 31df7626d..7b3cade8e 100644 --- a/lib/puppet/indirector/file_content/rest.rb +++ b/lib/puppet/indirector/file_content/rest.rb @@ -3,7 +3,6 @@ # Copyright (c) 2007. All rights reserved. require 'puppet/file_serving/content' -require 'puppet/util/uri_helper' require 'puppet/indirector/file_content' require 'puppet/indirector/rest' diff --git a/lib/puppet/indirector/file_metadata/rest.rb b/lib/puppet/indirector/file_metadata/rest.rb index 0f3d9c6fd..8cbf91049 100644 --- a/lib/puppet/indirector/file_metadata/rest.rb +++ b/lib/puppet/indirector/file_metadata/rest.rb @@ -3,7 +3,6 @@ # Copyright (c) 2007. All rights reserved. require 'puppet/file_serving/metadata' -require 'puppet/util/uri_helper' require 'puppet/indirector/file_metadata' require 'puppet/indirector/rest' diff --git a/lib/puppet/indirector/request.rb b/lib/puppet/indirector/request.rb index c6f268ab2..539cd0e62 100644 --- a/lib/puppet/indirector/request.rb +++ b/lib/puppet/indirector/request.rb @@ -1,3 +1,4 @@ +require 'uri' require 'puppet/indirector' # This class encapsulates all of the information you need to make an @@ -14,6 +15,10 @@ class Puppet::Indirector::Request ! ! authenticated end + def escaped_key + URI.escape(key) + end + # LAK:NOTE This is a messy interface to the cache, and it's only # used by the Configurer class. I decided it was better to implement # it now and refactor later, when we have a better design, than @@ -96,7 +101,7 @@ class Puppet::Indirector::Request # Just short-circuit these to full paths if uri.scheme == "file" - @key = uri.path + @key = URI.unescape(uri.path) return end @@ -111,6 +116,6 @@ class Puppet::Indirector::Request end @protocol = uri.scheme - @key = uri.path.sub(/^\//, '') + @key = URI.unescape(uri.path.sub(/^\//, '')) end end diff --git a/lib/puppet/indirector/rest.rb b/lib/puppet/indirector/rest.rb index 2d0799286..ce459b905 100644 --- a/lib/puppet/indirector/rest.rb +++ b/lib/puppet/indirector/rest.rb @@ -62,12 +62,12 @@ class Puppet::Indirector::REST < Puppet::Indirector::Terminus end def find(request) - deserialize network(request).get("/#{indirection.name}/#{request.key}#{query_string(request)}", headers) + deserialize network(request).get("/#{indirection.name}/#{request.escaped_key}#{query_string(request)}", headers) end def search(request) if request.key - path = "/#{indirection.name}s/#{request.key}#{query_string(request)}" + path = "/#{indirection.name}s/#{request.escaped_key}#{query_string(request)}" else path = "/#{indirection.name}s#{query_string(request)}" end @@ -79,7 +79,7 @@ class Puppet::Indirector::REST < Puppet::Indirector::Terminus def destroy(request) raise ArgumentError, "DELETE does not accept options" unless request.options.empty? - deserialize network(request).delete("/#{indirection.name}/#{request.key}", headers) + deserialize network(request).delete("/#{indirection.name}/#{request.escaped_key}", headers) end def save(request) diff --git a/lib/puppet/network/http/handler.rb b/lib/puppet/network/http/handler.rb index 9bc94a037..cce679864 100644 --- a/lib/puppet/network/http/handler.rb +++ b/lib/puppet/network/http/handler.rb @@ -75,6 +75,7 @@ module Puppet::Network::HTTP::Handler # Execute our find. def do_find(request, response) key = request_key(request) || raise(ArgumentError, "Could not locate lookup key in request path [#{path(request)}]") + key = URI.unescape(key) args = params(request) unless result = model.find(key, args) return do_exception(response, "Could not find %s %s" % [model.name, key], 404) @@ -93,6 +94,7 @@ module Puppet::Network::HTTP::Handler def do_search(request, response) args = params(request) if key = request_key(request) + key = URI.unescape(key) result = model.search(key, args) else result = model.search(args) @@ -110,6 +112,7 @@ module Puppet::Network::HTTP::Handler # Execute our destroy. def do_destroy(request, response) key = request_key(request) || raise(ArgumentError, "Could not locate lookup key in request path [#{path(request)}]") + key = URI.unescape(key) args = params(request) result = model.destroy(key, args) diff --git a/lib/puppet/util/uri_helper.rb b/lib/puppet/util/uri_helper.rb deleted file mode 100644 index cb9320387..000000000 --- a/lib/puppet/util/uri_helper.rb +++ /dev/null @@ -1,22 +0,0 @@ -# -# Created by Luke Kanies on 2007-10-16. -# Copyright (c) 2007. All rights reserved. - -require 'uri' -require 'puppet/util' - -# Helper methods for dealing with URIs. -module Puppet::Util::URIHelper - def key2uri(key) - # Return it directly if it's fully qualified. - if key =~ /^#{::File::SEPARATOR}/ - key = "file://" + key - end - - begin - uri = URI.parse(URI.escape(key)) - rescue => detail - raise ArgumentError, "Could not understand URI %s: %s" % [key, detail.to_s] - end - end -end |