heroku-deflater 0.3.0 → 0.4.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.
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --colour
2
+ --format progress
3
+ --tag ~slow
data/Gemfile CHANGED
@@ -1,6 +1,6 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- gem 'rack', '>=1.4.2'
3
+ gem 'rack', '~>1.4.5'
4
4
 
5
5
  group :development do
6
6
  gem "bundler"
data/Gemfile.lock CHANGED
@@ -7,10 +7,10 @@ GEM
7
7
  git (>= 1.2.5)
8
8
  rake
9
9
  rdoc
10
- json (1.7.6)
11
- rack (1.4.2)
10
+ json (1.7.7)
11
+ rack (1.4.5)
12
12
  rake (10.0.3)
13
- rdoc (3.12)
13
+ rdoc (3.12.1)
14
14
  json (~> 1.4)
15
15
 
16
16
  PLATFORMS
@@ -19,4 +19,4 @@ PLATFORMS
19
19
  DEPENDENCIES
20
20
  bundler
21
21
  jeweler
22
- rack (>= 1.4.2)
22
+ rack (~> 1.4.5)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.4.0
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "heroku-deflater"
8
- s.version = "0.3.0"
8
+ s.version = "0.4.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Roman Shterenzon"]
12
- s.date = "2013-01-07"
12
+ s.date = "2013-02-22"
13
13
  s.description = "Deflate assets on heroku"
14
14
  s.email = "romanbsd@yahoo.com"
15
15
  s.extra_rdoc_files = [
@@ -17,6 +17,7 @@ Gem::Specification.new do |s|
17
17
  "README.md"
18
18
  ]
19
19
  s.files = [
20
+ ".rspec",
20
21
  "Gemfile",
21
22
  "Gemfile.lock",
22
23
  "LICENSE.txt",
@@ -26,7 +27,8 @@ Gem::Specification.new do |s|
26
27
  "heroku-deflater.gemspec",
27
28
  "lib/heroku-deflater.rb",
28
29
  "lib/heroku-deflater/railtie.rb",
29
- "lib/heroku-deflater/skip_images.rb"
30
+ "lib/heroku-deflater/skip_binary.rb",
31
+ "spec/skip_binary_spec.rb"
30
32
  ]
31
33
  s.homepage = "http://github.com/romanbsd/heroku-deflater"
32
34
  s.licenses = ["MIT"]
@@ -38,16 +40,16 @@ Gem::Specification.new do |s|
38
40
  s.specification_version = 3
39
41
 
40
42
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
41
- s.add_runtime_dependency(%q<rack>, [">= 1.4.2"])
43
+ s.add_runtime_dependency(%q<rack>, ["~> 1.4.5"])
42
44
  s.add_development_dependency(%q<bundler>, [">= 0"])
43
45
  s.add_development_dependency(%q<jeweler>, [">= 0"])
44
46
  else
45
- s.add_dependency(%q<rack>, [">= 1.4.2"])
47
+ s.add_dependency(%q<rack>, ["~> 1.4.5"])
46
48
  s.add_dependency(%q<bundler>, [">= 0"])
47
49
  s.add_dependency(%q<jeweler>, [">= 0"])
48
50
  end
49
51
  else
50
- s.add_dependency(%q<rack>, [">= 1.4.2"])
52
+ s.add_dependency(%q<rack>, ["~> 1.4.5"])
51
53
  s.add_dependency(%q<bundler>, [">= 0"])
52
54
  s.add_dependency(%q<jeweler>, [">= 0"])
53
55
  end
@@ -1,15 +1,17 @@
1
1
  require 'rack/deflater'
2
- require 'heroku-deflater/skip_images'
2
+ require 'heroku-deflater/skip_binary'
3
3
 
4
4
  module HerokuDeflater
5
5
  class Railtie < Rails::Railtie
6
6
  initializer "heroku_deflater.configure_rails_initialization" do |app|
7
7
  app.middleware.insert_before ActionDispatch::Static, Rack::Deflater
8
- app.middleware.insert_before ActionDispatch::Static, HerokuDeflater::SkipImages
8
+ app.middleware.insert_before ActionDispatch::Static, HerokuDeflater::SkipBinary
9
9
  end
10
10
 
11
- config.after_initialize do |app|
12
- app.config.static_cache_control ||= "public, max-age=86400"
11
+ # Set default Cache-Control headers to one week.
12
+ # The configuration block in config/application.rb overrides this.
13
+ config.before_configuration do |app|
14
+ app.config.static_cache_control = 'public, max-age=604800'
13
15
  end
14
16
  end
15
17
  end
