mss-sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +9 -0
  3. data/LICENSE.txt +0 -0
  4. data/README.md +192 -0
  5. data/bin/mss-rb +178 -0
  6. data/ca-bundle.crt +3554 -0
  7. data/lib/mss/core/async_handle.rb +89 -0
  8. data/lib/mss/core/cacheable.rb +76 -0
  9. data/lib/mss/core/client.rb +786 -0
  10. data/lib/mss/core/collection/simple.rb +81 -0
  11. data/lib/mss/core/collection/with_limit_and_next_token.rb +70 -0
  12. data/lib/mss/core/collection/with_next_token.rb +96 -0
  13. data/lib/mss/core/collection.rb +262 -0
  14. data/lib/mss/core/configuration.rb +527 -0
  15. data/lib/mss/core/credential_providers.rb +653 -0
  16. data/lib/mss/core/data.rb +251 -0
  17. data/lib/mss/core/deprecations.rb +83 -0
  18. data/lib/mss/core/endpoints.rb +36 -0
  19. data/lib/mss/core/http/connection_pool.rb +374 -0
  20. data/lib/mss/core/http/curb_handler.rb +150 -0
  21. data/lib/mss/core/http/handler.rb +88 -0
  22. data/lib/mss/core/http/net_http_handler.rb +144 -0
  23. data/lib/mss/core/http/patch.rb +98 -0
  24. data/lib/mss/core/http/request.rb +258 -0
  25. data/lib/mss/core/http/response.rb +80 -0
  26. data/lib/mss/core/indifferent_hash.rb +87 -0
  27. data/lib/mss/core/inflection.rb +55 -0
  28. data/lib/mss/core/ini_parser.rb +41 -0
  29. data/lib/mss/core/json_client.rb +46 -0
  30. data/lib/mss/core/json_parser.rb +75 -0
  31. data/lib/mss/core/json_request_builder.rb +34 -0
  32. data/lib/mss/core/json_response_parser.rb +78 -0
  33. data/lib/mss/core/lazy_error_classes.rb +107 -0
  34. data/lib/mss/core/log_formatter.rb +426 -0
  35. data/lib/mss/core/managed_file.rb +31 -0
  36. data/lib/mss/core/meta_utils.rb +44 -0
  37. data/lib/mss/core/model.rb +61 -0
  38. data/lib/mss/core/naming.rb +29 -0
  39. data/lib/mss/core/option_grammar.rb +737 -0
  40. data/lib/mss/core/options/json_serializer.rb +81 -0
  41. data/lib/mss/core/options/validator.rb +154 -0
  42. data/lib/mss/core/options/xml_serializer.rb +117 -0
  43. data/lib/mss/core/page_result.rb +74 -0
  44. data/lib/mss/core/policy.rb +938 -0
  45. data/lib/mss/core/query_client.rb +40 -0
  46. data/lib/mss/core/query_error_parser.rb +23 -0
  47. data/lib/mss/core/query_request_builder.rb +46 -0
  48. data/lib/mss/core/query_response_parser.rb +34 -0
  49. data/lib/mss/core/region.rb +84 -0
  50. data/lib/mss/core/region_collection.rb +79 -0
  51. data/lib/mss/core/resource.rb +412 -0
  52. data/lib/mss/core/resource_cache.rb +39 -0
  53. data/lib/mss/core/response.rb +214 -0
  54. data/lib/mss/core/response_cache.rb +49 -0
  55. data/lib/mss/core/rest_error_parser.rb +23 -0
  56. data/lib/mss/core/rest_json_client.rb +39 -0
  57. data/lib/mss/core/rest_request_builder.rb +153 -0
  58. data/lib/mss/core/rest_response_parser.rb +65 -0
  59. data/lib/mss/core/rest_xml_client.rb +46 -0
  60. data/lib/mss/core/service_interface.rb +82 -0
  61. data/lib/mss/core/signers/base.rb +45 -0
  62. data/lib/mss/core/signers/cloud_front.rb +55 -0
  63. data/lib/mss/core/signers/s3.rb +158 -0
  64. data/lib/mss/core/signers/version_2.rb +71 -0
  65. data/lib/mss/core/signers/version_3.rb +85 -0
  66. data/lib/mss/core/signers/version_3_https.rb +60 -0
  67. data/lib/mss/core/signers/version_4/chunk_signed_stream.rb +190 -0
  68. data/lib/mss/core/signers/version_4.rb +227 -0
  69. data/lib/mss/core/uri_escape.rb +43 -0
  70. data/lib/mss/core/xml/frame.rb +245 -0
  71. data/lib/mss/core/xml/frame_stack.rb +84 -0
  72. data/lib/mss/core/xml/grammar.rb +306 -0
  73. data/lib/mss/core/xml/parser.rb +69 -0
  74. data/lib/mss/core/xml/root_frame.rb +64 -0
  75. data/lib/mss/core/xml/sax_handlers/libxml.rb +46 -0
  76. data/lib/mss/core/xml/sax_handlers/nokogiri.rb +55 -0
  77. data/lib/mss/core/xml/sax_handlers/ox.rb +40 -0
  78. data/lib/mss/core/xml/sax_handlers/rexml.rb +46 -0
  79. data/lib/mss/core/xml/stub.rb +122 -0
  80. data/lib/mss/core.rb +602 -0
  81. data/lib/mss/errors.rb +161 -0
  82. data/lib/mss/rails.rb +194 -0
  83. data/lib/mss/s3/access_control_list.rb +262 -0
  84. data/lib/mss/s3/acl_object.rb +263 -0
  85. data/lib/mss/s3/acl_options.rb +200 -0
  86. data/lib/mss/s3/bucket.rb +757 -0
  87. data/lib/mss/s3/bucket_collection.rb +161 -0
  88. data/lib/mss/s3/bucket_lifecycle_configuration.rb +472 -0
  89. data/lib/mss/s3/bucket_region_cache.rb +51 -0
  90. data/lib/mss/s3/bucket_tag_collection.rb +110 -0
  91. data/lib/mss/s3/bucket_version_collection.rb +78 -0
  92. data/lib/mss/s3/cipher_io.rb +119 -0
  93. data/lib/mss/s3/client/xml.rb +265 -0
  94. data/lib/mss/s3/client.rb +2076 -0
  95. data/lib/mss/s3/config.rb +60 -0
  96. data/lib/mss/s3/cors_rule.rb +107 -0
  97. data/lib/mss/s3/cors_rule_collection.rb +193 -0
  98. data/lib/mss/s3/data_options.rb +190 -0
  99. data/lib/mss/s3/encryption_utils.rb +145 -0
  100. data/lib/mss/s3/errors.rb +93 -0
  101. data/lib/mss/s3/multipart_upload.rb +353 -0
  102. data/lib/mss/s3/multipart_upload_collection.rb +75 -0
  103. data/lib/mss/s3/object_collection.rb +355 -0
  104. data/lib/mss/s3/object_metadata.rb +102 -0
  105. data/lib/mss/s3/object_upload_collection.rb +76 -0
  106. data/lib/mss/s3/object_version.rb +153 -0
  107. data/lib/mss/s3/object_version_collection.rb +88 -0
  108. data/lib/mss/s3/paginated_collection.rb +74 -0
  109. data/lib/mss/s3/policy.rb +73 -0
  110. data/lib/mss/s3/prefix_and_delimiter_collection.rb +46 -0
  111. data/lib/mss/s3/prefixed_collection.rb +84 -0
  112. data/lib/mss/s3/presign_v4.rb +135 -0
  113. data/lib/mss/s3/presigned_post.rb +574 -0
  114. data/lib/mss/s3/region_detection.rb +75 -0
  115. data/lib/mss/s3/request.rb +61 -0
  116. data/lib/mss/s3/s3_object.rb +1795 -0
  117. data/lib/mss/s3/tree/branch_node.rb +67 -0
  118. data/lib/mss/s3/tree/child_collection.rb +103 -0
  119. data/lib/mss/s3/tree/leaf_node.rb +93 -0
  120. data/lib/mss/s3/tree/node.rb +21 -0
  121. data/lib/mss/s3/tree/parent.rb +86 -0
  122. data/lib/mss/s3/tree.rb +115 -0
  123. data/lib/mss/s3/uploaded_part.rb +81 -0
  124. data/lib/mss/s3/uploaded_part_collection.rb +83 -0
  125. data/lib/mss/s3/website_configuration.rb +101 -0
  126. data/lib/mss/s3.rb +161 -0
  127. data/lib/mss/version.rb +16 -0
  128. data/lib/mss-sdk.rb +2 -0
  129. data/lib/mss.rb +14 -0
  130. data/rails/init.rb +14 -0
  131. metadata +201 -0
