webber 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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,10 @@
1
+ require "webber/version"
2
+ require "webber/server"
3
+
4
+ module Webber
5
+ module_function
6
+ # Your code goes here...
7
+ def hello
8
+ "helloworld"
9
+ end
10
+ end
@@ -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
+
@@ -0,0 +1,3 @@
1
+ module Webber
2
+ VERSION = "0.0.1"
3
+ end
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: []