four_o_four 0.0.1 → 0.0.2
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.
- checksums.yaml +4 -4
- data/README.md +37 -12
- data/four_o_four.gemspec +6 -6
- data/lib/four_o_four.rb +35 -5
- data/lib/utils/asset.rb +22 -0
- metadata +31 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 429692009ac816f33701d6efa8f8e3722dcfbb2c
|
4
|
+
data.tar.gz: cb77dc906dc4f6dc28a52875b0833f249fe778d3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5bcbbcc7b705eb382642bda6b9c7c42f27fcdebf905934d6b499e3281480bcf2dcb6faeb78a20d174c8f635dba84720babe513f224e5d20558fbf7220f5fa1bc
|
7
|
+
data.tar.gz: bf234d39e81a2f236a8f9c8a795fd7ef7d7875116b17e56ead9b48618978bc5b360b345962b5a28354b059845c9364d968e3b73a44379f56c20608c3460f93d5
|
data/README.md
CHANGED
@@ -1,11 +1,8 @@
|
|
1
1
|
# FourOFour
|
2
2
|
|
3
|
-
[](https://codeclimate.com/github/esparta/four_o_four)
|
7
|
-
[](https://codeclimate.com/github/esparta/four_o_four/coverage)
|
3
|
+
[![Build Status][travis]](https://travis-ci.org/SparkHub/four_o_four)
|
4
|
+
[![Code Climate][gpa]](https://codeclimate.com/github/SparkHub/four_o_four)
|
5
|
+
[![Test Coverage][coverage]](https://codeclimate.com/github/SparkHub/four_o_four/coverage)
|
9
6
|
|
10
7
|
A super simple Rack middleware to capture 404 responses and change the response
|
11
8
|
for any other logic.
|
@@ -40,7 +37,7 @@ application. On rails can be done like this:
|
|
40
37
|
module YourAwesomeApp
|
41
38
|
class Application < Rails::Application
|
42
39
|
# .... extra configuration
|
43
|
-
config.middleware.
|
40
|
+
config.middleware.insert_before ActionDispatch::RemoteIp, FourOFour
|
44
41
|
end
|
45
42
|
end
|
46
43
|
```
|
@@ -59,7 +56,7 @@ parameter to the configuration...
|
|
59
56
|
module YourAwesomeApp
|
60
57
|
class Application < Rails::Application
|
61
58
|
# .... extra configuration
|
62
|
-
config.middleware.
|
59
|
+
config.middleware.insert_before ActionDispatch::RemoteIp, FourOFour, 'DelegatedClass'
|
63
60
|
end
|
64
61
|
end
|
65
62
|
```
|
@@ -87,18 +84,46 @@ class DelegatedClass
|
|
87
84
|
end
|
88
85
|
```
|
89
86
|
|
87
|
+
## Options
|
88
|
+
|
89
|
+
### Skip specific formats
|
90
|
+
|
91
|
+
By default, FourOFour will catch any request format. A parameter can be passed to the middleware initialization in order to skip specific formats. The middleware will then ignore these request types.
|
92
|
+
|
93
|
+
Example: throw normal 404 page for `json` and `xml` formats:
|
94
|
+
```ruby
|
95
|
+
config.middleware.insert_before ActionDispatch::RemoteIp, FourOFour, 'DelegatedClass',
|
96
|
+
['application/json', 'application/xml']
|
97
|
+
```
|
98
|
+
|
90
99
|
## Development
|
91
100
|
|
92
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then,
|
101
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then,
|
102
|
+
run `rake spec` to run the tests. You can also run `bin/console` for an
|
103
|
+
interactive prompt that will allow you to experiment.
|
93
104
|
|
94
|
-
To install this gem onto your local machine, run `bundle exec rake install`.
|
105
|
+
To install this gem onto your local machine, run `bundle exec rake install`.
|
106
|
+
To release a new version, update the version number in `version.rb`, and then
|
107
|
+
run `bundle exec rake release`, which will create a git tag for the version,
|
108
|
+
push git commits and tags, and push the `.gem` file to [rubygems.org][rubygems].
|
95
109
|
|
96
110
|
## Contributing
|
97
111
|
|
98
|
-
Bug reports and pull requests are welcome on GitHub at
|
112
|
+
Bug reports and pull requests are welcome on GitHub at
|
113
|
+
https://github.com/SparkHub/four_o_four. This project is intended to be a safe,
|
114
|
+
welcoming space for collaboration, and contributors are expected to adhere to
|
115
|
+
the [Contributor Covenant][covenant] code of conduct.
|
99
116
|
|
100
117
|
|
101
118
|
## License
|
102
119
|
|
103
|
-
The gem is available as open source under the terms of the
|
120
|
+
The gem is available as open source under the terms of the
|
121
|
+
[MIT License][license]
|
104
122
|
|
123
|
+
[repo]: https://github.com/SparkHub/four_o_four
|
124
|
+
[travis]: https://travis-ci.org/SparkHub/four_o_four.svg?branch=master
|
125
|
+
[gpa]: https://codeclimate.com/github/SparkHub/four_o_four/badges/gpa.svg
|
126
|
+
[coverage]: https://codeclimate.com/github/SparkHub/four_o_four/badges/coverage.svg
|
127
|
+
[license]: http://opensource.org/licenses/MIT
|
128
|
+
[rubygems]: https://rubygems.org
|
129
|
+
[covenant]: http://contributor-covenant.org
|
data/four_o_four.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = 'four_o_four'
|
7
|
-
spec.version = '0.0.
|
7
|
+
spec.version = '0.0.2'
|
8
8
|
spec.authors = ['Espartaco Palma']
|
9
9
|
spec.email = ['esparta@gmail.com']
|
10
10
|
|
@@ -17,7 +17,7 @@ Gem::Specification.new do |spec|
|
|
17
17
|
class for a delegation, separating all the concerns. Routes and logic should
|
18
18
|
have their own space.
|
19
19
|
DESCRIPTION
|
20
|
-
spec.homepage = 'https://github.com/
|
20
|
+
spec.homepage = 'https://github.com/SparkHub/four_o_four'
|
21
21
|
spec.license = 'MIT'
|
22
22
|
|
23
23
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
@@ -27,13 +27,13 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
28
28
|
spec.require_paths = ['lib']
|
29
29
|
|
30
|
-
spec.add_dependency 'rack'
|
31
|
-
spec.add_dependency 'activesupport'
|
30
|
+
spec.add_dependency 'rack', '~> 1.6.4'
|
32
31
|
spec.add_development_dependency 'bundler', '~> 1.11'
|
33
32
|
spec.add_development_dependency 'rake', '~> 10.0'
|
34
33
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
35
|
-
spec.add_development_dependency 'rspec-nc'
|
36
|
-
spec.add_development_dependency '
|
34
|
+
spec.add_development_dependency 'rspec-nc', '~> 0.2.1'
|
35
|
+
spec.add_development_dependency 'listen', '~> 3.0.6'
|
36
|
+
spec.add_development_dependency 'guard', '~> 2.13.0'
|
37
37
|
spec.add_development_dependency 'guard-rspec'
|
38
38
|
spec.add_development_dependency 'pry'
|
39
39
|
spec.add_development_dependency 'pry-remote'
|
data/lib/four_o_four.rb
CHANGED
@@ -1,17 +1,21 @@
|
|
1
1
|
# Redirector...
|
2
|
-
require '
|
2
|
+
require 'utils/asset'
|
3
|
+
|
3
4
|
# A small Rack middleware to handle 404 responses with a delegation
|
4
5
|
class FourOFour
|
5
6
|
VERSION = '0.0.2'
|
6
|
-
|
7
|
+
|
8
|
+
def initialize(app, delegation = nil, skip_formats = [])
|
7
9
|
@app = app
|
8
|
-
@delegation = delegation || "#{self.class}::DefaultApplication"
|
10
|
+
@delegation = (delegation || "#{self.class}::DefaultApplication").to_s
|
11
|
+
@skip_formats = Regexp.union(Array(skip_formats))
|
9
12
|
end
|
10
13
|
|
11
14
|
def call(env)
|
12
15
|
status, headers, response = @app.call(env)
|
13
|
-
|
14
|
-
|
16
|
+
|
17
|
+
if !Utils::Asset.match(env['REQUEST_URI']) && can_process_request?(status, headers)
|
18
|
+
Object.const_get(@delegation).new.call(env)
|
15
19
|
else
|
16
20
|
[status, headers, response]
|
17
21
|
end
|
@@ -31,4 +35,30 @@ class FourOFour
|
|
31
35
|
''')
|
32
36
|
end
|
33
37
|
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
# Test if the current request can be processed by four_o_four.
|
42
|
+
# It will depend on the request and if any skipped formats have been set.
|
43
|
+
#
|
44
|
+
# @param [Integer] status Status of the current request.
|
45
|
+
# @param [Rack::Utils::HeaderHash] headers Header of the current request.
|
46
|
+
# @return [Boolean]
|
47
|
+
#
|
48
|
+
# @api private
|
49
|
+
def can_process_request?(status, headers)
|
50
|
+
content_type = headers['Content-Type']
|
51
|
+
|
52
|
+
404 == status && processable_type?(content_type)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Return true if the request type can be processed (try to match with possible skipped formats).
|
56
|
+
#
|
57
|
+
# @param [String] content_type Header's content type value.
|
58
|
+
# @return [Boolean]
|
59
|
+
#
|
60
|
+
# @api private
|
61
|
+
def processable_type?(content_type)
|
62
|
+
content_type.nil? || (content_type && content_type !~ @skip_formats)
|
63
|
+
end
|
34
64
|
end
|
data/lib/utils/asset.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
module Utils
|
2
|
+
module Asset
|
3
|
+
|
4
|
+
class << self
|
5
|
+
|
6
|
+
# Return true if the request is an asset returned by the server
|
7
|
+
# by matching the extension.
|
8
|
+
#
|
9
|
+
# @return [Boolean]
|
10
|
+
#
|
11
|
+
# @api public
|
12
|
+
def match(path)
|
13
|
+
!(path !~ /\.(?:p?jpe?g?|png|gif|bmp|webp|tiff|ico|
|
14
|
+
avi|wmv|flv|mpe?g?|mp4|
|
15
|
+
wav|mp3|ogg|
|
16
|
+
font|eot|ttf|woff|svg|
|
17
|
+
js|css|te?xt|yaml|zip|xml|rss|pdf|csv|htc|msg|swf|
|
18
|
+
docx?|dotx?|xla|xlsx?|xltx?|potx?|pptx?|mdbx?)$/xi)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
metadata
CHANGED
@@ -1,43 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: four_o_four
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Espartaco Palma
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-07-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - '>='
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: activesupport
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - '>='
|
17
|
+
- - ~>
|
32
18
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
19
|
+
version: 1.6.4
|
34
20
|
type: :runtime
|
35
21
|
prerelease: false
|
36
22
|
version_requirements: !ruby/object:Gem::Requirement
|
37
23
|
requirements:
|
38
|
-
- -
|
24
|
+
- - ~>
|
39
25
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
26
|
+
version: 1.6.4
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: bundler
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -84,30 +70,44 @@ dependencies:
|
|
84
70
|
name: rspec-nc
|
85
71
|
requirement: !ruby/object:Gem::Requirement
|
86
72
|
requirements:
|
87
|
-
- -
|
73
|
+
- - ~>
|
88
74
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
75
|
+
version: 0.2.1
|
90
76
|
type: :development
|
91
77
|
prerelease: false
|
92
78
|
version_requirements: !ruby/object:Gem::Requirement
|
93
79
|
requirements:
|
94
|
-
- -
|
80
|
+
- - ~>
|
95
81
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
82
|
+
version: 0.2.1
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: listen
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ~>
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 3.0.6
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 3.0.6
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: guard
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - ~>
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version:
|
103
|
+
version: 2.13.0
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - ~>
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
110
|
+
version: 2.13.0
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: guard-rspec
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -203,7 +203,8 @@ files:
|
|
203
203
|
- bin/setup
|
204
204
|
- four_o_four.gemspec
|
205
205
|
- lib/four_o_four.rb
|
206
|
-
|
206
|
+
- lib/utils/asset.rb
|
207
|
+
homepage: https://github.com/SparkHub/four_o_four
|
207
208
|
licenses:
|
208
209
|
- MIT
|
209
210
|
metadata: {}
|
@@ -223,7 +224,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
223
224
|
version: '0'
|
224
225
|
requirements: []
|
225
226
|
rubyforge_project:
|
226
|
-
rubygems_version: 2.
|
227
|
+
rubygems_version: 2.4.8
|
227
228
|
signing_key:
|
228
229
|
specification_version: 4
|
229
230
|
summary: FourOFour, a simple Rack middleware to handle 404 responses with delegation
|