forked from chef-boneyard/parkplace
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* lib/parkplace/s3.rb: and here are all the s3 controllers, moved ou…
…t of controllers.rb.
- Loading branch information
_why
committed
Aug 18, 2006
1 parent
6b56ace
commit 37f871a
Showing
1 changed file
with
153 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,153 @@ | ||
module ParkPlace::Controllers | ||
class RService < S3 '/' | ||
def get | ||
only_authorized | ||
buckets = Bucket.find :all, :conditions => ['parent_id IS NULL AND owner_id = ?', @user.id], :order => "name" | ||
|
||
xml do |x| | ||
x.ListAllMyBucketsResult :xmlns => "http://s3.amazonaws.com/doc/2006-03-01/" do | ||
x.Owner do | ||
x.ID @user.key | ||
x.DisplayName @user.login | ||
end | ||
x.Buckets do | ||
buckets.each do |b| | ||
x.Bucket do | ||
x.Name b.name | ||
x.CreationDate b.created_at.getgm.iso8601 | ||
end | ||
end | ||
end | ||
end | ||
end | ||
end | ||
end | ||
|
||
class RBucket < S3 '/([^\/]+)/?' | ||
def put(bucket_name) | ||
only_authorized | ||
bucket = Bucket.find_root(bucket_name) | ||
only_owner_of bucket | ||
bucket.grant(requested_acl) | ||
raise BucketAlreadyExists | ||
rescue NoSuchBucket | ||
Bucket.create(:name => bucket_name, :owner_id => @user.id).grant(requested_acl) | ||
r(200, '', 'Location' => @env.PATH_INFO, 'Content-Length' => 0) | ||
end | ||
def delete(bucket_name) | ||
bucket = Bucket.find_root(bucket_name) | ||
only_owner_of bucket | ||
|
||
if Slot.count(:conditions => ['parent_id = ?', bucket.id]) > 0 | ||
raise BucketNotEmpty | ||
end | ||
bucket.destroy | ||
r(204, '') | ||
end | ||
def get(bucket_name) | ||
bucket = Bucket.find_root(bucket_name) | ||
only_can_read bucket | ||
|
||
if @input.has_key? 'torrent' | ||
return torrent(bucket) | ||
end | ||
opts = {:conditions => ['parent_id = ?', bucket.id], :order => "name"} | ||
limit = nil | ||
if @input.prefix | ||
opts[:conditions].first << ' AND name LIKE ?' | ||
opts[:conditions] << "#{@input.prefix}%" | ||
end | ||
if @input.marker | ||
opts[:offset] = @input.marker.to_i | ||
end | ||
if @input['max-keys'] | ||
opts[:limit] = @input['max-keys'].to_i | ||
end | ||
slot_count = Slot.count :conditions => opts[:conditions] | ||
contents = Slot.find :all, opts | ||
|
||
xml do |x| | ||
x.ListBucketResult :xmlns => "http://s3.amazonaws.com/doc/2006-03-01/" do | ||
x.Name bucket.name | ||
x.Prefix @input.prefix if @input.prefix | ||
x.Marker @input.marker if @input.marker | ||
x.MaxKeys @input['max-keys'] if @input['max-keys'] | ||
x.IsTruncated slot_count > contents.length + opts[:offset].to_i | ||
contents.each do |c| | ||
x.Contents do | ||
x.Key c.name | ||
x.LastModified c.updated_at.getgm.iso8601 | ||
x.ETag c.etag | ||
x.Size c.obj.size | ||
x.StorageClass "STANDARD" | ||
x.Owner do | ||
x.ID c.owner.key | ||
x.DisplayName c.owner.login | ||
end | ||
end | ||
end | ||
end | ||
end | ||
end | ||
end | ||
|
||
class RSlot < S3 '/(.+?)/(.+)' | ||
include ParkPlace::S3, ParkPlace::SlotGet | ||
def put(bucket_name, oid) | ||
bucket = Bucket.find_root bucket_name | ||
only_can_write bucket | ||
raise MissingContentLength unless @env.HTTP_CONTENT_LENGTH | ||
|
||
temp_path = @in.path rescue nil | ||
readlen = 0 | ||
md5 = MD5.new | ||
Tempfile.open(File.basename(oid)) do |tmpf| | ||
temp_path ||= tmpf.path | ||
tmpf.binmode | ||
while part = @in.read(BUFSIZE) | ||
readlen += part.size | ||
md5 << part | ||
tmpf << part unless @in.is_a?(Tempfile) | ||
end | ||
end | ||
|
||
fileinfo = FileInfo.new | ||
fileinfo.mime_type = @env.HTTP_CONTENT_TYPE || "binary/octet-stream" | ||
fileinfo.disposition = @env.HTTP_CONTENT_DISPOSITION | ||
fileinfo.size = readlen | ||
fileinfo.md5 = md5.hexdigest | ||
|
||
raise IncompleteBody if @env.HTTP_CONTENT_LENGTH.to_i != readlen | ||
if @env.HTTP_CONTENT_MD5 | ||
raise InvalidDigest unless @env.HTTP_CONTENT_MD5 =~ /^[0-9a-fA-F]{32}$/ | ||
raise BadDigest unless fileinfo.md5 == @env.HTTP_CONTENT_MD5 | ||
end | ||
|
||
fileinfo.path = File.join(bucket_name, File.basename(temp_path)) | ||
fileinfo.path.succ! while File.exists?(File.join(STORAGE_PATH, fileinfo.path)) | ||
file_path = File.join(STORAGE_PATH, fileinfo.path) | ||
FileUtils.mkdir_p(File.dirname(file_path)) | ||
FileUtils.mv(temp_path, file_path) | ||
|
||
slot = nil | ||
meta = @meta.empty? ? nil : {}.merge(@meta) | ||
owner_id = @user ? @user.id : bucket.owner_id | ||
begin | ||
slot = bucket.find_slot(oid) | ||
slot.update_attributes(:owner_id => owner_id, :meta => meta, :obj => fileinfo) | ||
rescue NoSuchKey | ||
slot = Slot.create(:name => oid, :owner_id => owner_id, :meta => meta, :obj => fileinfo) | ||
bucket.add_child(slot) | ||
end | ||
slot.grant(requested_acl) | ||
r(200, '', 'ETag' => slot.etag, 'Content-Length' => 0) | ||
end | ||
def delete(bucket_name, oid) | ||
bucket = Bucket.find_root bucket_name | ||
only_can_write bucket | ||
@slot = bucket.find_slot(oid) | ||
@slot.destroy | ||
r(204, '') | ||
end | ||
end | ||
end |