Skip to content

Commit 55397d2

Browse files
Encode file paths before sending them to CloudFront
1 parent 4b0f439 commit 55397d2

File tree

4 files changed

+39
-17
lines changed

4 files changed

+39
-17
lines changed

changelog.md

+4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
This project uses [Semantic Versioning](http://semver.org).
44

5+
## 1.6.12
6+
7+
* Fix bug <https://github.com/laurilehmijoki/s3_website/issues/63>
8+
59
## 1.6.11
610

711
* Loosen the dependency spec of mime-types (#70)

lib/cloudfront/invalidator.rb

+8-1
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,20 @@ def self.invalidate(config, changed_files)
99
s3_object_keys << ""
1010
report = SimpleCloudfrontInvalidator::CloudfrontClient.new(
1111
aws_key, aws_secret, cloudfront_distribution_id
12-
).invalidate(s3_object_keys)
12+
).invalidate(url_encode_keys s3_object_keys)
1313
puts report[:text_report]
1414
report[:invalidated_items_count]
1515
end
1616

1717
private
1818

19+
def self.url_encode_keys(keys)
20+
require 'uri'
21+
keys.map do |key|
22+
URI::encode(key, Regexp.union([URI::Parser.new.regexp[:UNSAFE],'~','@', "'"]))
23+
end
24+
end
25+
1926
def self.apply_config(config, changed_files)
2027
if config['cloudfront_invalidate_root']
2128
changed_files.map { |changed_file|

s3_website.gemspec

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
33

44
Gem::Specification.new do |s|
55
s.name = "s3_website"
6-
s.version = "1.6.11"
6+
s.version = "1.6.12"
77
s.platform = Gem::Platform::RUBY
88
s.authors = ["Lauri Lehmijoki"]
99
s.email = ["lauri.lehmijoki@iki.fi"]

spec/lib/cloudfront/invalidator_spec.rb

+26-15
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
require 'spec_helper'
22

33
describe S3Website::Cloudfront::Invalidator do
4-
describe 'default behaviour' do
5-
let(:config) {{
6-
's3_id' => 'aws id',
7-
's3_secret' => 'aws secret',
8-
'cloudfront_distribution_id' => 'EFXX'
9-
}}
4+
let(:config) {{
5+
's3_id' => 'aws id',
6+
's3_secret' => 'aws secret',
7+
'cloudfront_distribution_id' => 'EFXX'
8+
}}
109

10+
describe 'default behaviour' do
1111
it 'invalidates the root resource' do
1212
invalidator = create_simple_cloudfront_invalidator(config)
1313
invalidator.
@@ -19,22 +19,33 @@
1919
end
2020
end
2121

22-
describe 'option cloudfront_invalidate_root = true' do
23-
let(:config) {{
24-
's3_id' => 'aws id',
25-
's3_secret' => 'aws secret',
26-
'cloudfront_distribution_id' => 'EFXX',
27-
'cloudfront_invalidate_root' => true
28-
}}
22+
context 'option cloudfront_invalidate_root = true' do
23+
let(:config_with_root_invalidation) {
24+
config.merge( {
25+
'cloudfront_invalidate_root' => true
26+
})
27+
}
2928

3029
it 'invalidates all root resources' do
31-
invalidator = create_simple_cloudfront_invalidator(config)
30+
invalidator = create_simple_cloudfront_invalidator(config_with_root_invalidation)
3231
invalidator.
3332
should_receive(:invalidate).
3433
with(['article/', '']).
3534
and_return(:text_report => 'report txt')
3635

37-
S3Website::Cloudfront::Invalidator.invalidate(config, ['article/index.html'])
36+
S3Website::Cloudfront::Invalidator.invalidate(config_with_root_invalidation, ['article/index.html'])
37+
end
38+
end
39+
40+
context 'the file name contains special characters' do
41+
it 'encodes the file paths according to rfc1738' do
42+
invalidator = create_simple_cloudfront_invalidator config
43+
invalidator.
44+
should_receive(:invalidate).
45+
with(['article/arnold%27s%20file.html', '']).
46+
and_return(:text_report => 'report txt')
47+
48+
S3Website::Cloudfront::Invalidator.invalidate(config, ["article/arnold's file.html"])
3849
end
3950
end
4051

0 commit comments

Comments
 (0)