@@ -0,0 +1,30 @@
1
+ module HerokuDeflater
2
+ # Add a no-transform Cache-Control header to binary types, so they won't get gzipped
3
+ class SkipBinary
4
+ def initialize(app)
5
+ @app = app
6
+ end
7
+
8
+ WHITELIST = [
9
+ %r{^text/},
10
+ 'application/javascript',
11
+ 'application/json'
12
+ ].freeze
13
+
14
+ def call(env)
15
+ status, headers, body = @app.call(env)
16
+ headers = Rack::Utils::HeaderHash.new(headers)
17
+ content_type = headers['Content-Type']
18
+ cache_control = headers['Cache-Control'].to_s.downcase
19
+
20
+ unless cache_control.include?('no-transform') or WHITELIST.any? { |type| type === content_type }
21
+ if cache_control.empty?
22
+ headers['Cache-Control'] = 'no-transform'
23
+ else
24
+ headers['Cache-Control'] += ', no-transform'
25
+ end
26
+ end
27
+ [status, headers, body]
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,39 @@
1
+ require 'rack/mock'
2
+ require 'heroku-deflater/skip_binary'
3
+
4
+ describe HerokuDeflater::SkipBinary do
5
+ let(:env) { Rack::MockRequest.env_for('/') }
6
+
7
+ def app_returning_type(type, headers = {})
8
+ lambda { |env| [200, {'Content-Type' => type}.merge(headers), ['']] }
9
+ end
10
+
11
+ def process(type, headers = {})
12
+ described_class.new(app_returning_type(type, headers)).call(env)[1]
13
+ end
14
+
15
+ it "forbids compressing of binary types" do
16
+ %w[application/gzip application/pdf image/jpeg].each do |type|
17
+ headers = process(type)
18
+ headers['Cache-Control'].to_s.should include('no-transform')
19
+ end
20
+ end
21
+
22
+ it "allows compressing of text types" do
23
+ %w[text/plain text/html application/json application/javascript].each do |type|
24
+ headers = process(type)
25
+ headers['Cache-Control'].to_s.should_not include('no-transform')
26
+ end
27
+ end
28
+
29
+ it "adds to existing headers" do
30
+ headers = process('image/gif', 'Cache-Control' => 'public')
31
+ headers['Cache-Control'].should eq('public, no-transform')
32
+ end
33
+
34
+ it "doesn't add 'no-transform' if it's already present" do
35
+ headers = process('image/gif', 'Cache-Control' => 'public, no-transform')
36
+ headers['Cache-Control'].should eq('public, no-transform')
37
+ end
38
+
39
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: heroku-deflater
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,24 +9,24 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-07 00:00:00.000000000 Z
12
+ date: 2013-02-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ! '>='
19
+ - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: 1.4.2
21
+ version: 1.4.5
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
- - - ! '>='
27
+ - - ~>
28
28
  - !ruby/object:Gem::Version
29
- version: 1.4.2
29
+ version: 1.4.5
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: bundler
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -67,6 +67,7 @@ extra_rdoc_files:
67
67
  - LICENSE.txt
68
68
  - README.md
69
69
  files:
70
+ - .rspec
70
71
  - Gemfile
71
72
  - Gemfile.lock
72
73
  - LICENSE.txt
@@ -76,7 +77,8 @@ files:
76
77
  - heroku-deflater.gemspec
77
78
  - lib/heroku-deflater.rb
78
79
  - lib/heroku-deflater/railtie.rb
79
- - lib/heroku-deflater/skip_images.rb
80
+ - lib/heroku-deflater/skip_binary.rb
81
+ - spec/skip_binary_spec.rb
80
82
  homepage: http://github.com/romanbsd/heroku-deflater
81
83
  licenses:
82
84
  - MIT
@@ -92,7 +94,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
92
94
  version: '0'
93
95
  segments:
94
96
  - 0
95
- hash: 4431948398019269820
97
+ hash: 3241685697845166073
96
98
  required_rubygems_version: !ruby/object:Gem::Requirement
97
99
  none: false
98
100
  requirements:
@@ -1,22 +0,0 @@
1
- module HerokuDeflater
2
- # Add a no-transform Cache-Control header to images, so they won't get gzipped
3
- class SkipImages
4
- def initialize(app)
5
- @app = app
6
- end
7
-
8
- # TODO: whitelist rather than blacklist
9
- def call(env)
10
- status, headers, body = @app.call(env)
11
- headers = Rack::Utils::HeaderHash.new(headers)
12
- if headers['Content-Type'].to_s.start_with?('image/')
13
- if headers['Cache-Control'].nil? or headers['Cache-Control'].empty?
14
- headers['Cache-Control'] = 'no-transform'
15
- else
16
- headers['Cache-Control'] += ', no-transform'
17
- end
18
- end
19
- [status, headers, body]
20
- end
21
- end
22
- end