s3_website 0.1.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 (101) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +5 -0
  3. data/.travis.yml +5 -0
  4. data/Gemfile +3 -0
  5. data/Gemfile.lock +81 -0
  6. data/LICENSE +42 -0
  7. data/README.md +332 -0
  8. data/Rakefile +18 -0
  9. data/bin/s3_website +38 -0
  10. data/changelog.md +7 -0
  11. data/example-configurations.md +60 -0
  12. data/features/as-library.feature +29 -0
  13. data/features/cassettes/cucumber_tags/create-redirect.yml +384 -0
  14. data/features/cassettes/cucumber_tags/new-and-changed-files.yml +303 -0
  15. data/features/cassettes/cucumber_tags/new-files-for-sydney.yml +211 -0
  16. data/features/cassettes/cucumber_tags/new-files.yml +355 -0
  17. data/features/cassettes/cucumber_tags/no-new-or-changed-files.yml +359 -0
  18. data/features/cassettes/cucumber_tags/one-file-to-delete.yml +390 -0
  19. data/features/cassettes/cucumber_tags/only-changed-files.yml +411 -0
  20. data/features/cassettes/cucumber_tags/s3-and-cloudfront-when-updating-a-file.yml +435 -0
  21. data/features/cassettes/cucumber_tags/s3-and-cloudfront.yml +290 -0
  22. data/features/cloudfront.feature +35 -0
  23. data/features/delete.feature +18 -0
  24. data/features/instructions-for-new-user.feature +94 -0
  25. data/features/redirects.feature +16 -0
  26. data/features/step_definitions/steps.rb +67 -0
  27. data/features/support/env.rb +26 -0
  28. data/features/support/test_site_dirs/cdn-powered.blog.fi/_site/css/styles.css +3 -0
  29. data/features/support/test_site_dirs/cdn-powered.blog.fi/_site/index.html +5 -0
  30. data/features/support/test_site_dirs/cdn-powered.blog.fi/s3_website.yml +4 -0
  31. data/features/support/test_site_dirs/cdn-powered.with-one-change.blog.fi/_site/css/styles.css +3 -0
  32. data/features/support/test_site_dirs/cdn-powered.with-one-change.blog.fi/_site/index.html +10 -0
  33. data/features/support/test_site_dirs/cdn-powered.with-one-change.blog.fi/s3_website.yml +4 -0
  34. data/features/support/test_site_dirs/create-redirects/_site/.gitkeep +0 -0
  35. data/features/support/test_site_dirs/create-redirects/s3_website.yml +6 -0
  36. data/features/support/test_site_dirs/index-and-assets.blog.fi/_site/assets/picture.gif +0 -0
  37. data/features/support/test_site_dirs/index-and-assets.blog.fi/_site/css/styles.css +3 -0
  38. data/features/support/test_site_dirs/index-and-assets.blog.fi/_site/index.html +5 -0
  39. data/features/support/test_site_dirs/index-and-assets.blog.fi/s3_website.yml +3 -0
  40. data/features/support/test_site_dirs/my.blog.com/_site/css/styles.css +3 -0
  41. data/features/support/test_site_dirs/my.blog.com/_site/index.html +5 -0
  42. data/features/support/test_site_dirs/my.blog.com/s3_website.yml +3 -0
  43. data/features/support/test_site_dirs/my.sydney.blog.au/_site/css/styles.css +3 -0
  44. data/features/support/test_site_dirs/my.sydney.blog.au/_site/index.html +5 -0
  45. data/features/support/test_site_dirs/my.sydney.blog.au/s3_website.yml +4 -0
  46. data/features/support/test_site_dirs/new-and-changed-files.com/_site/css/styles.css +4 -0
  47. data/features/support/test_site_dirs/new-and-changed-files.com/_site/index.html +8 -0
  48. data/features/support/test_site_dirs/new-and-changed-files.com/s3_website.yml +3 -0
  49. data/features/support/test_site_dirs/no-new-or-changed-files.com/_site/css/styles.css +3 -0
  50. data/features/support/test_site_dirs/no-new-or-changed-files.com/_site/index.html +5 -0
  51. data/features/support/test_site_dirs/no-new-or-changed-files.com/s3_website.yml +3 -0
  52. data/features/support/test_site_dirs/only-changed-files.com/_site/css/styles.css +3 -0
  53. data/features/support/test_site_dirs/only-changed-files.com/_site/index.html +9 -0
  54. data/features/support/test_site_dirs/only-changed-files.com/s3_website.yml +3 -0
  55. data/features/support/test_site_dirs/site.with.css-maxage.com/_site/css/styles.css +3 -0
  56. data/features/support/test_site_dirs/site.with.css-maxage.com/_site/index.html +5 -0
  57. data/features/support/test_site_dirs/site.with.css-maxage.com/s3_website.yml +5 -0
  58. data/features/support/test_site_dirs/site.with.gzipped-and-max-aged-content.com/_site/css/styles.css +3 -0
  59. data/features/support/test_site_dirs/site.with.gzipped-and-max-aged-content.com/_site/index.html +5 -0
  60. data/features/support/test_site_dirs/site.with.gzipped-and-max-aged-content.com/s3_website.yml +5 -0
  61. data/features/support/test_site_dirs/site.with.gzipped-html.com/_site/css/styles.css +3 -0
  62. data/features/support/test_site_dirs/site.with.gzipped-html.com/_site/index.html +5 -0
  63. data/features/support/test_site_dirs/site.with.gzipped-html.com/s3_website.yml +5 -0
  64. data/features/support/test_site_dirs/site.with.maxage.com/_site/css/styles.css +3 -0
  65. data/features/support/test_site_dirs/site.with.maxage.com/_site/index.html +5 -0
  66. data/features/support/test_site_dirs/site.with.maxage.com/s3_website.yml +4 -0
  67. data/features/support/test_site_dirs/unpublish-a-post.com/_site/css/styles.css +3 -0
  68. data/features/support/test_site_dirs/unpublish-a-post.com/s3_website.yml +3 -0
  69. data/features/support/vcr.rb +18 -0
  70. data/features/sync.feature +80 -0
  71. data/features/website-performance.feature +57 -0
  72. data/lib/cloudfront/invalidator.rb +22 -0
  73. data/lib/s3_website.rb +20 -0
  74. data/lib/s3_website/config_loader.rb +56 -0
  75. data/lib/s3_website/diff_helper.rb +21 -0
  76. data/lib/s3_website/endpoint.rb +30 -0
  77. data/lib/s3_website/errors.rb +28 -0
  78. data/lib/s3_website/keyboard.rb +27 -0
  79. data/lib/s3_website/parallelism.rb +18 -0
  80. data/lib/s3_website/retry.rb +19 -0
  81. data/lib/s3_website/tasks.rb +42 -0
  82. data/lib/s3_website/upload.rb +103 -0
  83. data/lib/s3_website/uploader.rb +160 -0
  84. data/s3-website.gemspec +39 -0
  85. data/spec/lib/config_loader_spec.rb +20 -0
  86. data/spec/lib/endpoint_spec.rb +27 -0
  87. data/spec/lib/keyboard_spec.rb +59 -0
  88. data/spec/lib/parallelism_spec.rb +43 -0
  89. data/spec/lib/retry_spec.rb +34 -0
  90. data/spec/lib/upload_spec.rb +205 -0
  91. data/spec/lib/uploader_spec.rb +30 -0
  92. data/spec/sample_files/hyde_site/_site/.vimrc +5 -0
  93. data/spec/sample_files/hyde_site/_site/css/styles.css +3 -0
  94. data/spec/sample_files/hyde_site/_site/index.html +1 -0
  95. data/spec/sample_files/hyde_site/s3_website.yml +3 -0
  96. data/spec/sample_files/tokyo_site/_site/.vimrc +5 -0
  97. data/spec/sample_files/tokyo_site/_site/css/styles.css +3 -0
  98. data/spec/sample_files/tokyo_site/_site/index.html +1 -0
  99. data/spec/sample_files/tokyo_site/s3_website.yml +4 -0
  100. data/spec/spec_helper.rb +1 -0
  101. metadata +416 -0
