heroku-deflater 0.2.0 → 0.3.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/Gemfile +2 -0
- data/Gemfile.lock +3 -1
- data/README.md +1 -3
- data/VERSION +1 -1
- data/heroku-deflater.gemspec +5 -3
- data/lib/heroku-deflater/railtie.rb +0 -1
- metadata +19 -4
- data/lib/heroku-deflater/deflater.rb +0 -105
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -3,8 +3,6 @@
|
|
3
3
|
A simple rack middleware that enables compressing of your assets and application
|
4
4
|
responses on Heroku, while not wasting CPU cycles on pointlessly gzipping images.
|
5
5
|
|
6
|
-
It also bundles the fix for the nasty Rack::Deflater [bug][1].
|
7
|
-
|
8
6
|
## Installing
|
9
7
|
|
10
8
|
Add to your Gemfile:
|
@@ -27,4 +25,4 @@ Add to your Gemfile:
|
|
27
25
|
Copyright (c) 2012 Roman Shterenzon. See LICENSE.txt for
|
28
26
|
further details.
|
29
27
|
|
30
|
-
[1]: https://github.com/rack/rack/issues/349
|
28
|
+
[1]: https://github.com/rack/rack/issues/349
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/heroku-deflater.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "heroku-deflater"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.3.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 = "
|
12
|
+
s.date = "2013-01-07"
|
13
13
|
s.description = "Deflate assets on heroku"
|
14
14
|
s.email = "romanbsd@yahoo.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -25,7 +25,6 @@ Gem::Specification.new do |s|
|
|
25
25
|
"VERSION",
|
26
26
|
"heroku-deflater.gemspec",
|
27
27
|
"lib/heroku-deflater.rb",
|
28
|
-
"lib/heroku-deflater/deflater.rb",
|
29
28
|
"lib/heroku-deflater/railtie.rb",
|
30
29
|
"lib/heroku-deflater/skip_images.rb"
|
31
30
|
]
|
@@ -39,13 +38,16 @@ Gem::Specification.new do |s|
|
|
39
38
|
s.specification_version = 3
|
40
39
|
|
41
40
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
41
|
+
s.add_runtime_dependency(%q<rack>, [">= 1.4.2"])
|
42
42
|
s.add_development_dependency(%q<bundler>, [">= 0"])
|
43
43
|
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
44
44
|
else
|
45
|
+
s.add_dependency(%q<rack>, [">= 1.4.2"])
|
45
46
|
s.add_dependency(%q<bundler>, [">= 0"])
|
46
47
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
47
48
|
end
|
48
49
|
else
|
50
|
+
s.add_dependency(%q<rack>, [">= 1.4.2"])
|
49
51
|
s.add_dependency(%q<bundler>, [">= 0"])
|
50
52
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
51
53
|
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.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,24 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rack
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.4.2
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.4.2
|
14
30
|
- !ruby/object:Gem::Dependency
|
15
31
|
name: bundler
|
16
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -59,7 +75,6 @@ files:
|
|
59
75
|
- VERSION
|
60
76
|
- heroku-deflater.gemspec
|
61
77
|
- lib/heroku-deflater.rb
|
62
|
-
- lib/heroku-deflater/deflater.rb
|
63
78
|
- lib/heroku-deflater/railtie.rb
|
64
79
|
- lib/heroku-deflater/skip_images.rb
|
65
80
|
homepage: http://github.com/romanbsd/heroku-deflater
|
@@ -77,7 +92,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
77
92
|
version: '0'
|
78
93
|
segments:
|
79
94
|
- 0
|
80
|
-
hash:
|
95
|
+
hash: 4431948398019269820
|
81
96
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
97
|
none: false
|
83
98
|
requirements:
|
@@ -1,105 +0,0 @@
|
|
1
|
-
# Fixes https://github.com/rack/rack/issues/349
|
2
|
-
require "zlib"
|
3
|
-
require "stringio"
|
4
|
-
require "time" # for Time.httpdate
|
5
|
-
require 'rack/utils'
|
6
|
-
|
7
|
-
module Rack
|
8
|
-
class Deflater
|
9
|
-
def initialize(app)
|
10
|
-
@app = app
|
11
|
-
end
|
12
|
-
|
13
|
-
def call(env)
|
14
|
-
status, headers, body = @app.call(env)
|
15
|
-
headers = Utils::HeaderHash.new(headers)
|
16
|
-
|
17
|
-
# Skip compressing empty entity body responses and responses with
|
18
|
-
# no-transform set.
|
19
|
-
if Utils::STATUS_WITH_NO_ENTITY_BODY.include?(status) ||
|
20
|
-
headers['Cache-Control'].to_s =~ /\bno-transform\b/ ||
|
21
|
-
(headers['Content-Encoding'] && headers['Content-Encoding'] !~ /\bidentity\b/)
|
22
|
-
return [status, headers, body]
|
23
|
-
end
|
24
|
-
|
25
|
-
request = Request.new(env)
|
26
|
-
|
27
|
-
encoding = Utils.select_best_encoding(%w(gzip deflate identity),
|
28
|
-
request.accept_encoding)
|
29
|
-
|
30
|
-
# Set the Vary HTTP header.
|
31
|
-
vary = headers["Vary"].to_s.split(",").map { |v| v.strip }
|
32
|
-
unless vary.include?("*") || vary.include?("Accept-Encoding")
|
33
|
-
headers["Vary"] = vary.push("Accept-Encoding").join(",")
|
34
|
-
end
|
35
|
-
|
36
|
-
case encoding
|
37
|
-
when "gzip"
|
38
|
-
headers['Content-Encoding'] = "gzip"
|
39
|
-
headers.delete('Content-Length')
|
40
|
-
mtime = headers.key?("Last-Modified") ?
|
41
|
-
Time.httpdate(headers["Last-Modified"]) : Time.now
|
42
|
-
[status, headers, GzipStream.new(body, mtime)]
|
43
|
-
when "deflate"
|
44
|
-
headers['Content-Encoding'] = "deflate"
|
45
|
-
headers.delete('Content-Length')
|
46
|
-
[status, headers, DeflateStream.new(body)]
|
47
|
-
when "identity"
|
48
|
-
[status, headers, body]
|
49
|
-
when nil
|
50
|
-
body.close if body.respond_to?(:close)
|
51
|
-
message = "An acceptable encoding for the requested resource #{request.fullpath} could not be found."
|
52
|
-
[406, {"Content-Type" => "text/plain", "Content-Length" => message.length.to_s}, [message]]
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
class GzipStream
|
57
|
-
def initialize(body, mtime)
|
58
|
-
@body = body
|
59
|
-
@mtime = mtime
|
60
|
-
end
|
61
|
-
|
62
|
-
def each(&block)
|
63
|
-
@writer = block
|
64
|
-
gzip =::Zlib::GzipWriter.new(self)
|
65
|
-
gzip.mtime = @mtime
|
66
|
-
@body.each { |part|
|
67
|
-
gzip.write(part)
|
68
|
-
gzip.flush
|
69
|
-
}
|
70
|
-
ensure
|
71
|
-
@body.close if @body.respond_to?(:close)
|
72
|
-
gzip.close
|
73
|
-
@writer = nil
|
74
|
-
end
|
75
|
-
|
76
|
-
def write(data)
|
77
|
-
@writer.call(data)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
class DeflateStream
|
82
|
-
DEFLATE_ARGS = [
|
83
|
-
Zlib::DEFAULT_COMPRESSION,
|
84
|
-
# drop the zlib header which causes both Safari and IE to choke
|
85
|
-
-Zlib::MAX_WBITS,
|
86
|
-
Zlib::DEF_MEM_LEVEL,
|
87
|
-
Zlib::DEFAULT_STRATEGY
|
88
|
-
]
|
89
|
-
|
90
|
-
def initialize(body)
|
91
|
-
@body = body
|
92
|
-
end
|
93
|
-
|
94
|
-
def each
|
95
|
-
deflater = ::Zlib::Deflate.new(*DEFLATE_ARGS)
|
96
|
-
@body.each { |part| yield deflater.deflate(part, Zlib::SYNC_FLUSH) }
|
97
|
-
yield deflater.finish
|
98
|
-
nil
|
99
|
-
ensure
|
100
|
-
@body.close if @body.respond_to?(:close)
|
101
|
-
deflater.close
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|