webber 0.0.1
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/bin/hbs +35 -0
- data/lib/webber.rb +10 -0
- data/lib/webber/hroutes.rb +44 -0
- data/lib/webber/server.rb +139 -0
- data/lib/webber/version.rb +3 -0
- metadata +120 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3888db1d27fb105a47a306b24a3ae5bff249d497
|
4
|
+
data.tar.gz: f0db15a22d54d119136f13a3ee83d3e8190179f8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9440bb58728320c58e3eaef92c09a6a012335c0a841a76a83b714d4d7c94899f28490dee3a1a0094dedf9474ed450ffdf0d0c0453909be5279f871fbdc4824a9
|
7
|
+
data.tar.gz: 4d94558137b4c06c0bc1b2cce8b745e3d41bc52ef851daa5ac72271c34ca09a6ec221c4a068323167f2b30cf67e0194f526d8fa0cbaa8d13ce356dcc1832c217
|
data/bin/hbs
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
argv = ARGV
|
4
|
+
|
5
|
+
_cmd = argv.shift
|
6
|
+
|
7
|
+
# 简单解析命令行参数 启动服务 和 设置环境
|
8
|
+
|
9
|
+
ENV["start_port"] = "3000"
|
10
|
+
ENV["app_env"] = "development"
|
11
|
+
|
12
|
+
case _cmd
|
13
|
+
when "s"
|
14
|
+
|
15
|
+
while !argv.empty?
|
16
|
+
_cmd = argv.shift
|
17
|
+
s = argv.shift
|
18
|
+
raise "命令#{_cmd}缺少参数" if s.nil?
|
19
|
+
case _cmd
|
20
|
+
when "-p"
|
21
|
+
ENV["start_port"] = s if s =~ /[0-9]+/
|
22
|
+
when "-e"
|
23
|
+
ENV["app_env"] = s if s =~ /[a-z]+/
|
24
|
+
end
|
25
|
+
end
|
26
|
+
require 'webber'
|
27
|
+
Webber::Server.boot!
|
28
|
+
when "c"
|
29
|
+
require 'irb'
|
30
|
+
require 'webber'
|
31
|
+
|
32
|
+
IRB.start
|
33
|
+
else
|
34
|
+
p "help"
|
35
|
+
end
|
data/lib/webber.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# --------------------------------------------------
|
2
|
+
#
|
3
|
+
# 路由 简单实现 rails 的方式
|
4
|
+
#
|
5
|
+
# get "/", "home#index"
|
6
|
+
# post "/item/buy", "item#buy"
|
7
|
+
# match "/items", "item#new", via: [:get, :post]
|
8
|
+
#
|
9
|
+
# --------------------------------------------------
|
10
|
+
class HRoutes
|
11
|
+
@@tables = {}
|
12
|
+
class RouteStruct
|
13
|
+
attr_reader :controller, :action, :request_methods
|
14
|
+
def initialize c,a,m
|
15
|
+
@controller,@action,@request_methods = c,a,m
|
16
|
+
end
|
17
|
+
end
|
18
|
+
class << self
|
19
|
+
def get *args
|
20
|
+
self._parse "get",*args
|
21
|
+
end
|
22
|
+
|
23
|
+
def post *args
|
24
|
+
self._parse "get",*args
|
25
|
+
end
|
26
|
+
|
27
|
+
def match *args
|
28
|
+
self._parse "match",*args
|
29
|
+
end
|
30
|
+
|
31
|
+
def tables
|
32
|
+
@@tables
|
33
|
+
end
|
34
|
+
|
35
|
+
def _parse _m,*args
|
36
|
+
_path_info = args[0].to_s
|
37
|
+
if args[1] =~ /^(.*)#(.*)$/
|
38
|
+
@@tables[_path_info] = RouteStruct.new $1,$2, _m == "match" ? args[2][:via].map(&:to_s) : [_m.to_s]
|
39
|
+
else
|
40
|
+
raise "routes error!"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
require 'erb'
|
2
|
+
require 'rack'
|
3
|
+
require 'json'
|
4
|
+
require 'active_record'
|
5
|
+
|
6
|
+
app_path = File.expand_path('../../../../', __FILE__)
|
7
|
+
lib_path = File.expand_path('../../', __FILE__)
|
8
|
+
ENV["app_path"] = app_path
|
9
|
+
ENV["lib_path"] = lib_path
|
10
|
+
|
11
|
+
require File.expand_path('./hroutes', File.dirname(__FILE__))
|
12
|
+
require File.expand_path('boot', app_path)
|
13
|
+
|
14
|
+
module Webber
|
15
|
+
class Server
|
16
|
+
@@instance = nil
|
17
|
+
@@server = nil
|
18
|
+
def initialize#(&block)
|
19
|
+
@port,@env = ENV["start_port"], ENV["app_env"]
|
20
|
+
@config = Application.config
|
21
|
+
@middlewares = []
|
22
|
+
#self.instance_eval(&block)
|
23
|
+
# @@instance == self
|
24
|
+
end
|
25
|
+
|
26
|
+
def use(middleware_class,*options, &block)
|
27
|
+
@middlewares << lambda {|app| middleware_class.new(app,*options, &block)}
|
28
|
+
end
|
29
|
+
|
30
|
+
def run(app)
|
31
|
+
@app = app
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_app
|
35
|
+
@middlewares.reverse.inject(@app) { |app, middleware| middleware.call(app)}
|
36
|
+
end
|
37
|
+
|
38
|
+
def load_default_middlewares
|
39
|
+
use Rack::ContentLength
|
40
|
+
use Rack::ContentType,"text/plain"
|
41
|
+
|
42
|
+
use Rack::CommonLogger, $stder # => 记录日志
|
43
|
+
|
44
|
+
use Rack::Chunked # => 分块传输 (很多服务器自动use了该中间件)
|
45
|
+
|
46
|
+
use Rack::ConditionalGet # => get资源缓存控制
|
47
|
+
# use Rack::Etag # => 判断计算url对象是否改变 和 ConditionalGet 中间件一起使用
|
48
|
+
use Rack::Deflater # => http 传输内容编码(压缩)
|
49
|
+
|
50
|
+
use Rack::Head # => RFC2616要求HEAD请求的响应体必须为空这就是Rack::HEAD所做的事情
|
51
|
+
|
52
|
+
use Rack::MethodOverride # => 用 post 模拟 put 和 delete
|
53
|
+
# => 需要表单中加入了一个隐含字段“_method” 把它的值设为“put 或 delete“
|
54
|
+
# use Rack::Lint # => 检查请求和响应是否符合Rack规格
|
55
|
+
|
56
|
+
use Rack::Reloader # => 开发环境用 修改代码不重启服务器
|
57
|
+
use Rack::Runtime # => header中加入一个 请求的处理时间 X-Runtime
|
58
|
+
|
59
|
+
# use Rack::Sendfile # => 传送文件
|
60
|
+
|
61
|
+
# apps = [lambda {|env| [404, {}, ["File doesn't exists"]]}, lambda {|env| [200, {}, ["I'm ok"]]}]
|
62
|
+
# use Rack::Cascade # => 挂载多个应用程序 它会尝试所有这些应用程序,直到某一个应用程序返回的代码不是404
|
63
|
+
|
64
|
+
# use Rack::Lock # => 不支持多线程框架 将互锁
|
65
|
+
|
66
|
+
use Rack::Session::Cookie, :key => 'rack.session', # => key, 缺省为 rack.session
|
67
|
+
:domain => 'example.com', # => 域名
|
68
|
+
:path => '/', # => 路径
|
69
|
+
:expire_after => 2592000, # => 过期时间
|
70
|
+
:secret => 'any_secret_key' # => cookie 加密
|
71
|
+
|
72
|
+
# default_options = {
|
73
|
+
# :path => '/',
|
74
|
+
# :domain => nil,
|
75
|
+
# :expire_after => nil,
|
76
|
+
# :secure => false,
|
77
|
+
# :httponly => true,
|
78
|
+
# :defer => false, # => 如果设置defer为true,那么响应头中将不会设置cookie(暂时还不知道有什么用处)
|
79
|
+
# :renew => false, # => 如果设置此选项为true,那么在具体的会话管理实现中不应该把原先客户端通过请求发送的session_id,
|
80
|
+
# # => 而是每次生成一个新的session_id,并把原先session_id对应的会话数据和这个新的session_id对应。
|
81
|
+
# # 注意renew的优先级高于defer,也就是即使defer设置为true,
|
82
|
+
# # 只要设置了renew为true,那么cookie也会被写入到响应头中
|
83
|
+
# :sidbits => 128 # => 生成的session_id长度为多少个bit, ID类提供了一个实用的generate_sid方法可以供你的具体实现使用
|
84
|
+
# }
|
85
|
+
# use Rack::Session::Abstract::ID,default_options
|
86
|
+
|
87
|
+
# default_options = Rack::Session::Abstract::ID::DEFAULT_OPTIONS.merge ({
|
88
|
+
# :namespace => 'rack:session', :memcache_server => 'localhost:11211'
|
89
|
+
# })
|
90
|
+
# use Rack::Session::Memcache, DEFAULT_OPTIONS
|
91
|
+
end
|
92
|
+
class << self
|
93
|
+
def load_middlewares
|
94
|
+
@@instance.load_default_middlewares
|
95
|
+
end
|
96
|
+
|
97
|
+
def parse_middlewares env
|
98
|
+
request = Rack::Request.new env
|
99
|
+
_path_info = request.path_info
|
100
|
+
_request_method = request.request_method.downcase
|
101
|
+
_route = HRoutes.tables[_path_info.to_s]
|
102
|
+
|
103
|
+
if _route.nil?
|
104
|
+
if !@config["page404"].nil?
|
105
|
+
_body = ::ERB.new(File.read(File.expand_path(@config["page404"], ENV["app_path"]))).result
|
106
|
+
else
|
107
|
+
_body = "page not found"
|
108
|
+
end
|
109
|
+
[ 404, { "Content-Type" => "text/html" }, [_body] ]
|
110
|
+
else
|
111
|
+
if _route.request_methods.include?(_request_method)
|
112
|
+
_controller = _route.controller
|
113
|
+
_action = _route.action
|
114
|
+
eval("#{_controller[0].upcase+_controller[1.._controller.size-1]}Controller.method(:#{_action})").call()
|
115
|
+
else
|
116
|
+
[404,{ "Content-Type" => "text/html" },["page not found"]]
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def run_middlewares
|
122
|
+
@@instance.run method(:parse_middlewares)
|
123
|
+
end
|
124
|
+
|
125
|
+
def boot!
|
126
|
+
@@instance = self.new
|
127
|
+
load_middlewares
|
128
|
+
run_middlewares
|
129
|
+
start!
|
130
|
+
end
|
131
|
+
|
132
|
+
def start!
|
133
|
+
@@server = Gem.find_files("thin").empty? ? Rack::Handler::WEBrick : Rack::Handler::Thin
|
134
|
+
@@server.run @@instance.to_app,:Port => ENV["start_port"]
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
metadata
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: webber
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- yoshikizh
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-03-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.7'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.7'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rack
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: "一个简单的服务器程序"
|
84
|
+
email:
|
85
|
+
- 177365340@qq.com
|
86
|
+
executables:
|
87
|
+
- hbs
|
88
|
+
extensions: []
|
89
|
+
extra_rdoc_files: []
|
90
|
+
files:
|
91
|
+
- bin/hbs
|
92
|
+
- lib/webber.rb
|
93
|
+
- lib/webber/hroutes.rb
|
94
|
+
- lib/webber/server.rb
|
95
|
+
- lib/webber/version.rb
|
96
|
+
homepage: ''
|
97
|
+
licenses:
|
98
|
+
- MIT
|
99
|
+
metadata: {}
|
100
|
+
post_install_message:
|
101
|
+
rdoc_options: []
|
102
|
+
require_paths:
|
103
|
+
- lib
|
104
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - ">="
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '0'
|
114
|
+
requirements: []
|
115
|
+
rubyforge_project:
|
116
|
+
rubygems_version: 2.2.2
|
117
|
+
signing_key:
|
118
|
+
specification_version: 4
|
119
|
+
summary: "一个简单的服务器程序"
|
120
|
+
test_files: []
|