nekonote-framework 1.0.0.pre.beta
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 +7 -0
- data/LICENSE +22 -0
- data/README.md +49 -0
- data/bin/nekonote +45 -0
- data/data/structure/Gemfile +25 -0
- data/data/structure/config.ru +14 -0
- data/data/structure/handler/base.rb +21 -0
- data/data/structure/handler/error.rb +35 -0
- data/data/structure/handler/welcome.rb +11 -0
- data/data/structure/lib/.gitkeep +0 -0
- data/data/structure/preference/development/logger.yml +62 -0
- data/data/structure/preference/development/middlewares.rb +152 -0
- data/data/structure/preference/development/public.yml +29 -0
- data/data/structure/preference/development/route.yml +30 -0
- data/data/structure/preference/development/route_error.yml +28 -0
- data/data/structure/preference/development/route_include.yml +22 -0
- data/data/structure/preference/development/server/puma.rb +63 -0
- data/data/structure/preference/development/setting/example.yml +40 -0
- data/data/structure/preference/development/setting/site.yml +3 -0
- data/data/structure/preference/development/setting/welcome.yml +7 -0
- data/data/structure/public/css/layout/common.css +11 -0
- data/data/structure/public/css/layout/default.css +3 -0
- data/data/structure/public/css/layout/error.css +3 -0
- data/data/structure/public/css/welcome.css +47 -0
- data/data/structure/public/favicon.ico +0 -0
- data/data/structure/public/img/.gitkeep +0 -0
- data/data/structure/public/img/logo.png +0 -0
- data/data/structure/public/js/.gitkeep +0 -0
- data/data/structure/static/layout/default.tpl +19 -0
- data/data/structure/static/layout/error.tpl +15 -0
- data/data/structure/static/sass/welcome.scss +52 -0
- data/data/structure/static/template/error.tpl +4 -0
- data/data/structure/static/template/welcome/index.tpl +26 -0
- data/data/structure/tmp/pids/.gitkeep +0 -0
- data/lib/loader.rb +83 -0
- data/lib/nekonote.rb +9 -0
- data/lib/nekonote/cli.rb +702 -0
- data/lib/nekonote/cmd_parser.rb +55 -0
- data/lib/nekonote/core.rb +116 -0
- data/lib/nekonote/env.rb +56 -0
- data/lib/nekonote/exception/cli_error.rb +34 -0
- data/lib/nekonote/exception/error.rb +75 -0
- data/lib/nekonote/exception/handler_error.rb +5 -0
- data/lib/nekonote/exception/logger_error.rb +8 -0
- data/lib/nekonote/exception/page_cache_error.rb +6 -0
- data/lib/nekonote/exception/preference_error.rb +11 -0
- data/lib/nekonote/exception/view_error.rb +7 -0
- data/lib/nekonote/handler.rb +274 -0
- data/lib/nekonote/handler/protected_methods.rb +119 -0
- data/lib/nekonote/liquid/tag_env_get.rb +12 -0
- data/lib/nekonote/liquid/tag_setting_get.rb +12 -0
- data/lib/nekonote/logger.rb +135 -0
- data/lib/nekonote/page_cache.rb +111 -0
- data/lib/nekonote/preference.rb +215 -0
- data/lib/nekonote/puma.rb +131 -0
- data/lib/nekonote/rack/rack_static.rb +17 -0
- data/lib/nekonote/rack/rack_static_file.rb +19 -0
- data/lib/nekonote/rack/url_mapper.rb +193 -0
- data/lib/nekonote/rackup.rb +319 -0
- data/lib/nekonote/request.rb +295 -0
- data/lib/nekonote/setting.rb +59 -0
- data/lib/nekonote/spec.rb +22 -0
- data/lib/nekonote/util/filer.rb +69 -0
- data/lib/nekonote/util/process.rb +43 -0
- data/lib/nekonote/view.rb +398 -0
- data/lib/nekonote/yaml_access.rb +60 -0
- metadata +144 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5de2cc68d527ef357666746ae5cc4423a2c2a0a3
|
4
|
+
data.tar.gz: 68348bd3c64514ea3738588c5678158fb07fe42f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: af4a645150d95e69f18663b56b31d0cb28c54187d1e286df35e9d89254e7295b40eb681b9fcc42dcbe34527be5912cff3c64aef9cf1b926ed2a8a8540de228c6
|
7
|
+
data.tar.gz: 441702f028749ca8df4b0d0770c66cde538f17ff52882d7803e61e23725e1d193cfcd1e67858a45edc4f3e560195c6518cf057b90c292121c9a88618833d4d3d
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2017 Kazuya Hotta
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# Nekonote Framework
|
2
|
+
|
3
|
+
Nekonote Framework is a small web application framework that helps your web development.
|
4
|
+
|
5
|
+
## Features
|
6
|
+
|
7
|
+
### Simple
|
8
|
+
"Simplicity" is one of most important things. Nekonote Framework is simple and easy to learn.
|
9
|
+
|
10
|
+
### Lightweight
|
11
|
+
Nekonote Framework is not full-stack framework. It's small and Lightweight.
|
12
|
+
|
13
|
+
### Rack-based
|
14
|
+
Nekonote Framework can generate Rack application easily even if you are not familiar with Rack.
|
15
|
+
|
16
|
+
### MVC
|
17
|
+
Nekonote Framework is designed as Push-MVC based architecture.
|
18
|
+
|
19
|
+
### Application Structure
|
20
|
+
It's possible to generate a structure of application by running nekonote command.
|
21
|
+
|
22
|
+
### Sanitizing
|
23
|
+
Nekonote Framework can sanitize HTTP request parameters as your expected.
|
24
|
+
|
25
|
+
### Strict Routes
|
26
|
+
You can configure routes easily by the configuration files. You may set some rules to them.
|
27
|
+
|
28
|
+
### Error Pages
|
29
|
+
You may configure routes for error pages by the configuration file.
|
30
|
+
|
31
|
+
### Separable Environments
|
32
|
+
It's possible to separate the configuration files by environments.
|
33
|
+
|
34
|
+
### GUI Debuger
|
35
|
+
The GUI-based debugger can display exception details on your browser.
|
36
|
+
|
37
|
+
### Multiprocess-safe Logger
|
38
|
+
Nekonote Framework provides you safety logging. It's multiprocess-safety and thread-safety.
|
39
|
+
|
40
|
+
### Liquid Template Engine
|
41
|
+
Liquid is a well-known powerful template engine. Templates are rendered by Liquid.
|
42
|
+
|
43
|
+
## Getting Started
|
44
|
+
|
45
|
+
Please see [Getting Started](https://nekonote-framework.github.io/document/1.0.0-beta/getting-started.html) on the reference manual.
|
46
|
+
|
47
|
+
## License
|
48
|
+
|
49
|
+
Nekonote Framework is friendly license and is released under the [MIT License](https://opensource.org/licenses/MIT).
|
data/bin/nekonote
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
begin
|
4
|
+
begin
|
5
|
+
require 'color_echo'
|
6
|
+
require 'nekonote'
|
7
|
+
rescue LoadError
|
8
|
+
# couldn't find them in LOAD_PATH
|
9
|
+
# installed via bundler? change LOAD_PATH to bundler
|
10
|
+
require 'bundler/setup'
|
11
|
+
require 'color_echo'
|
12
|
+
require 'nekonote'
|
13
|
+
end
|
14
|
+
|
15
|
+
rescue LoadError => e
|
16
|
+
warn 'LoadError: ' + $/ + %( #{e.message})
|
17
|
+
exit 1
|
18
|
+
end
|
19
|
+
|
20
|
+
begin
|
21
|
+
root = nil
|
22
|
+
|
23
|
+
# parse options
|
24
|
+
parser = Nekonote::CmdParser.new $*
|
25
|
+
if parser.version_option?
|
26
|
+
Nekonote::Cli.version
|
27
|
+
|
28
|
+
elsif parser.help_option?
|
29
|
+
Nekonote::Cli.usage
|
30
|
+
|
31
|
+
elsif parser.root_option?
|
32
|
+
root = parser.get_op_val_root
|
33
|
+
raise Nekonote::CLIError, 'Missing value with --root option.' if root == nil
|
34
|
+
end
|
35
|
+
|
36
|
+
options = {
|
37
|
+
:root => root
|
38
|
+
}
|
39
|
+
|
40
|
+
cmd, subcmd, val = parser.parse_un_options
|
41
|
+
Nekonote::Cli.new(cmd, subcmd, val, options).exec
|
42
|
+
|
43
|
+
rescue StandardError, ScriptError => e
|
44
|
+
Nekonote::Error.abort e
|
45
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Nekonote Framework
|
4
|
+
# Copyright (c) 2017, Kazuya Hotta
|
5
|
+
# License https://github.com/khotta/Nekonote-Framework/blob/master/LICENSE
|
6
|
+
gem 'nekonote-framework', 'REPLACE_ME_TO_NEKONOTE_VERSION'
|
7
|
+
gem 'simple_rotate', '~> 1.2', '>= 1.2.0'
|
8
|
+
gem 'color_echo', '~> 3.1', '>= 3.1.1'
|
9
|
+
|
10
|
+
# Rack
|
11
|
+
# Copyright (c) 2007-2016 Christian Neukirchen <purl.org/net/chneukirchen>
|
12
|
+
# License https://github.com/rack/rack/blob/master/COPYING
|
13
|
+
gem 'rack', '~> 2.0', '>= 2.0.3'
|
14
|
+
|
15
|
+
# Liquid
|
16
|
+
# Copyright (c) 2005, 2006 Tobias Luetke
|
17
|
+
# License https://github.com/Shopify/liquid/blob/master/LICENSE
|
18
|
+
gem 'liquid', '~> 4.0', '>= 4.0.0'
|
19
|
+
|
20
|
+
# Puma
|
21
|
+
# Some code copyright (c) 2005, Zed Shaw
|
22
|
+
# Copyright (c) 2011, Evan Phoenix
|
23
|
+
# License https://github.com/puma/puma/blob/master/LICENSE
|
24
|
+
# Note: It seems that 'restart' doesn't work with 'bundler exec' in version 3.9.2
|
25
|
+
gem 'puma', '3.8.2'
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# This is a configuration file about Rack which created automatically.
|
2
|
+
# You must NOT delete this file.
|
3
|
+
|
4
|
+
# for starting web server withouht 'nekonote server'
|
5
|
+
if !defined? Nekonote
|
6
|
+
require 'bundler/setup'
|
7
|
+
require 'nekonote'
|
8
|
+
end
|
9
|
+
|
10
|
+
# set-up your application
|
11
|
+
Nekonote.set_root File.expand_path(File.dirname(__FILE__)) if !Nekonote.has_root?
|
12
|
+
self.instance_exec &Nekonote::Rackup.instance.use_middlewares
|
13
|
+
self.instance_exec Nekonote::Preference.instance.get_public, &Nekonote::Rackup.instance.define_public_dir
|
14
|
+
self.instance_exec Nekonote::Preference.instance.get_route, &Nekonote::Rackup.instance.define_route
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# BaseHandler class
|
2
|
+
#
|
3
|
+
# BaseHandler class is a mechanism for code reuse in each Handler classes.
|
4
|
+
# All Handler classes are supposed to be inherited from this class.
|
5
|
+
|
6
|
+
class BaseHandler < Nekonote::Handler
|
7
|
+
# This method will be executed at first
|
8
|
+
def __pre
|
9
|
+
end
|
10
|
+
|
11
|
+
# This method will be executed at last
|
12
|
+
def __post
|
13
|
+
if @custom_fields['page-title'].is_a? String
|
14
|
+
base = __setting_get :site, :title
|
15
|
+
if base != nil
|
16
|
+
list = {:title => "#{@custom_fields['page-title']} - #{base}"}
|
17
|
+
__assign list
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class ErrorHandler < BaseHandler
|
2
|
+
def missing_route
|
3
|
+
@subject = 'Invalid URL'
|
4
|
+
@msg = 'The URL does not match any route'
|
5
|
+
@detail = %('#{Nekonote::Env.get :REQUEST_URI}' does not match any route.)
|
6
|
+
end
|
7
|
+
|
8
|
+
def wrong_http_method
|
9
|
+
@subject = 'Unacceptable HTTP method'
|
10
|
+
@msg = 'You have accessed with the unacceptable HTTP method.'
|
11
|
+
end
|
12
|
+
|
13
|
+
def fatal
|
14
|
+
@subject = 'Server Error'
|
15
|
+
@msg = 'You can not access this page temporary.'
|
16
|
+
end
|
17
|
+
|
18
|
+
def not_found
|
19
|
+
@subject = 'No such resource'
|
20
|
+
@msg = %('#{Nekonote::Env.get :REQUEST_URI}' was not found on the server.)
|
21
|
+
end
|
22
|
+
|
23
|
+
# It will be called at last
|
24
|
+
def __post
|
25
|
+
# assign values to templates
|
26
|
+
list = {}
|
27
|
+
list['subject'] = @subject if defined?(@subject)
|
28
|
+
list['msg'] = @msg if defined?(@msg)
|
29
|
+
list['detail'] = @detail if defined?(@detail)
|
30
|
+
__assign list
|
31
|
+
|
32
|
+
# change the response code to not 500 but 200
|
33
|
+
__set_code 200
|
34
|
+
end
|
35
|
+
end
|
File without changes
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# Logger Configuration
|
2
|
+
|
3
|
+
# false to disable
|
4
|
+
# true to enable
|
5
|
+
enabled: true
|
6
|
+
|
7
|
+
# Path to a logfile which is supposed to be written log messages.
|
8
|
+
# e.g. log/%s.log
|
9
|
+
logfile: log/%s.log
|
10
|
+
|
11
|
+
# Configures if the logger writes the exception details to the log file when some exception raised.
|
12
|
+
write_exception: true
|
13
|
+
|
14
|
+
# Log message format
|
15
|
+
# log:
|
16
|
+
# Configures a log message format.
|
17
|
+
# datetime:
|
18
|
+
# The date format for the variable $DATE in ‘log’ directive.
|
19
|
+
format:
|
20
|
+
log: "$DATE [$LEVEL] $LOG"
|
21
|
+
datetime: "%a %d %b %H:%M:%S"
|
22
|
+
|
23
|
+
# Sets from which log severity levels are should be reported to the log file.
|
24
|
+
threshold: debug
|
25
|
+
|
26
|
+
# The default log severity level for log messages
|
27
|
+
default_log_level: info
|
28
|
+
|
29
|
+
# Sets the threshold to rotate log files.
|
30
|
+
limit: 1G
|
31
|
+
|
32
|
+
# Sets the maximum number of old log files.
|
33
|
+
# 0 to keeping all old log files.
|
34
|
+
keep: 0
|
35
|
+
|
36
|
+
# Configures if old log files are compressed when rotation is done.
|
37
|
+
# enabled:
|
38
|
+
# false to disabled
|
39
|
+
# true to enabled
|
40
|
+
# level:
|
41
|
+
# Compression level for gzip.
|
42
|
+
compress:
|
43
|
+
enabled: false
|
44
|
+
level: 6
|
45
|
+
|
46
|
+
# false to log messages are written to only log files.
|
47
|
+
# true to log messages are written to stdout as well.
|
48
|
+
with_stdout: false
|
49
|
+
|
50
|
+
# false to the warning messsages are ignored.
|
51
|
+
# ture to the warning messages are written to the log files.
|
52
|
+
verbose: true
|
53
|
+
|
54
|
+
# When this directive is set ‘true’, the logger can be multi-processes safe
|
55
|
+
psync: true
|
56
|
+
|
57
|
+
# Program will wait for this seconds after rotation was done.
|
58
|
+
sleeptime: 0.1
|
59
|
+
|
60
|
+
# false to disbale flushing buffered data after writing a log message to the log file.
|
61
|
+
# true to enable flushing buffered data.
|
62
|
+
flush: true
|
@@ -0,0 +1,152 @@
|
|
1
|
+
# You may add any configurations of Rack middlewares here.
|
2
|
+
# Please prepend underscore to beginning of your variable name to avoid naming conficts.
|
3
|
+
# Some configuration are listed by default. You may set them enabling or disbaling.
|
4
|
+
#
|
5
|
+
# --------------------------------------------------------------------------
|
6
|
+
# Rack::Reloader
|
7
|
+
# It reloads modified files without restarting nor reloading the web server.
|
8
|
+
# --------------------------------------------------------------------------
|
9
|
+
_cooldown = 10
|
10
|
+
use Rack::Reloader, _cooldown
|
11
|
+
|
12
|
+
# -------------------------------------------------------------------------------------------------
|
13
|
+
# Rack::ShowExceptions
|
14
|
+
# A GUI based debugger. It's won't work when 'fatal' route is set in route_error.yml.
|
15
|
+
# You are supposed to DISABLE this function on production environment for security reason.
|
16
|
+
# -------------------------------------------------------------------------------------------------
|
17
|
+
use Rack::ShowExceptions
|
18
|
+
|
19
|
+
# -------------------------------------------
|
20
|
+
# Rack::Auth::Basic
|
21
|
+
# It provides Basic access authentication.
|
22
|
+
# -------------------------------------------
|
23
|
+
=begin
|
24
|
+
_realm = 'Here is secret zone'
|
25
|
+
_username = 'username_here'
|
26
|
+
_passwd = 'password_here'
|
27
|
+
use Rack::Auth::Basic, _realm do |username, passwd|
|
28
|
+
username == _username && passwd == _passwd
|
29
|
+
end
|
30
|
+
=end
|
31
|
+
|
32
|
+
# --------------------------------------------
|
33
|
+
# Rack::Auth::Digest::MD5
|
34
|
+
# It provides Digest access authentication.
|
35
|
+
# --------------------------------------------
|
36
|
+
=begin
|
37
|
+
_realm = 'Here is secret zone'
|
38
|
+
_opaque = 'replace_me' # this is supposed to be set to a long random string
|
39
|
+
_username = 'username_here'
|
40
|
+
_passwd = 'password_here'
|
41
|
+
_pw = {_username => _passwd}
|
42
|
+
use Rack::Auth::Digest::MD5, _realm, _opaque do |username|
|
43
|
+
_pw[username]
|
44
|
+
end
|
45
|
+
=end
|
46
|
+
|
47
|
+
# ==========================
|
48
|
+
# Preferences for Session Management
|
49
|
+
# ==========================
|
50
|
+
_key = 'rack.session'
|
51
|
+
_domain = nil
|
52
|
+
_path = '/'
|
53
|
+
_expire_after = 3600
|
54
|
+
_secure = false
|
55
|
+
_httponly = false
|
56
|
+
_sidbits = 128
|
57
|
+
|
58
|
+
_session_options = {
|
59
|
+
:key => _key,
|
60
|
+
:domain => _domain,
|
61
|
+
:path => _path,
|
62
|
+
:expire_after => _expire_after,
|
63
|
+
:secure => _secure,
|
64
|
+
:httponly => _httponly,
|
65
|
+
:sidbits => _sidbits
|
66
|
+
}
|
67
|
+
_session_options[:domain] = _domain if _domain != nil
|
68
|
+
|
69
|
+
# ---------------------------------------------------------------------
|
70
|
+
# Rack::Session::Cookie
|
71
|
+
# It provides cookie based simple session management.
|
72
|
+
# ---------------------------------------------------------------------
|
73
|
+
# use Rack::Session::Cookie, _session_options
|
74
|
+
|
75
|
+
# --------------------------------------------------------------------------------------
|
76
|
+
# Rack::Session::Pool
|
77
|
+
# It provides property-based session management.
|
78
|
+
# --------------------------------------------------------------------------------------
|
79
|
+
=begin
|
80
|
+
_drop = false
|
81
|
+
_session_pool_options = {
|
82
|
+
:drop => _drop
|
83
|
+
}
|
84
|
+
use Rack::Session::Pool, _session_options.merge(_session_pool_options)
|
85
|
+
=end
|
86
|
+
|
87
|
+
# ----------------------------------------------------------------------------------
|
88
|
+
# Rack::Session::Dalli
|
89
|
+
# It provides memcached based session management.
|
90
|
+
# You must add 'dalli' to your Gemefile and typing bundle install to use it.
|
91
|
+
# ----------------------------------------------------------------------------------
|
92
|
+
=begin
|
93
|
+
_servers = ['127.0.0.1:11211'] # you may add any number of servers by comma
|
94
|
+
_connection_pooling = false
|
95
|
+
|
96
|
+
# options for dalli client
|
97
|
+
_namespace = 'nekonote.session'
|
98
|
+
_failover = true
|
99
|
+
_threadsafe = true
|
100
|
+
_expires_in = 0
|
101
|
+
_compress = false
|
102
|
+
_dalli_client_options = {
|
103
|
+
:namespace => _namespace,
|
104
|
+
:failover => _failover,
|
105
|
+
:threadsafe => _threadsafe,
|
106
|
+
:expires_in => _expires_in,
|
107
|
+
:compress => _compress
|
108
|
+
}
|
109
|
+
|
110
|
+
# options for connection pooling
|
111
|
+
# they will work when connection pooling is enbaled
|
112
|
+
_size = 5
|
113
|
+
_timeout = 5
|
114
|
+
_dalli_pool_options = {
|
115
|
+
:size => _size,
|
116
|
+
:timeout => _timeout
|
117
|
+
}
|
118
|
+
|
119
|
+
# setup dalli
|
120
|
+
require 'dalli'
|
121
|
+
|
122
|
+
if _connection_pooling
|
123
|
+
# enable connection pooling
|
124
|
+
_dalli_client = ::Dalli::Client.new _servers, _dalli_client_options
|
125
|
+
_cache = ::ConnectionPool::Wrapper.new(_pool_options) {_dalli_client}
|
126
|
+
else
|
127
|
+
# disable connection pooling
|
128
|
+
_cache = ::Dalli::Client.new _servers, _dalli_client_options
|
129
|
+
end
|
130
|
+
|
131
|
+
_dalli_options = {
|
132
|
+
:cache => _cache
|
133
|
+
}
|
134
|
+
use Rack::Session::Dalli, _session_options.merge(_dalli_options)
|
135
|
+
=end
|
136
|
+
|
137
|
+
# -----------------------------------------------------------------------------------------
|
138
|
+
# Rack::Access
|
139
|
+
# It provides access restrcition based on IP address.
|
140
|
+
# You must add 'rack-contrib' to your Gemefile and typing bundle install to use it.
|
141
|
+
# -----------------------------------------------------------------------------------------
|
142
|
+
# Restricting access by IP addresses.
|
143
|
+
# Note: You may append subnet mask to a IP address.
|
144
|
+
# Note: You may specify any number of ipmasks by comma.
|
145
|
+
=begin
|
146
|
+
_rules = {
|
147
|
+
# '/location' => ['ipmasks' ,...]
|
148
|
+
'/' => ['127.0.0.1'] #,...
|
149
|
+
}
|
150
|
+
require 'rack/contrib'
|
151
|
+
use Rack::Access, _rules
|
152
|
+
=end
|