rack-zippy 3.0.1 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +5 -1
- data/Gemfile +0 -6
- data/README.md +34 -44
- data/lib/rack-zippy.rb +91 -46
- data/lib/rack-zippy/railtie.rb +26 -0
- data/lib/rack-zippy/version.rb +1 -1
- data/rack-zippy.gemspec +8 -1
- data/test/asset_server_test.rb +49 -39
- data/test/configuration_test.rb +1 -0
- data/test/public/assets/loading.GiF +0 -0
- data/test/public/report.csv +1 -0
- data/test/railtie_test.rb +60 -0
- data/test/test_helper.rb +4 -37
- metadata +86 -20
- data/lib/rack-zippy/asset_compiler.rb +0 -39
- data/lib/rack-zippy/serveable_file.rb +0 -138
- data/test/null_asset_compiler_test.rb +0 -14
- data/test/rails_asset_compiler_test.rb +0 -46
- data/test/serveable_file_test.rb +0 -494
- data/video-player.png +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 69996e12bfb698114f7dfea5d26a0837de4041c1
|
4
|
+
data.tar.gz: 123aca242bc132651dba0ee53d666efe05a2e4a9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 43c0d933b8b6129d9a18b733c05e309f6986b4d9251f98a658c19a9ff7925b80c817ee08c34b3cc0888e4640e3d96320bfb1d5371870610d01366301b491a8c6
|
7
|
+
data.tar.gz: a0a6d4e154724317cda6fe934babc845b6f51779a73fb22915abc01a1d14e7a76ff947303e4eadfcef5a59c5605758bfbe22523eb50f5bb97bba99dcc70126ce
|
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,12 @@
|
|
1
|
+
## 4.0.0 / 2015-10-20
|
2
|
+
- Rack Zippy continues to support non-Rails Rack apps, though Rails support has ended in rack-zippy 4.0+. Rails 4.2+ now supports serving gzipped files directly. Configure your Rails 4.2+ app to use the `ActionDispatch::Static` middleware. If you absolutely need rack-zippy for your Rails app or can't upgrade to Rails 4.2+, try using an earlier rack-zippy version: `~> 3.0.1`
|
3
|
+
- New dependency on actionpack gem. Rack Zippy decorates the `ActionDispatch::Static` middleware for non-Rails Rack apps to provide Rack Zippy's own choice of caching headers and whitelisting of permitted static file extensions.
|
4
|
+
|
1
5
|
## 3.0.1 / 2015-05-19
|
2
6
|
- Allow paths with periods in the middle, but not if they immediately follow slash ([#46](https://github.com/eliotsykes/rack-zippy/pull/46)) @ssemakov
|
3
7
|
|
4
8
|
## 3.0.0 / 2015-04-18
|
5
|
-
- POTENTIAL BREAKING CHANGE! `STATIC_EXTENSION_REGEX` has been removed and replaced with a `static_extensions` array. If your app monkey patched `STATIC_EXTENSTION_REGEX` to change the file extension whitelist, then you will need to update your app to use rack-zippy 3.x. Depending on how you patched, and your test coverage, your app could silently fail. Search your codebase for `STATIC_EXTENSION_REGEX` to ensure it is not used. If it is used, then migrate your patch to use the new `Rack::Zippy.config` method for configuring `static_extensions`: https://github.com/eliotsykes/rack-zippy#static_extensions
|
9
|
+
- POTENTIAL BREAKING CHANGE! `STATIC_EXTENSION_REGEX` has been removed and replaced with a `static_extensions` array. If your app monkey patched `STATIC_EXTENSTION_REGEX` to change the file extension whitelist, then you will need to update your app to use rack-zippy 3.x. Depending on how you patched, and your test coverage, your app could silently fail. Search your codebase for `STATIC_EXTENSION_REGEX` to ensure it is not used. If it is used, then migrate your patch to use the new `Rack::Zippy.config` method for configuring `static_extensions`: https://github.com/eliotsykes/rack-zippy#static_extensions
|
6
10
|
- Make static extensions list configurable ([#45](https://github.com/eliotsykes/rack-zippy/pull/45)) Anton Petrunich
|
7
11
|
|
8
12
|
## 2.0.2 / 2014-12-15
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,45 +1,21 @@
|
|
1
|
-
#
|
1
|
+
# Hey fellow Rails developers, please read!
|
2
|
+
|
3
|
+
**Want to use rack-zippy with a Rails v4.2 or greater app?**
|
4
|
+
Its recommended you don't! Rails 4.2+ now supports serving gzipped files directly so there's no need for rack-zippy in Rails 4.2+ apps.
|
2
5
|
|
3
|
-
rack-zippy
|
4
|
-
|
6
|
+
**Want to use rack-zippy with a Rails v4.1 or less app?**
|
7
|
+
You'll need to use v3.0 of rack-zippy, see the README here: https://github.com/eliotsykes/rack-zippy/tree/v3.0.1
|
5
8
|
|
6
|
-
|
9
|
+
# rack-zippy
|
7
10
|
|
8
|
-
rack-zippy
|
9
|
-
the `rake assets:precompile` task. rack-zippy will serve non-gzipped assets where they are not available or not supported by the
|
10
|
-
requesting client.
|
11
|
+
rack-zippy v4+ is a Rack middleware for serving .gz files in Rack apps that are **not** Rails 4.2+ apps. (If you need to use rack-zippy in a Rails <= 4.1 app, then use v3.0 of rack-zippy, see README here: https://github.com/eliotsykes/rack-zippy/tree/v3.0.1)
|
11
12
|
|
12
|
-
rack-zippy
|
13
|
+
rack-zippy has convenient directory request handling:
|
13
14
|
|
14
15
|
- Requests for `/` and `/index` respond with `public/index.html` if present
|
15
16
|
- Requests for `/foo/` and `/foo` respond with first file present out of `public/foo.html`, `public/foo/index.html` (Same behaviour for subdirectories)
|
16
17
|
|
17
|
-
|
18
|
-
is currently serving uncompressed assets and how quick it is to setup rack-zippy:
|
19
|
-
|
20
|
-
[ ![Faster, friendlier assets with rack-zippy](/video-player.png "Faster, friendlier assets with rack-zippy") ](http://www.webdevbreak.com/specials/rack-zippy "Faster, friendlier assets with rack-zippy")
|
21
|
-
|
22
|
-
## Installation in Rails app
|
23
|
-
|
24
|
-
Add this line to your application's Gemfile:
|
25
|
-
|
26
|
-
gem 'rack-zippy'
|
27
|
-
|
28
|
-
And then execute:
|
29
|
-
|
30
|
-
$ bundle
|
31
|
-
|
32
|
-
In `config/environments/production.rb`, set `config.serve_static_assets` to `true`:
|
33
|
-
|
34
|
-
# Puts ActionDispatch::Static in middleware stack which we are going to replace with
|
35
|
-
# Rack::Zippy::AssetServer
|
36
|
-
config.serve_static_assets = true
|
37
|
-
|
38
|
-
Create the file `config/initializers/rack_zippy.rb` and put this line in it:
|
39
|
-
|
40
|
-
Rails.application.config.middleware.swap(ActionDispatch::Static, Rack::Zippy::AssetServer)
|
41
|
-
|
42
|
-
Now run `rake middleware` at the command line and make sure that `Rack::Zippy::AssetServer` is near the top of the outputted list. ActionDispatch::Static should not be in the list. Nicely done, rack-zippy is now installed in your app.
|
18
|
+
rack-zippy decorates actionpack's `ActionDispatch::Static` middleware for non-Rails Rack apps to provide rack-zippy's own choice of caching headers and whitelisting of permitted static file extensions. (As an alternative to rack-zippy, you can use actionpack's `ActionDispatch::Static` directly without rack-zippy.)
|
43
19
|
|
44
20
|
## Installation in Rack app (that isn’t a Rails app)
|
45
21
|
|
@@ -72,24 +48,24 @@ application's public/ directory and will respond with sensible caching headers.
|
|
72
48
|
|
73
49
|
`max_age_fallback`, is an integer value in seconds that should be used as the max_age fallback for files served by rack-zippy that live **outside** the `/assets` subdirectory *and* aren't `/favicon.ico`.
|
74
50
|
|
75
|
-
A typical use for `max_age_fallback` is to define how long the cache lifetime for static HTML files served by rack-zippy should be. For one of my sites I have this set to
|
51
|
+
A typical use for `max_age_fallback` is to define how long the cache lifetime for static HTML files served by rack-zippy should be. For one of my sites I have this set to 15 minutes:
|
76
52
|
|
77
53
|
```ruby
|
78
|
-
max_age_in_secs =
|
54
|
+
max_age_in_secs = 15*60 # 15 mins = 900 secs
|
79
55
|
use Rack::Zippy::AssetServer, asset_root, max_age_fallback: max_age_in_secs
|
80
56
|
```
|
81
57
|
|
82
58
|
Any files given the `max_age_fallback` would have the following `Cache-Control` header:
|
83
59
|
|
84
60
|
```
|
85
|
-
Cache-Control: public, max-age=
|
61
|
+
Cache-Control: public, max-age=900
|
86
62
|
```
|
87
63
|
|
88
64
|
### Configuration
|
89
65
|
|
90
66
|
#### Supported Extensions Whitelist
|
91
67
|
|
92
|
-
rack-zippy handles only files with whitelisted extensions. Default extensions are stored in the `static_extensions` array with an entry for each of these:
|
68
|
+
rack-zippy handles only files with whitelisted extensions. Default extensions are stored in the `static_extensions` array with an entry for each of these:
|
93
69
|
`css js html htm txt ico png jpg jpeg gif pdf svg zip gz eps psd ai woff woff2 ttf eot otf swf`
|
94
70
|
|
95
71
|
You can modify this list to support other extensions by appending the lowercased file extension to the `static_extensions` array:
|
@@ -97,23 +73,26 @@ You can modify this list to support other extensions by appending the lowercased
|
|
97
73
|
```ruby
|
98
74
|
Rack::Zippy.configure do |config|
|
99
75
|
# Add support for the given extensions:
|
100
|
-
config.static_extensions.push('csv', 'xls', 'rtf', ...EXTENSIONS TO ADD...)
|
76
|
+
config.static_extensions.push('map', 'csv', 'xls', 'rtf', ...EXTENSIONS TO ADD...)
|
101
77
|
end
|
102
78
|
```
|
103
79
|
|
104
|
-
|
80
|
+
It is not recommended, however if you use rack-zippy 4.0+ with a Rails 4.2+ app, you can skip the rack-zippy rails version check and log output. Put the following in an initializer:
|
105
81
|
|
106
|
-
|
82
|
+
```ruby
|
83
|
+
# config/initializers/zippy.rb
|
84
|
+
Rack::Zippy::Railtie.skip_version_check = true
|
85
|
+
```
|
107
86
|
|
108
|
-
Check your environment (in config/environments/) does not have `serve_static_assets` set to false:
|
109
87
|
|
110
|
-
|
88
|
+
## Troubleshooting
|
111
89
|
|
112
90
|
##### NameError: uninitialized constant Rack::Zippy
|
113
91
|
|
114
92
|
- Check `Gemfile` doesn't limit rack-zippy to a subset of environment groups
|
115
93
|
- Run `bundle install`
|
116
94
|
- Check `Gemfile.lock` contains an entry for rack-zippy
|
95
|
+
- Ensure `require 'rack-zippy'` is present near the top of `config.ru`
|
117
96
|
|
118
97
|
|
119
98
|
## Contributing
|
@@ -148,7 +127,18 @@ Cleanup time! When you’re finished testing, delete the local override and set
|
|
148
127
|
# In your-app/Gemfile change rack-zippy dependency to this (or similar):
|
149
128
|
gem 'rack-zippy', '~> 9.8.7' # Replace 9.8.7 with the rack-zippy release version you want to use.
|
150
129
|
|
130
|
+
#### How to Run a Single Test
|
131
|
+
|
132
|
+
```bash
|
133
|
+
# Single test file
|
134
|
+
ruby -Ilib:test test/assert_server_test.rb
|
151
135
|
|
136
|
+
# Single test method
|
137
|
+
ruby -Ilib:test test/assert_server_test.rb --name test_serves_static_file_as_directory
|
138
|
+
|
139
|
+
# Test methods matching a regex
|
140
|
+
ruby -Ilib:test test/assert_server_test.rb --name /serves_static/
|
141
|
+
```
|
152
142
|
|
153
143
|
## Contributors
|
154
144
|
|
@@ -157,6 +147,7 @@ Cleanup time! When you’re finished testing, delete the local override and set
|
|
157
147
|
- Luke Wendling https://github.com/lukewendling
|
158
148
|
- Anton Petrunich https://github.com/solenko
|
159
149
|
- ssemakov https://github.com/ssemakov
|
150
|
+
- Kai Schlichting https://github.com/lacco
|
160
151
|
|
161
152
|
## Releasing a new gem
|
162
153
|
|
@@ -169,4 +160,3 @@ Cleanup time! When you’re finished testing, delete the local override and set
|
|
169
160
|
6. Update version to the next pre-release version in `lib/rack-zippy/version.rb`, e.g. `1.0.1` becomes `1.0.2.pre`.
|
170
161
|
7. Add new heading to `CHANGELOG` for the next pre-release
|
171
162
|
8. Commit and push the updated `lib/rack-zippy/version.rb` and `CHANGELOG` files.
|
172
|
-
|
data/lib/rack-zippy.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'rack-zippy/version'
|
2
|
-
require 'rack-zippy/asset_compiler'
|
3
|
-
require 'rack-zippy/serveable_file'
|
4
2
|
require 'rack-zippy/configuration'
|
3
|
+
require 'rack-zippy/railtie' if defined?(Rails)
|
4
|
+
require 'action_controller'
|
5
5
|
|
6
6
|
module Rack
|
7
7
|
module Zippy
|
@@ -9,77 +9,122 @@ module Rack
|
|
9
9
|
|
10
10
|
define_setting :static_extensions, %w(css js html htm txt ico png jpg jpeg gif pdf svg zip gz eps psd ai woff woff2 ttf eot otf swf)
|
11
11
|
|
12
|
-
|
12
|
+
ASSETS_SUBDIR_REGEX = /\A\/assets(?:\/|\z)/
|
13
13
|
|
14
14
|
class AssetServer
|
15
15
|
|
16
|
-
|
16
|
+
attr_reader :static_middleware
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
raise ArgumentError.new 'Please specify asset_root when initializing Rack::Zippy::AssetServer ' +
|
24
|
-
'(asset_root is the path to your public directory, often the one with favicon.ico in it)'
|
25
|
-
end
|
26
|
-
end
|
27
|
-
@app = app
|
18
|
+
# @param app [#call(env)] the Rack app
|
19
|
+
# @param path [String] the path to the public directory, usually where favicon.ico lives
|
20
|
+
# @param max_age_fallback [Fixnum] time for Cache-Control header. Defaults to 1 day (in seconds).
|
21
|
+
def initialize(app, path, max_age_fallback: :day)
|
22
|
+
assert_path_valid path
|
28
23
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
24
|
+
cache_control = cache_control(max_age_fallback)
|
25
|
+
|
26
|
+
@app = app
|
27
|
+
blank_app = ->(env) { }
|
28
|
+
@static_middleware = ::ActionDispatch::Static.new(blank_app, path, cache_control)
|
33
29
|
end
|
34
30
|
|
35
31
|
def call(env)
|
36
|
-
path_info = env[
|
32
|
+
path_info = env[PATH_INFO]
|
33
|
+
return not_found_response if illegal_path?(path_info)
|
34
|
+
|
35
|
+
if try_static?(path_info)
|
36
|
+
static_response = static_middleware.call(env)
|
37
|
+
end
|
38
|
+
|
39
|
+
if static_response
|
40
|
+
after_static_responds(env, static_response)
|
41
|
+
else
|
42
|
+
@app.call(env)
|
43
|
+
end
|
44
|
+
end
|
37
45
|
|
38
|
-
|
46
|
+
private
|
39
47
|
|
40
|
-
|
41
|
-
:path_info => path_info,
|
42
|
-
:asset_root => asset_root,
|
43
|
-
:asset_compiler => asset_compiler,
|
44
|
-
:include_gzipped => client_accepts_gzip?(env),
|
45
|
-
:max_age_fallback => @options[:max_age_fallback]
|
46
|
-
}
|
48
|
+
ILLEGAL_PATH_REGEX = /(\/\.\.?)/
|
47
49
|
|
48
|
-
|
50
|
+
BLANK_PATH_MESSAGE = 'Please specify non-blank path when initializing rack-zippy middleware ' +
|
51
|
+
'(path leads to your public directory, often the one with favicon.ico in it)'
|
49
52
|
|
53
|
+
SECONDS_IN = {
|
54
|
+
day: 24*60*60,
|
55
|
+
month: 31*(24*60*60),
|
56
|
+
year: 365*(24*60*60)
|
57
|
+
}.freeze
|
50
58
|
|
51
|
-
|
52
|
-
|
53
|
-
|
59
|
+
# Old last-modified headers encourage caching via browser heuristics. Use it for year-long cached assets.
|
60
|
+
CACHE_FRIENDLY_LAST_MODIFIED = 'Mon, 10 Jan 2005 10:00:00 GMT'.freeze
|
61
|
+
|
62
|
+
FAVICON_PATH = '/favicon.ico'.freeze
|
63
|
+
PATH_INFO = 'PATH_INFO'.freeze
|
64
|
+
CACHE_CONTROL = 'Cache-Control'.freeze
|
65
|
+
LAST_MODIFIED = 'Last-Modified'.freeze
|
54
66
|
|
55
|
-
|
67
|
+
def assert_path_valid(path)
|
68
|
+
raise ArgumentError, BLANK_PATH_MESSAGE if path.blank?
|
56
69
|
end
|
57
70
|
|
58
|
-
def
|
59
|
-
|
71
|
+
def cache_control(max_age_fallback)
|
72
|
+
max_age_fallback = calc_max_age_fallback(max_age_fallback)
|
73
|
+
"public, max-age=#{max_age_fallback}"
|
60
74
|
end
|
61
75
|
|
62
|
-
|
76
|
+
def calc_max_age_fallback(max_age_fallback)
|
77
|
+
max_age_fallback.is_a?(Symbol) ? SECONDS_IN.fetch(max_age_fallback) : max_age_fallback
|
78
|
+
end
|
63
79
|
|
64
|
-
|
80
|
+
def illegal_path?(path)
|
81
|
+
path =~ ILLEGAL_PATH_REGEX
|
82
|
+
end
|
65
83
|
|
66
|
-
|
84
|
+
def not_found_response
|
85
|
+
[404, {}, ['Not Found']]
|
86
|
+
end
|
67
87
|
|
68
|
-
def
|
69
|
-
|
88
|
+
def try_static?(path)
|
89
|
+
extension = extension(path)
|
90
|
+
try_default_extension = extension.nil?
|
91
|
+
try_default_extension || static_extension?(extension)
|
70
92
|
end
|
71
93
|
|
72
|
-
def
|
73
|
-
|
74
|
-
|
94
|
+
def extension(path)
|
95
|
+
ext = ::File.extname(path).slice(1..-1)
|
96
|
+
ext.downcase! if ext
|
97
|
+
ext
|
75
98
|
end
|
76
99
|
|
77
|
-
def
|
78
|
-
|
100
|
+
def static_extension?(extension)
|
101
|
+
Rack::Zippy.static_extensions.include? extension
|
79
102
|
end
|
80
103
|
|
81
|
-
def
|
82
|
-
|
104
|
+
def after_static_responds(env, static_response)
|
105
|
+
path = ::Rack::Utils.unescape(env[PATH_INFO])
|
106
|
+
headers = static_response[1]
|
107
|
+
modify_headers(path, headers)
|
108
|
+
static_response
|
109
|
+
end
|
110
|
+
|
111
|
+
def modify_headers(path, headers)
|
112
|
+
case path
|
113
|
+
when ASSETS_SUBDIR_REGEX
|
114
|
+
lifetime_in_secs = SECONDS_IN[:year]
|
115
|
+
last_modified = CACHE_FRIENDLY_LAST_MODIFIED
|
116
|
+
when FAVICON_PATH
|
117
|
+
lifetime_in_secs = SECONDS_IN[:month]
|
118
|
+
last_modified = CACHE_FRIENDLY_LAST_MODIFIED
|
119
|
+
end
|
120
|
+
|
121
|
+
headers[CACHE_CONTROL] = "public, max-age=#{lifetime_in_secs}" if lifetime_in_secs
|
122
|
+
|
123
|
+
if last_modified
|
124
|
+
headers[LAST_MODIFIED] = last_modified
|
125
|
+
else
|
126
|
+
headers.delete(LAST_MODIFIED)
|
127
|
+
end
|
83
128
|
end
|
84
129
|
|
85
130
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Rack
|
2
|
+
module Zippy
|
3
|
+
class Railtie < ::Rails::Railtie
|
4
|
+
|
5
|
+
cattr_accessor :skip_version_check
|
6
|
+
|
7
|
+
def self.version_check
|
8
|
+
return if Rack::Zippy::Railtie.skip_version_check
|
9
|
+
if ::Rails.version.to_f >= minimum_rails_version_with_gzip_serving
|
10
|
+
puts "[rack-zippy] rack-zippy is not supported for this version of Rails. Rails now supports serving gzipped files using its own ActionDispatch::Static middleware. It is strongly recommended you remove rack-zippy from your app and use ActionDispatch::Static in its place."
|
11
|
+
else
|
12
|
+
puts "[rack-zippy] This version of rack-zippy does not support Rails. Your choices include: 1) [RECOMMENDED] Upgrade to Rails #{minimum_rails_version_with_gzip_serving} or above and use Rails' built-in ActionDispatch::Static middleware to serve gzipped files. or 2) Specify an earlier version of rack-zippy (~> '3.0.1') in your Gemfile that does support Rails"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.minimum_rails_version_with_gzip_serving
|
17
|
+
4.2
|
18
|
+
end
|
19
|
+
|
20
|
+
config.after_initialize do
|
21
|
+
Rack::Zippy::Railtie.version_check
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/rack-zippy/version.rb
CHANGED
data/rack-zippy.gemspec
CHANGED
@@ -14,7 +14,14 @@ Gem::Specification.new do |gem|
|
|
14
14
|
gem.license = 'MIT'
|
15
15
|
|
16
16
|
gem.files = `git ls-files`.split($/)
|
17
|
-
gem.executables =
|
17
|
+
gem.executables = []
|
18
18
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
19
19
|
gem.require_paths = ["lib"]
|
20
|
+
|
21
|
+
gem.add_dependency 'actionpack', '~> 4.2.4'
|
22
|
+
|
23
|
+
gem.add_development_dependency 'minitest', '~> 5.8.1'
|
24
|
+
gem.add_development_dependency 'guard-test', '~> 2.0.6'
|
25
|
+
gem.add_development_dependency 'rack-test', '~> 0.6.3'
|
26
|
+
gem.add_development_dependency 'rake'
|
20
27
|
end
|
data/test/asset_server_test.rb
CHANGED
@@ -7,14 +7,23 @@ module Rack
|
|
7
7
|
|
8
8
|
def setup
|
9
9
|
ensure_correct_working_directory
|
10
|
-
|
11
|
-
::Rails.public_path = Pathname.new(asset_root)
|
12
|
-
::Rails.configuration.assets.compile = false
|
10
|
+
@original_extensions = Rack::Zippy.static_extensions.dup
|
13
11
|
end
|
14
12
|
|
15
13
|
def teardown
|
16
14
|
revert_to_original_working_directory
|
17
15
|
@app = nil
|
16
|
+
Rack::Zippy.static_extensions = @original_extensions
|
17
|
+
end
|
18
|
+
|
19
|
+
BLANK_PATHS = [nil, '', ' ']
|
20
|
+
|
21
|
+
BLANK_PATHS.each do |blank_path|
|
22
|
+
test "initializer prevents blank path: #{blank_path.inspect}" do
|
23
|
+
assert_raises ArgumentError do
|
24
|
+
AssetServer.new(create_rack_app, blank_path)
|
25
|
+
end
|
26
|
+
end
|
18
27
|
end
|
19
28
|
|
20
29
|
def test_serves_static_file_as_directory
|
@@ -39,15 +48,6 @@ module Rack
|
|
39
48
|
assert_responds_with_html_file '', 'public/index.html'
|
40
49
|
end
|
41
50
|
|
42
|
-
def test_rails_asset_compiler_set_when_rails_environment_detected
|
43
|
-
assert_equal RailsAssetCompiler, app.send(:asset_compiler).class
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_null_asset_compiler_set_when_no_rails_environment_detected
|
47
|
-
exit_rails_env
|
48
|
-
assert_equal NullAssetCompiler, app.send(:asset_compiler).class
|
49
|
-
end
|
50
|
-
|
51
51
|
def test_request_for_non_asset_path_beginning_with_assets_dir_name_bypasses_middleware
|
52
52
|
get '/assets-are-great-but-im-not-one'
|
53
53
|
assert_underlying_app_responded
|
@@ -90,12 +90,6 @@ module Rack
|
|
90
90
|
assert_cache_friendly_last_modified
|
91
91
|
end
|
92
92
|
|
93
|
-
def test_does_not_serve_assets_subdir_request_when_assets_compile_enabled
|
94
|
-
::Rails.configuration.assets.compile = true
|
95
|
-
get '/assets/application.css'
|
96
|
-
assert_underlying_app_responded
|
97
|
-
end
|
98
|
-
|
99
93
|
def test_responds_with_gzipped_css_to_gzip_capable_clients
|
100
94
|
params = {}
|
101
95
|
get '/assets/application.css', params, env_for_gzip_capable_client
|
@@ -173,6 +167,7 @@ module Rack
|
|
173
167
|
get '/assets/rails.png'
|
174
168
|
assert_response_ok
|
175
169
|
assert_nil last_response.headers['vary']
|
170
|
+
assert_nil last_response.headers['content-encoding']
|
176
171
|
end
|
177
172
|
|
178
173
|
def test_responds_not_found_if_path_contains_hidden_dir
|
@@ -255,38 +250,53 @@ module Rack
|
|
255
250
|
assert_underlying_app_responded
|
256
251
|
end
|
257
252
|
|
258
|
-
def
|
259
|
-
asset_server = AssetServer.new(create_rack_app, '/custom/asset/root')
|
260
|
-
assert_equal '/custom/asset/root', asset_server.asset_root
|
261
|
-
end
|
262
|
-
|
263
|
-
def test_default_asset_root_is_rails_public_path
|
264
|
-
Rails.public_path = '/unexpected/absolute/path/to/public'
|
265
|
-
asset_server = AssetServer.new(create_rack_app)
|
266
|
-
assert_equal '/unexpected/absolute/path/to/public', asset_server.asset_root
|
267
|
-
end
|
268
|
-
|
269
|
-
def test_asset_server_accepts_max_age_fallback_option
|
253
|
+
def test_uses_max_age_fallback_in_cache_control
|
270
254
|
fallback_in_secs = 1234
|
271
255
|
@app = AssetServer.new(
|
272
256
|
create_rack_app, asset_root, max_age_fallback: fallback_in_secs
|
273
257
|
)
|
274
|
-
|
258
|
+
|
275
259
|
get '/thanks.html'
|
276
260
|
assert_equal "public, max-age=1234", last_response.headers['cache-control']
|
261
|
+
assert_last_modified nil
|
262
|
+
end
|
263
|
+
|
264
|
+
def test_request_for_existing_file_with_unknown_extension_is_passed_onto_underlying_app
|
265
|
+
assert Rack::Zippy.static_extensions.delete("txt")
|
266
|
+
get '/robots.txt'
|
267
|
+
assert_underlying_app_responded
|
268
|
+
end
|
269
|
+
|
270
|
+
def test_request_for_file_with_configured_extension_successful
|
271
|
+
Rack::Zippy.static_extensions << 'csv'
|
272
|
+
get '/report.csv'
|
273
|
+
assert_response_ok
|
274
|
+
assert_content_type 'text/csv'
|
275
|
+
assert_content_length 'public/report.csv'
|
276
|
+
end
|
277
|
+
|
278
|
+
def test_default_extensions_includes_fonts
|
279
|
+
font_extensions = ['woff', 'woff2', 'ttf', 'eot', 'otf']
|
280
|
+
font_extensions.each do |ext|
|
281
|
+
assert_includes(Rack::Zippy.static_extensions, ext)
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
def test_default_extensions_includes_flash
|
286
|
+
assert_includes(Rack::Zippy.static_extensions, 'swf')
|
287
|
+
end
|
288
|
+
|
289
|
+
def test_responds_with_file_with_uppercase_chars_in_extension
|
290
|
+
get '/assets/loading.GiF'
|
291
|
+
assert_response_ok
|
292
|
+
assert_content_type 'image/gif'
|
293
|
+
assert_content_length 'public/assets/loading.GiF'
|
277
294
|
end
|
278
295
|
|
279
296
|
private
|
280
297
|
|
281
298
|
def app
|
282
|
-
|
283
|
-
if in_rails_env?
|
284
|
-
@app = AssetServer.new(create_rack_app)
|
285
|
-
else
|
286
|
-
# In a pure rack app, non-Rails env
|
287
|
-
@app = AssetServer.new(create_rack_app, asset_root)
|
288
|
-
end
|
289
|
-
return @app
|
299
|
+
@app ||= AssetServer.new(create_rack_app, asset_root)
|
290
300
|
end
|
291
301
|
|
292
302
|
def create_rack_app
|