1
0
Fork 0
mirror of https://github.com/fog/fog.git synced 2022-11-09 13:51:43 -05:00
fog--fog/lib/fog/rackspace/requests/storage/put_object.rb
Ash Wilson 862547921c file_tests now all pass under mocking.
put_object persists certain object headers like Content-Disposition.
2013-12-20 12:18:36 -05:00

80 lines
2.5 KiB
Ruby

module Fog
module Storage
class Rackspace
class Real
# Create a new object
#
# When passed a block, it will make a chunked request, calling
# the block for chunks until it returns an empty string.
# In this case the data parameter is ignored.
#
# ==== Parameters
# * container<~String> - Name for container, should be < 256 bytes and must not contain '/'
# * object<~String> - Name for object
# * data<~String|File> - data to upload
# * options<~Hash> - config headers for object. Defaults to #{}.
# * block<~Proc> - chunker
# @raise [Fog::Storage::Rackspace::NotFound] - HTTP 404
# @raise [Fog::Storage::Rackspace::BadRequest] - HTTP 400
# @raise [Fog::Storage::Rackspace::InternalServerError] - HTTP 500
# @raise [Fog::Storage::Rackspace::ServiceError]
def put_object(container, object, data, options = {}, &block)
data = Fog::Storage.parse_data(data)
headers = data[:headers].merge!(options)
params = block_given? ? { :request_block => block } : { :body => data[:body] }
params.merge!(
:expects => 201,
:idempotent => !params[:request_block],
:headers => headers,
:method => 'PUT',
:path => "#{Fog::Rackspace.escape(container)}/#{Fog::Rackspace.escape(object)}"
)
request(params)
end
end
class Mock
HeaderOptions = %w{
Content-Type Access-Control-Allow-Origin Origin Content-Disposition
Etag Content-Encoding
}.freeze
def put_object(container, object, data, options = {}, &block)
c = mock_container! container
if block_given?
data = ""
loop do
chunk = yield
break if chunk.empty?
data << chunk
end
end
o = c.add_object object, data
options.keys.each do |k|
o.meta[k] = options[k].to_s if k =~ /^X-Object-Meta/
o.meta[k] = options[k] if HeaderOptions.include? k
end
# Validate the provided Etag
etag = o.meta['Etag']
if etag && etag != o.hash
c.remove_object object
raise Fog::Storage::Rackspace::ServiceError.new
end
response = Excon::Response.new
response.status = 201
response
end
end
end
end
end