lib/fog/rackspace/cdn.rb in fog-1.9.0 vs lib/fog/rackspace/cdn.rb in fog-1.10.0

- old
+ new

@@ -4,22 +4,60 @@ module Fog module CDN class Rackspace < Fog::Service requires :rackspace_api_key, :rackspace_username - recognizes :rackspace_auth_url, :persistent + recognizes :rackspace_auth_url, :persistent, :rackspace_cdn_ssl - model_path 'fog/rackspace/models/cdn' - request_path 'fog/rackspace/requests/cdn' request :get_containers request :head_container request :post_container request :put_container + request :delete_object + + + module Base + URI_HEADERS = { + "X-Cdn-Ios-Uri" => :ios_uri, + "X-Cdn-Uri" => :uri, + "X-Cdn-Streaming-Uri" => :streaming_uri, + "X-Cdn-Ssl-Uri" => :ssl_uri + }.freeze - class Mock + def publish_container(container, publish = true) + enabled = publish ? 'True' : 'False' + response = put_container(container.key, 'X-Cdn-Enabled' => enabled) + return {} unless publish + urls_from_headers(response.headers) + end + + def urls(container) + begin + response = head_container(container.key) + return {} unless response.headers['X-Cdn-Enabled'] == 'True' + urls_from_headers response.headers + rescue Fog::Service::NotFound + {} + end + end + + private + + def urls_from_headers(headers) + h = {} + URI_HEADERS.keys.each do | header | + key = URI_HEADERS[header] + h[key] = headers[header] + end + h + end + end + class Mock + include Base + def self.data @data ||= Hash.new do |hash, key| hash[key] = {} end end @@ -33,19 +71,25 @@ end def data self.class.data[@rackspace_username] end + + def purge(object) + return true if object.is_a? Fog::Storage::Rackspace::File + raise Fog::Errors::NotImplemented.new("#{object.class} does not support CDN purging") if object + end def reset_data self.class.data.delete(@rackspace_username) end - + end class Real - + include Base + def initialize(options={}) @connection_options = options[:connection_options] || {} credentials = Fog::Rackspace.authenticate(options, @connection_options) @auth_token = credentials['X-Auth-Token'] @enabled = false @@ -59,23 +103,33 @@ @scheme = uri.scheme @connection = Fog::Connection.new("#{@scheme}://#{@host}:#{@port}", @persistent, @connection_options) @enabled = true end end - + def enabled? @enabled end def reload @cdn_connection.reset end + + def purge(file) + unless file.is_a? Fog::Storage::Rackspace::File + raise Fog::Errors::NotImplemented.new("#{object.class} does not support CDN purging") + end + + delete_object file.directory.key, file.key + true + end def request(params, parse_json = true) begin response = @connection.request(params.merge!({ :headers => { 'Content-Type' => 'application/json', + 'Accept' => 'application/json', 'X-Auth-Token' => @auth_token }.merge!(params[:headers] || {}), :host => @host, :path => "#{@path}/#{params[:path]}", }))