data/Rakefile ADDED
@@ -0,0 +1,18 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ desc "Build the project"
5
+ task :default => 'test'
6
+
7
+ desc "Run tests"
8
+ task :test do
9
+ ENV['disable_parallel_processing'] = 'true'
10
+ sh "bundle exec rspec"
11
+ sh "bundle exec cucumber --tags ~@skip-on-travis"
12
+ end
13
+
14
+ desc 'Run work-in-progress features'
15
+ task "cucumber:wip" do
16
+ ENV['disable_parallel_processing'] = 'true'
17
+ sh "bundle exec cucumber --tags @wip"
18
+ end
data/bin/s3_website ADDED
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.dirname(__FILE__) + '/../lib/s3_website'
4
+
5
+ class Cfg < Thor
6
+ desc 'create', 'Create a config file with placeholder values'
7
+ def create
8
+ S3Website::Tasks.config_create parent_options[:site]
9
+ end
10
+ end
11
+
12
+ class Cli < Thor
13
+ class_option(
14
+ :site,
15
+ :type => :string,
16
+ :default => '_site',
17
+ :desc => 'The directory where your website files are'
18
+ )
19
+ option(
20
+ :headless,
21
+ :type => :boolean,
22
+ :desc =>
23
+ 'When headless, s3_website will not require human interaction at any point'
24
+ )
25
+ desc 'push', 'Push local files with the S3 website'
26
+ long_desc <<-LONGDESC
27
+ `s3_website push` will upload new and changes files to S3. It will
28
+ also delete from S3 the files that you no longer have locally.
29
+ LONGDESC
30
+ def push
31
+ S3Website::Tasks.push(options[:site], options[:headless])
32
+ end
33
+
34
+ desc 'cfg SUBCOMMAND ...ARGS', 'Operate on the config file'
35
+ subcommand 'cfg', Cfg
36
+ end
37
+
38
+ Cli.start(ARGV)
data/changelog.md ADDED
@@ -0,0 +1,7 @@
1
+ # Changelog
2
+
3
+ This project uses [Semantic Versioning](http://semver.org).
4
+
5
+ ## HEAD
6
+
7
+ * TBA
@@ -0,0 +1,60 @@
1
+ # Example `s3_website` configurations
2
+
3
+ This document shows examples of complete `s3_website.yml` configurations.
4
+
5
+ ## Minimal
6
+
7
+ ````yaml
8
+ s3_id: abcd
9
+ s3_secret: 2s+x92
10
+ s3_bucket: your.domain.net
11
+ ````
12
+
13
+ ## Minimal with EC2 AIM roles
14
+
15
+ ````yaml
16
+ s3_bucket: your.domain.net
17
+ ````
18
+
19
+ If you run `s3_website` on an EC2 instance with IAM roles, it is possible to omit
20
+ the `s3_id` and `s3_secret`.
21
+
22
+ ## Optimised for speed: using CloudFront, gzip and cache headers
23
+
24
+ ````yaml
25
+ s3_id: <%= ENV['your_domain_net_aws_key'] %>
26
+ s3_secret: <%= ENV['your_domain_net_aws_secret'] %>
27
+ s3_bucket: your.domain.net
28
+ cloudfront_distribution_id: <%= ENV['your_domain_net_cloudfront_distribution_id'] %>
29
+ cloudfront_distribution_config:
30
+ default_cache_behavior:
31
+ min_TTL: <%= 60 * 60 * 24 %>
32
+ aliases:
33
+ quantity: 1
34
+ items:
35
+ CNAME: your.domain.net
36
+ max_age: 120
37
+ gzip: true
38
+ ````
39
+
40
+ Above, we store the AWS credentials and the id of the CloudFront distribution as
41
+ environment variables. It's convenient, since you can keep the `s3_website.yml`
42
+ in a public Git repo, and thus have your deployment configurations
43
+ version-controlled.
44
+
45
+ ## Using redirects
46
+
47
+ ````yaml
48
+ s3_id: hello
49
+ s3_secret: galaxy
50
+ redirects:
51
+ index.php: /
52
+ about.php: about.html
53
+ routing_rules:
54
+ - condition:
55
+ key_prefix_equals: code/repositories/git/
56
+ redirect:
57
+ host_name: git.johnny.com
58
+ replace_key_prefix_with: ""
59
+ http_redirect_code: 301
60
+ ````
@@ -0,0 +1,29 @@
1
+ Feature: Using s3_website as a library
2
+
3
+ As a developer
4
+ I want to programmatically use the s3_website API
5
+ So that I can extend my software with the capabilities of s3_website
6
+
7
+ @one-file-to-delete
8
+ Scenario: Developer wants feedback on how many files s3_website deleted
9
+ When my S3 website is in "features/support/test_site_dirs/unpublish-a-post.com"
10
+ Then s3_website will push my blog to S3
11
+ And report that it deleted 1 file from S3
12
+
13
+ @new-and-changed-files
14
+ Scenario: Developer wants feedback on how many files s3_website uploaded
15
+ When my S3 website is in "features/support/test_site_dirs/new-and-changed-files.com"
16
+ Then s3_website will push my blog to S3
17
+ And report that it uploaded 1 new and 1 changed files into S3
18
+
19
+ @s3-and-cloudfront-when-updating-a-file
20
+ Scenario: Developer wants feedback on how many Cloudfront items s3_website invalidated
21
+ When my S3 website is in "features/support/test_site_dirs/cdn-powered.with-one-change.blog.fi"
22
+ Then s3_website will push my blog to S3 and invalidate the Cloudfront distribution
23
+ And report that it invalidated 2 Cloudfront item
24
+
25
+ @create-redirect
26
+ Scenario: Developer wants feedback on how many redirects s3_website created
27
+ When my S3 website is in "features/support/test_site_dirs/create-redirects"
28
+ Then s3_website will push my blog to S3
29
+ And report that it created 2 new redirects
@@ -0,0 +1,384 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://s3.amazonaws.com/s3-website-test.net?max-keys=1000
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Content-Type:
11
+ - ''
12
+ User-Agent:
13
+ - aws-sdk-ruby/1.8.5 ruby/1.9.3 x86_64-darwin11.4.2
14
+ Date:
15
+ - Tue, 28 May 2013 16:44:09 GMT
16
+ Authorization:
17
+ - AWS foo:foo
18
+ Accept:
19
+ - ! '*/*'
20
+ response:
21
+ status:
22
+ code: 200
23
+ message: OK
24
+ headers:
25
+ X-Amz-Id-2:
26
+ - kGCga6NIm0ybqHxPbkdrzL4YTE2Ik7Az88+JBSXk1uPWgj0a0ozR9z5BdOUOZSKy
27
+ X-Amz-Request-Id:
28
+ - 87A0319E10B35221
29
+ Date:
30
+ - Tue, 28 May 2013 16:43:53 GMT
31
+ Content-Type:
32
+ - application/xml
33
+ Transfer-Encoding:
34
+ - chunked
35
+ Server:
36
+ - AmazonS3
37
+ body:
38
+ encoding: US-ASCII
39
+ string: ! '<?xml version="1.0" encoding="UTF-8"?>
40
+
41
+ <ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Name>s3-website-test.net</Name><Prefix></Prefix><Marker></Marker><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated><Contents><Key>.gitkeep</Key><LastModified>2013-05-28T16:27:36.000Z</LastModified><ETag>&quot;d41d8cd98f00b204e9800998ecf8427e&quot;</ETag><Size>0</Size><Owner><ID>3855ebae0f370c3dd0c8d8031863792112bd2a2cb18fa310d3f463ae0dea62f1</ID><DisplayName>fluid83</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents></ListBucketResult>'
42
+ http_version:
43
+ recorded_at: Tue, 28 May 2013 16:44:09 GMT
44
+ - request:
45
+ method: head
46
+ uri: https://s3.amazonaws.com/s3-website-test.net/.gitkeep
47
+ body:
48
+ encoding: US-ASCII
49
+ string: ''
50
+ headers:
51
+ Content-Type:
52
+ - ''
53
+ User-Agent:
54
+ - aws-sdk-ruby/1.8.5 ruby/1.9.3 x86_64-darwin11.4.2
55
+ Date:
56
+ - Tue, 28 May 2013 16:44:09 GMT
57
+ Authorization:
58
+ - AWS foo:foo
59
+ Accept:
60
+ - ! '*/*'
61
+ response:
62
+ status:
63
+ code: 200
64
+ message: OK
65
+ headers:
66
+ X-Amz-Id-2:
67
+ - bAn0wcE+zU2espZy2XzUQAoKBVY42UbUZ6ELx6Vm4MFsCynvMspnh9xHuPpbw4BR
68
+ X-Amz-Request-Id:
69
+ - 16821C1979EFD9FB
70
+ Date:
71
+ - Tue, 28 May 2013 16:43:54 GMT
72
+ Last-Modified:
73
+ - Tue, 28 May 2013 16:27:36 GMT
74
+ Etag:
75
+ - ! '"d41d8cd98f00b204e9800998ecf8427e"'
76
+ Accept-Ranges:
77
+ - bytes
78
+ Content-Type:
79
+ - ''
80
+ Content-Length:
81
+ - '0'
82
+ Server:
83
+ - AmazonS3
84
+ body:
85
+ encoding: US-ASCII
86
+ string: ''
87
+ http_version:
88
+ recorded_at: Tue, 28 May 2013 16:44:10 GMT
89
+ - request:
90
+ method: head
91
+ uri: https://s3.amazonaws.com/s3-website-test.net/.gitkeep
92
+ body:
93
+ encoding: US-ASCII
94
+ string: ''
95
+ headers:
96
+ Content-Type:
97
+ - ''
98
+ User-Agent:
99
+ - aws-sdk-ruby/1.8.5 ruby/1.9.3 x86_64-darwin11.4.2
100
+ Date:
101
+ - Tue, 28 May 2013 16:44:10 GMT
102
+ Authorization:
103
+ - AWS foo:foo
104
+ Accept:
105
+ - ! '*/*'
106
+ response:
107
+ status:
108
+ code: 200
109
+ message: OK
110
+ headers:
111
+ X-Amz-Id-2:
112
+ - S4qbXk9empwOUKpUl3teDUGS60qYOg0CxRm7v8ccxa1Z5Y9K60DWvq8v7YHWAPWc
113
+ X-Amz-Request-Id:
114
+ - 62DB5F01C0BEF2BA
115
+ Date:
116
+ - Tue, 28 May 2013 16:43:54 GMT
117
+ Last-Modified:
118
+ - Tue, 28 May 2013 16:27:36 GMT
119
+ Etag:
120
+ - ! '"d41d8cd98f00b204e9800998ecf8427e"'
121
+ Accept-Ranges:
122
+ - bytes
123
+ Content-Type:
124
+ - ''
125
+ Content-Length:
126
+ - '0'
127
+ Server:
128
+ - AmazonS3
129
+ body:
130
+ encoding: US-ASCII
131
+ string: ''
132
+ http_version:
133
+ recorded_at: Tue, 28 May 2013 16:44:10 GMT
134
+ - request:
135
+ method: head
136
+ uri: https://s3.amazonaws.com/s3-website-test.net/.gitkeep
137
+ body:
138
+ encoding: US-ASCII
139
+ string: ''
140
+ headers:
141
+ Content-Type:
142
+ - ''
143
+ User-Agent:
144
+ - aws-sdk-ruby/1.8.5 ruby/1.9.3 x86_64-darwin11.4.2
145
+ Date:
146
+ - Tue, 28 May 2013 16:44:10 GMT
147
+ Authorization:
148
+ - AWS foo:foo
149
+ Accept:
150
+ - ! '*/*'
151
+ response:
152
+ status:
153
+ code: 200
154
+ message: OK
155
+ headers:
156
+ X-Amz-Id-2:
157
+ - KIW+hvipZEv+PgPc03LeddPDEcI7EzDH/CuoxrksuGUIHeA3ecmbIA+jlOgpMCi7
158
+ X-Amz-Request-Id:
159
+ - CFFC7DE02A902B74
160
+ Date:
161
+ - Tue, 28 May 2013 16:43:55 GMT
162
+ Last-Modified:
163
+ - Tue, 28 May 2013 16:27:36 GMT
164
+ Etag:
165
+ - ! '"d41d8cd98f00b204e9800998ecf8427e"'
166
+ Accept-Ranges:
167
+ - bytes
168
+ Content-Type:
169
+ - ''
170
+ Content-Length:
171
+ - '0'
172
+ Server:
173
+ - AmazonS3
174
+ body:
175
+ encoding: US-ASCII
176
+ string: ''
177
+ http_version:
178
+ recorded_at: Tue, 28 May 2013 16:44:11 GMT
179
+ - request:
180
+ method: head
181
+ uri: https://s3.amazonaws.com/s3-website-test.net/welcome.php
182
+ body:
183
+ encoding: US-ASCII
184
+ string: ''
185
+ headers:
186
+ Content-Type:
187
+ - ''
188
+ User-Agent:
189
+ - aws-sdk-ruby/1.8.5 ruby/1.9.3 x86_64-darwin11.4.2
190
+ Date:
191
+ - Tue, 28 May 2013 16:44:11 GMT
192
+ Authorization:
193
+ - AWS foo:foo
194
+ Accept:
195
+ - ! '*/*'
196
+ response:
197
+ status:
198
+ code: 404
199
+ message: Not Found
200
+ headers:
201
+ X-Amz-Request-Id:
202
+ - C3D38989428864B4
203
+ X-Amz-Id-2:
204
+ - iEtbd2+jBo4YB/bWQF7S0nIPD04ctKzv8FpUL3vTPUQzwpVE70mCORaHuXASL/6V
205
+ Content-Type:
206
+ - application/xml
207
+ Transfer-Encoding:
208
+ - chunked
209
+ Date:
210
+ - Tue, 28 May 2013 16:43:54 GMT
211
+ Server:
212
+ - AmazonS3
213
+ body:
214
+ encoding: US-ASCII
215
+ string: ''
216
+ http_version:
217
+ recorded_at: Tue, 28 May 2013 16:44:12 GMT
218
+ - request:
219
+ method: put
220
+ uri: https://s3.amazonaws.com/s3-website-test.net/welcome.php
221
+ body:
222
+ encoding: ASCII-8BIT
223
+ string: !binary ""
224
+ headers:
225
+ Content-Type:
226
+ - ''
227
+ Content-Length:
228
+ - '0'
229
+ X-Amz-Website-Redirect-Location:
230
+ - /welcome
231
+ User-Agent:
232
+ - aws-sdk-ruby/1.8.5 ruby/1.9.3 x86_64-darwin11.4.2
233
+ Date:
234
+ - Tue, 28 May 2013 16:44:12 GMT
235
+ Authorization:
236
+ - AWS foo:foo
237
+ Accept:
238
+ - ! '*/*'
239
+ response:
240
+ status:
241
+ code: 200
242
+ message: OK
243
+ headers:
244
+ X-Amz-Id-2:
245
+ - shxpzCHDkXgP6Ru7MjzBbiiONhv8O72UHLa12njGg/Ml16sNy9kGzzCEUp4T450a
246
+ X-Amz-Request-Id:
247
+ - 73AD74BF97A9FE39
248
+ Date:
249
+ - Tue, 28 May 2013 16:43:56 GMT
250
+ Etag:
251
+ - ! '"d41d8cd98f00b204e9800998ecf8427e"'
252
+ Content-Length:
253
+ - '0'
254
+ Server:
255
+ - AmazonS3
256
+ body:
257
+ encoding: US-ASCII
258
+ string: ''
259
+ http_version:
260
+ recorded_at: Tue, 28 May 2013 16:44:12 GMT
261
+ - request:
262
+ method: head
263
+ uri: https://s3.amazonaws.com/s3-website-test.net/pets/dogs
264
+ body:
265
+ encoding: US-ASCII
266
+ string: ''
267
+ headers:
268
+ Content-Type:
269
+ - ''
270
+ User-Agent:
271
+ - aws-sdk-ruby/1.8.5 ruby/1.9.3 x86_64-darwin11.4.2
272
+ Date:
273
+ - Tue, 28 May 2013 16:44:12 GMT
274
+ Authorization:
275
+ - AWS foo:foo
276
+ Accept:
277
+ - ! '*/*'
278
+ response:
279
+ status:
280
+ code: 404
281
+ message: Not Found
282
+ headers:
283
+ X-Amz-Request-Id:
284
+ - 720BC22A793D95A4
285
+ X-Amz-Id-2:
286
+ - pc2CHQG08/lLFwc/Cq3upvG3Sm+wDzsmf1FsA+YuUjkfojvJB45NbkL5LCX35bpi
287
+ Content-Type:
288
+ - application/xml
289
+ Transfer-Encoding:
290
+ - chunked
291
+ Date:
292
+ - Tue, 28 May 2013 16:43:55 GMT
293
+ Server:
294
+ - AmazonS3
295
+ body:
296
+ encoding: US-ASCII
297
+ string: ''
298
+ http_version:
299
+ recorded_at: Tue, 28 May 2013 16:44:13 GMT
300
+ - request:
301
+ method: put
302
+ uri: https://s3.amazonaws.com/s3-website-test.net/pets/dogs
303
+ body:
304
+ encoding: ASCII-8BIT
305
+ string: !binary ""
306
+ headers:
307
+ Content-Type:
308
+ - ''
309
+ Content-Length:
310
+ - '0'
311
+ X-Amz-Website-Redirect-Location:
312
+ - /cats-and-dogs/wuf
313
+ User-Agent:
314
+ - aws-sdk-ruby/1.8.5 ruby/1.9.3 x86_64-darwin11.4.2
315
+ Date:
316
+ - Tue, 28 May 2013 16:44:13 GMT
317
+ Authorization:
318
+ - AWS foo:foo
319
+ Accept:
320
+ - ! '*/*'
321
+ response:
322
+ status:
323
+ code: 200
324
+ message: OK
325
+ headers:
326
+ X-Amz-Id-2:
327
+ - qnGdeAUFkp76ErkCyx64T/eUilvlp2Y/b7QSCg5u+ghYyTtlR20szfiw0+tO/p7+
328
+ X-Amz-Request-Id:
329
+ - A38BEDA58C01CC5A
330
+ Date:
331
+ - Tue, 28 May 2013 16:43:57 GMT
332
+ Etag:
333
+ - ! '"d41d8cd98f00b204e9800998ecf8427e"'
334
+ Content-Length:
335
+ - '0'
336
+ Server:
337
+ - AmazonS3
338
+ body:
339
+ encoding: US-ASCII
340
+ string: ''
341
+ http_version:
342
+ recorded_at: Tue, 28 May 2013 16:44:14 GMT
343
+ - request:
344
+ method: get
345
+ uri: https://s3.amazonaws.com/s3-website-test.net?max-keys=1000
346
+ body:
347
+ encoding: US-ASCII
348
+ string: ''
349
+ headers:
350
+ Content-Type:
351
+ - ''
352
+ User-Agent:
353
+ - aws-sdk-ruby/1.8.5 ruby/1.9.3 x86_64-darwin11.4.2
354
+ Date:
355
+ - Tue, 28 May 2013 16:44:14 GMT
356
+ Authorization:
357
+ - AWS foo:foo
358
+ Accept:
359
+ - ! '*/*'
360
+ response:
361
+ status:
362
+ code: 200
363
+ message: OK
364
+ headers:
365
+ X-Amz-Id-2:
366
+ - SEAH/XjpATFm0o1XovAZAXLIsYIktpmxg986HNG//aMuvy+sDLmbee5d+fPpO+x0
367
+ X-Amz-Request-Id:
368
+ - 2C139CA22908CC7A
369
+ Date:
370
+ - Tue, 28 May 2013 16:43:58 GMT
371
+ Content-Type:
372
+ - application/xml
373
+ Transfer-Encoding:
374
+ - chunked
375
+ Server:
376
+ - AmazonS3
377
+ body:
378
+ encoding: US-ASCII
379
+ string: ! '<?xml version="1.0" encoding="UTF-8"?>
380
+
381
+ <ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Name>s3-website-test.net</Name><Prefix></Prefix><Marker></Marker><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated><Contents><Key>.gitkeep</Key><LastModified>2013-05-28T16:27:36.000Z</LastModified><ETag>&quot;d41d8cd98f00b204e9800998ecf8427e&quot;</ETag><Size>0</Size><Owner><ID>3855ebae0f370c3dd0c8d8031863792112bd2a2cb18fa310d3f463ae0dea62f1</ID><DisplayName>fluid83</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>pets/dogs</Key><LastModified>2013-05-28T16:43:57.000Z</LastModified><ETag>&quot;d41d8cd98f00b204e9800998ecf8427e&quot;</ETag><Size>0</Size><Owner><ID>3855ebae0f370c3dd0c8d8031863792112bd2a2cb18fa310d3f463ae0dea62f1</ID><DisplayName>fluid83</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>welcome.php</Key><LastModified>2013-05-28T16:43:56.000Z</LastModified><ETag>&quot;d41d8cd98f00b204e9800998ecf8427e&quot;</ETag><Size>0</Size><Owner><ID>3855ebae0f370c3dd0c8d8031863792112bd2a2cb18fa310d3f463ae0dea62f1</ID><DisplayName>fluid83</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents></ListBucketResult>'
382
+ http_version:
383
+ recorded_at: Tue, 28 May 2013 16:44:14 GMT
384
+ recorded_with: VCR 2.3.0