# # Based on https://github.com/emk/sinatra-url-for/ # Commit 1df339284203f8f6ed8d # # Original license: # Copyright (C) 2009 Eric Kidd # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to permit # persons to whom the Software is furnished to do so, subject to the # following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN # NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE # USE OR OTHER DEALINGS IN THE SOFTWARE. module Sinatra module UrlForHelper require 'uri' def method_missing(name, *args) if name.to_s =~ /^([\w\_]+)_url$/ if args.size > 0 t = $1 if t.match(/^(stop|reboot|start|attach|detach)_/) action = $1 api_url_for(t.pluralize.split('_').last + '/' + args.first.to_s + '/' + action, :full) elsif t.match(/^(destroy|update)_/) api_url_for(t.pluralize.split('_').last + '/' + args.first.to_s, :full) else api_url_for(t.pluralize, :full) + '/' + "#{args.first}" end else api_url_for($1, :full) end else super end end def api_url_for(url_fragment, mode=:path_only) matrix_params = '' if request.params['api'] matrix_params += ";provider=%s" % request.params['api']['provider'] if request.params['api']['provider'] matrix_params += ";driver=%s" % request.params['api']['driver'] if request.params['api']['driver'] end url_fragment = "/#{url_fragment}" unless url_fragment =~ /^\// # There is no need to prefix URI with '/' if mode == :path_only url_for "#{settings.root_url}#{matrix_params}#{url_fragment}", mode else url_for "#{matrix_params}#{url_fragment}", :full end end # Construct a link to +url_fragment+, which should be given relative to # the base of this Sinatra app. The mode should be either # :path_only, which will generate an absolute path within # the current domain (the default), or :full, which will # include the site name and port number. (The latter is typically # necessary for links in RSS feeds.) Example usage: # # url_for "/" # Returns "/myapp/" # url_for "/foo" # Returns "/myapp/foo" # url_for "/foo", :full # Returns "http://example.com/myapp/foo" #-- # See README.rdoc for a list of some of the people who helped me clean # up earlier versions of this code. def url_for url_fragment, mode=:path_only case mode when :path_only base = request.script_name.empty? ? Deltacloud.default_frontend.root_url : request.script_name when :full scheme = request.scheme port = request.port request_host = request.host if request.env['HTTP_X_FORWARDED_FOR'] scheme = request.env['HTTP_X_FORWARDED_SCHEME'] || scheme port = request.env['HTTP_X_FORWARDED_PORT'] request_host = request.env['HTTP_X_FORWARDED_HOST'] end if (port.nil? || port == "" || (scheme == 'http' && port.to_s == '80') || (scheme == 'https' && port.to_s == '443')) port = "" else port = ":#{port}" end base = "#{scheme}://#{request_host}#{port}#{request.script_name.empty? ? settings.config.root_url : request.script_name}" else raise TypeError, "Unknown url_for mode #{mode}" end uri_parser = URI.const_defined?(:Parser) ? URI::Parser.new : URI url_escape = uri_parser.escape(url_fragment) # Don't add the base fragment if url_for gets called more than once # per url or the url_fragment passed in is an absolute url if url_escape.match(/^#{base}/) or url_escape.match(/^http/) url_escape else "#{base}#{url_escape}" end end end end