@@ -0,0 +1,110 @@
1
+ # Copyright 2011-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ #
8
+ # or in the "license" file accompanying this file. This file is
9
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
10
+ # ANY KIND, either express or implied. See the License for the specific
11
+ # language governing permissions and limitations under the License.
12
+
13
+ module MSS
14
+ class S3
15
+
16
+ # Manages tags for a single S3 {Bucket}.
17
+ #
18
+ # @example Setting a tag.
19
+ #
20
+ # bucket.tags['key'] = 'value'
21
+ #
22
+ # @example Getting a tag.
23
+ #
24
+ # bucket.tags['key']
25
+ # #=> 'value'
26
+ #
27
+ # @example Getting all tags
28
+ #
29
+ # bucket.tags.to_h
30
+ # #=> { 'key' => 'value', ... }
31
+ #
32
+ # @example Removing all tags
33
+ #
34
+ # bucket.tags.clear
35
+ #
36
+ class BucketTagCollection
37
+
38
+ include Core::Model
39
+
40
+ # @param [Bucket] bucket
41
+ # @param [Hash] options
42
+ def initialize bucket, options = {}
43
+ @bucket = bucket
44
+ super
45
+ end
46
+
47
+ # @return [Bucket]
48
+ attr_reader :bucket
49
+
50
+ # @param [String] key
51
+ # @return [String,nil] Returns the tag for the given key. If there
52
+ # Returns `nil` if the key does not exist.
53
+ def [] key
54
+ self.to_h[key]
55
+ end
56
+
57
+ # @param [String] key
58
+ # @param [String] value
59
+ def []= key, value
60
+ self.set(self.to_h.merge(key => value))
61
+ end
62
+
63
+ # @param [Hash<String,String>] tags A hash of tag keys and values.
64
+ # @return [nil]
65
+ def set tags
66
+ if tags.nil? or tags.empty?
67
+ self.clear
68
+ else
69
+ client.put_bucket_tagging(:bucket_name => bucket.name, :tags => tags)
70
+ end
71
+ nil
72
+ end
73
+
74
+ # Removes all tags from the bucket.
75
+ #
76
+ # @example
77
+ #
78
+ # bucket.tags.clear
79
+ # bucket.tags.to_h #=> {}
80
+ #
81
+ # @return [nil]
82
+ def clear
83
+ client.delete_bucket_tagging(:bucket_name => bucket.name)
84
+ nil
85
+ end
86
+
87
+ # @return [Hash]
88
+ def to_h
89
+ client.get_bucket_tagging(:bucket_name => bucket.name).data[:tags]
90
+ rescue MSS::S3::Errors::NoSuchTagSet
91
+ {}
92
+ end
93
+ alias_method :to_hash, :to_h
94
+
95
+ # @param [Hash] other
96
+ # @return [Boolean] Returns `true` if the tags for this bucket match
97
+ # the passed hash.
98
+ def eql? other
99
+ self.to_h == other
100
+ end
101
+ alias_method :==, :eql?
102
+
103
+ # @api private
104
+ def inspect
105
+ self.to_h.inspect
106
+ end
107
+
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,78 @@
1
+ # Copyright 2011-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ #
8
+ # or in the "license" file accompanying this file. This file is
9
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
10
+ # ANY KIND, either express or implied. See the License for the specific
11
+ # language governing permissions and limitations under the License.
12
+
13
+ module MSS
14
+ class S3
15
+
16
+ # A collection of versioned objects for the entire bucket.
17
+ #
18
+ # @see PrefixedCollection
19
+ class BucketVersionCollection
20
+
21
+ include PrefixAndDelimiterCollection
22
+
23
+ # @param [Bucket] bucket
24
+ def initialize bucket, options = {}
25
+ @bucket = bucket
26
+ super
27
+ end
28
+
29
+ # @return [Bucket] The bucket this collection belongs to.
30
+ attr_reader :bucket
31
+
32
+ # @return [ObjectVersion] Returns the most recently created object
33
+ # version in the entire bucket.
34
+ def latest
35
+ first
36
+ #self.find{|version| true }
37
+ end
38
+
39
+ # Yields once for each version in the bucket.
40
+ #
41
+ # @yield [object_version]
42
+ #
43
+ # @yieldparam [ObjectVersion] object_version
44
+ #
45
+ # @return nil
46
+ #
47
+ def each options = {}, &block; super; end
48
+
49
+ # @api private
50
+ protected
51
+ def each_member_in_page(page, &block)
52
+ super
53
+ page.versions.each do |version|
54
+ object_version = ObjectVersion.new(bucket.objects[version.key],
55
+ version.version_id,
56
+ :delete_marker => version.delete_marker?,
57
+ :last_modified => version.last_modified)
58
+ yield(object_version)
59
+ end
60
+ end
61
+
62
+ # @api private
63
+ protected
64
+ def list_request(options)
65
+ client.list_object_versions(options)
66
+ end
67
+
68
+ # @api private
69
+ protected
70
+ def limit_param; :max_keys; end
71
+
72
+ # @api private
73
+ protected
74
+ def pagination_markers; super + [:version_id_marker]; end
75
+
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,119 @@
1
+ # Copyright 2011-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ #
8
+ # or in the "license" file accompanying this file. This file is
9
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
10
+ # ANY KIND, either express or implied. See the License for the specific
11
+ # language governing permissions and limitations under the License.
12
+
13
+ module MSS
14
+ class S3
15
+
16
+ # @api private
17
+ class CipherIO
18
+
19
+ def initialize cipher, stream, stream_size = nil
20
+
21
+ @stream = stream
22
+ @stream_size = stream_size
23
+ @orig_cipher = cipher.clone
24
+
25
+ reset_cipher
26
+
27
+ # add a #rewind method if the original stream can be rewound
28
+ if @stream.respond_to?(:rewind)
29
+ Core::MetaUtils.extend_method(self, :rewind) do
30
+ reset_cipher
31
+ @stream.rewind
32
+ end
33
+ end
34
+
35
+ # add a #size method if the stream size is known
36
+ if stream_size
37
+ Core::MetaUtils.extend_method(self, :size) do
38
+ EncryptionUtils.get_encrypted_size(@stream_size)
39
+ end
40
+ end
41
+
42
+ end
43
+
44
+ # @return [String] Returns the requested number of bytes. If no byte
45
+ # amount is given, it will return the entire body of encrypted data
46
+ def read bytes = nil, output_buffer = nil
47
+ data = if bytes
48
+ (@eof) ? nil : read_chunk(bytes)
49
+ else
50
+ (@eof) ? "" : read_all
51
+ end
52
+ output_buffer ? output_buffer.replace(data || '') : data
53
+ end
54
+
55
+ # @return [Boolean] Returns `true` when the entire stream has been read.
56
+ def eof?
57
+ @eof
58
+ end
59
+
60
+ private
61
+
62
+ attr_reader :cipher
63
+
64
+ # Sets the CipherIO in a reset state without having to know anything
65
+ # about the cipher
66
+ def reset_cipher
67
+ @cipher = @orig_cipher.clone
68
+ @eof = false
69
+ @final = nil
70
+ end
71
+
72
+ # @return [String] Returns an encrytped chunk
73
+ def read_chunk bytes
74
+ unless @final
75
+ # If given a number of bytes, read it out and work out encryption
76
+ # issues
77
+ chunk = @stream.read(bytes)
78
+
79
+ # If there is nothing, finish the encryption
80
+ if chunk and chunk.length > 0
81
+ handle_finish(bytes, cipher.update(chunk))
82
+ else
83
+ @eof = true
84
+ cipher.final
85
+ end
86
+ # Read as much as possible if not given a byte size
87
+ else
88
+ @eof = true
89
+ @final
90
+ end
91
+ end
92
+
93
+ # @return [String] Returns the entire encrypted data
94
+ def read_all
95
+ @eof = true
96
+ body = @stream.read()
97
+ data = (body and body.length > 0) ? cipher.update(body) : ""
98
+ data << cipher.final
99
+ end
100
+
101
+ # Figures out how much of the final block goes into the current chunk
102
+ # and adds it.
103
+ # @return [String] Returns the encrypted chunk with possible padding.
104
+ def handle_finish(bytes, chunk)
105
+ free_space = bytes - chunk.size
106
+
107
+ if free_space > 0
108
+ @final = cipher.final
109
+ chunk << @final[0..free_space-1]
110
+ @final = @final[free_space..@final.size-1]
111
+ @eof = true unless @final and @final.size > 0
112
+ end
113
+
114
+ chunk
115
+ end
116
+
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,265 @@
1
+ # Copyright 2011-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ #
8
+ # or in the "license" file accompanying this file. This file is
9
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
10
+ # ANY KIND, either express or implied. See the License for the specific
11
+ # language governing permissions and limitations under the License.
12
+
13
+ module MSS
14
+ class S3
15
+ class Client < Core::Client
16
+
17
+ # @api private
18
+ module XML
19
+
20
+ BaseGrammar = Core::XML::Grammar.new({}, :inflect_rename => true)
21
+
22
+ ListBuckets = BaseGrammar.customize do
23
+ element "Buckets" do
24
+ list "Bucket"
25
+ end
26
+ end
27
+
28
+ GetBucketAcl = GetObjectAcl = BaseGrammar.customize do
29
+ element "AccessControlList" do
30
+ ignore
31
+ element "Grant" do
32
+ rename :grants
33
+ list
34
+ element "Grantee" do
35
+ element "ID" do
36
+ rename :canonical_user_id
37
+ end
38
+ end
39
+ element "Permission" do
40
+ symbol_value
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ ListObjects = BaseGrammar.customize do
47
+
48
+ element("Name") { rename :bucket_name }
49
+ element("MaxKeys") { integer_value }
50
+ element("IsTruncated") { rename :truncated; boolean_value }
51
+ element("Delimiter") { force }
52
+
53
+ element("Contents") do
54
+ list
55
+ element("Owner") do
56
+ element("ID") { }
57
+ element("DisplayName") { }
58
+ end
59
+ element("Key") { }
60
+ element("Size") { }
61
+ element("StorageClass") { }
62
+ element("ETag") { rename :etag }
63
+
64
+ element("LastModified") { time_value }
65
+ end
66
+
67
+ element "CommonPrefixes" do
68
+ collect_values
69
+ end
70
+
71
+ end
72
+
73
+ GetBucketLogging = BaseGrammar.customize do
74
+ element("LoggingEnabled") do
75
+ element("TargetBucket") { }
76
+ element("TargetPrefix") { }
77
+ element("TargetGrants") do
78
+ list "Grant"
79
+ element("Grant") do
80
+ element("Grantee") do
81
+ element("EmailAddress") { }
82
+ element("ID") { }
83
+ element("URI") { }
84
+ end
85
+ element("Permission") { }
86
+ end
87
+ end
88
+ end
89
+ end
90
+
91
+ GetBucketVersioning = BaseGrammar.customize do
92
+ default_value :status, :unversioned
93
+ element("Status") do
94
+ symbol_value
95
+ end
96
+ end
97
+
98
+ ListObjectVersions = BaseGrammar.customize do
99
+
100
+ element("MaxKeys") { integer_value }
101
+ element("IsTruncated") { rename :truncated; boolean_value }
102
+ element("NextKeyMarker") { force }
103
+ element("NextVersionIdMarker") { force }
104
+
105
+ %w(DeleteMarker Version).each do |element_name|
106
+ element(element_name) do
107
+ collect_values
108
+ rename(:versions)
109
+ element("IsLatest") { rename :latest; boolean_value }
110
+ element("LastModified") { datetime_value }
111
+ element("ETag") { rename :etag }
112
+ element("Size") { integer_value }
113
+ element("StorageClass") { symbol_value }
114
+ end
115
+ end
116
+
117
+ element "DeleteMarker" do
118
+ default_value(:delete_marker, true)
119
+ default_value(:version, false)
120
+ end
121
+
122
+ element "Version" do
123
+ default_value(:delete_marker, false)
124
+ default_value(:version, true)
125
+ end
126
+
127
+ element "CommonPrefixes" do
128
+ collect_values
129
+ end
130
+
131
+ end
132
+
133
+ InitiateMultipartUpload = BaseGrammar.customize do
134
+ element("UploadId") { force }
135
+ end
136
+
137
+ ListMultipartUploads = BaseGrammar.customize do
138
+
139
+ element("IsTruncated") { rename :truncated; boolean_value }
140
+ element("MaxUploads") { integer_value }
141
+ element("NextKeyMarker") { force }
142
+ element("NextUploadIdMarker") { force }
143
+ element("Upload") do
144
+ collect_values
145
+ rename :uploads
146
+ element("StorageClass") { symbol_value }
147
+ element("Initiated") { datetime_value }
148
+ end
149
+
150
+ element "CommonPrefixes" do
151
+ collect_values
152
+ end
153
+
154
+ end
155
+
156
+ DeleteObjects = BaseGrammar.customize do
157
+ element("Deleted") do
158
+ element("DeleteMarker") { boolean_value }
159
+ list
160
+ end
161
+ element("Error") { list; rename(:errors) }
162
+ end
163
+
164
+ CompleteMultipartUpload = BaseGrammar.customize
165
+
166
+ ListParts = BaseGrammar.customize do
167
+ element("StorageClass") { symbol_value }
168
+ element("IsTruncated") { rename :truncated; boolean_value }
169
+ element("MaxParts") { integer_value }
170
+ element("PartNumberMarker") { integer_value }
171
+ element("NextPartNumberMarker") { integer_value }
172
+ element("Part") do
173
+ collect_values
174
+ rename :parts
175
+ element("PartNumber") { integer_value }
176
+ element("LastModified") { datetime_value }
177
+ element("Size") { integer_value }
178
+ end
179
+ end
180
+
181
+ GetBucketLifecycleConfiguration = BaseGrammar.customize do
182
+ element("Rule") do
183
+ list
184
+ rename(:rules)
185
+ element("Expiration") do
186
+ element("Days") { integer_value }
187
+ element("Date") { datetime_value }
188
+ end
189
+ element("Transition") do
190
+ element("StorageClass") { }
191
+ element("Days") { integer_value }
192
+ element("Date") { datetime_value }
193
+ end
194
+ element("NoncurrentVersionTransition") do
195
+ element("NoncurrentDays") { integer_value }
196
+ element("StorageClass") { string_value }
197
+ end
198
+ element("NoncurrentVersionDays") do
199
+ element("NoncurrentDays") { integer_value }
200
+ end
201
+ end
202
+ end
203
+
204
+ GetBucketCors = BaseGrammar.customize do
205
+ element "CORSRule" do
206
+ list
207
+ rename :rules
208
+ element "AllowedMethod" do
209
+ list
210
+ rename :allowed_methods
211
+ end
212
+ element "AllowedOrigin" do
213
+ list
214
+ rename :allowed_origins
215
+ end
216
+ element "AllowedHeader" do
217
+ list
218
+ rename :allowed_headers
219
+ end
220
+ element "MaxAgeSeconds" do
221
+ integer
222
+ end
223
+ element "ExposeHeader" do
224
+ list
225
+ rename :expose_headers
226
+ end
227
+ end
228
+ end
229
+
230
+ GetBucketTagging = BaseGrammar.customize do
231
+ element "TagSet" do
232
+ ignore
233
+ element "Tag" do
234
+ map_entry("Key", "Value")
235
+ rename :tags
236
+ end
237
+ end
238
+ end
239
+
240
+ GetBucketWebsite = BaseGrammar.customize do
241
+ element "IndexDocument" do
242
+ element "Suffix"
243
+ end
244
+ element "ErrorDocument" do
245
+ element "Key"
246
+ end
247
+ element "RoutingRules" do
248
+ list("RoutingRule")
249
+ end
250
+ end
251
+
252
+ CopyPart = BaseGrammar.customize do
253
+ element "ETag" do
254
+ rename :etag
255
+ end
256
+ element "LastModified" do
257
+ datetime_value
258
+ rename :last_modified
259
+ end
260
+ end
261
+
262
+ end
263
+ end
264
+ end
265
+ end