waitress-core 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +4 -4
  3. data/LICENSE +21 -21
  4. data/Rakefile +13 -13
  5. data/bin/waitress +22 -22
  6. data/ext/Thanks.md +1 -1
  7. data/ext/waitress_http11/ext_help.h +15 -15
  8. data/ext/waitress_http11/extconf.rb +6 -6
  9. data/ext/waitress_http11/http11.c +532 -532
  10. data/ext/waitress_http11/http11_parser.c +1216 -1216
  11. data/ext/waitress_http11/http11_parser.h +49 -49
  12. data/ext/waitress_http11/http11_parser.java.rl +171 -171
  13. data/ext/waitress_http11/http11_parser.rl +165 -165
  14. data/ext/waitress_http11/http11_parser_common.rl +55 -55
  15. data/ext/waitress_http11/http11_wrb_parser.h +91 -91
  16. data/lib/waitress/chef.rb +113 -113
  17. data/lib/waitress/configure.rb +121 -121
  18. data/lib/waitress/evalbind.rb +9 -9
  19. data/lib/waitress/handlers/dirhandler.rb +39 -39
  20. data/lib/waitress/handlers/handler.rb +57 -57
  21. data/lib/waitress/handlers/handler404.rb +25 -25
  22. data/lib/waitress/handlers/libhandler.rb +58 -58
  23. data/lib/waitress/kernel.rb +182 -182
  24. data/lib/waitress/parse/query.rb +60 -60
  25. data/lib/waitress/request.rb +45 -45
  26. data/lib/waitress/resources/default_config.rb +52 -52
  27. data/lib/waitress/resources/http/404.html +18 -18
  28. data/lib/waitress/resources/http/css/hack.css +37 -37
  29. data/lib/waitress/resources/http/css/waitress.css +57 -57
  30. data/lib/waitress/resources/http/fonts/svg/latin/hack-bold-latin-webfont.svg +240 -240
  31. data/lib/waitress/resources/http/fonts/svg/latin/hack-bolditalic-latin-webfont.svg +240 -240
  32. data/lib/waitress/resources/http/fonts/svg/latin/hack-italic-latin-webfont.svg +240 -240
  33. data/lib/waitress/resources/http/fonts/svg/latin/hack-regular-latin-webfont.svg +240 -240
  34. data/lib/waitress/resources/http/index.html +15 -15
  35. data/lib/waitress/response.rb +105 -105
  36. data/lib/waitress/server.rb +160 -161
  37. data/lib/waitress/util.rb +707 -707
  38. data/lib/waitress/version.rb +3 -3
  39. data/lib/waitress/vhost.rb +217 -217
  40. data/lib/waitress.rb +99 -106
  41. data/lib/waitress_http11.bundle +0 -0
  42. data/waitress-core.gemspec +29 -29
  43. metadata +4 -4
  44. data/lib/waitress_http11.so +0 -0
@@ -1,3 +1,3 @@
1
- module Waitress
2
- VERSION = "0.2.2"
3
- end
1
+ module Waitress
2
+ VERSION = "0.2.3"
3
+ end
@@ -1,217 +1,217 @@
1
- module Waitress
2
- # The VHost class is responsible for the actions of a Virtual Host, that is
3
- # reacting to a certain subdomain and handling the requests that are sent to it.
4
- # The requests are managed through the usage of +Waitress::Handler+ instances.
5
- class Vhost < Array
6
-
7
- attr_accessor :priority
8
- attr_accessor :domain
9
- attr_accessor :load_path
10
-
11
- attr_accessor :combos
12
- attr_accessor :libraries
13
-
14
- # Create a new Virtual Host to manage traffic on a Subdomain (Host header)
15
- # Params:
16
- # +pattern+:: The regex pattern used to match this VHost to subdomain(s)
17
- # +priority+:: The priority of the VHost. If multiple VHosts match the subdomain,
18
- # the VHost with the highest priority will be chosen. Default: 50
19
- def initialize pattern, priority=50
20
- @domain = pattern
21
- @priority = priority
22
- @load_path = []
23
- @libdir = "~/.waitress/www/libs"
24
- @liburi = "libraries"
25
-
26
- @libraries = {}
27
- @combos = {}
28
-
29
- @on_request = []
30
- @after_request = []
31
-
32
- enable_waitress_resources
33
- end
34
-
35
- # Register a listener that will be triggered once a request has been received
36
- # by this VHost, but before it has been passed to a listener or served. Use this
37
- # to modify a request before it is handled.
38
- # The Block should take arguments:
39
- # +request+:: The +Waitress::Request+ object
40
- # +vhost+:: The VirtualHost instance
41
- # +client+:: The Client Socket object
42
- def on_request &block
43
- @on_request << block
44
- end
45
-
46
- # Register a listener that will be triggered once a request has been received
47
- # by this VHost, after it has been handled, but before it is served.
48
- # The Block should take arguments:
49
- # +request+:: The +Waitress::Request+ object
50
- # +response+:: The +Waitress::Response+ object
51
- # +vhost+:: The VirtualHost instance
52
- # +client+:: The Client Socket object
53
- def after_request &block
54
- @after_request << block
55
- end
56
-
57
- # Call this to disable the Waitress Handler (Waitress' default CSS, JS, 404 and Index)
58
- def disable_waitress_resources
59
- @resources = false
60
- end
61
-
62
- # Call this to enable the Waitress Handler (Waitress' default CSS, JS, 404 and Index)
63
- def enable_waitress_resources
64
- @resources = true
65
- end
66
-
67
- # Returns true if the VHost has the Waitress Handler enabled (Waitress' default CSS, JS, 404 and Index)
68
- def resources?
69
- @resources
70
- end
71
-
72
- # Change the default 404 page for the VHost. This should be an absolute file path to your 404 page
73
- # file that you wish to use
74
- def set_404 link
75
- @page_404 = link
76
- end
77
-
78
- # Get the absolute file path for the 404 page to use for this VHost. May be nil.
79
- def get_404
80
- @page_404
81
- end
82
-
83
- # Add a Document Root for this VHost. This document root will contain all of your
84
- # public files that can be served by the vhost.
85
- # Params:
86
- # +dir+:: The directory for the Document Root
87
- # +priority+:: The priority for the directory. If multiple Handlers respond to the target
88
- # URI, the one with the highest priority will be chosen. Default: 50
89
- def root dir, priority=50
90
- self << Waitress::DirHandler.new(File.expand_path(dir), priority)
91
- end
92
-
93
- # Internal
94
- def set_configure conf
95
- @configuration = conf
96
- end
97
-
98
- # Set the directory in which Libraries are contained. Libraries are specially handled by
99
- # waitress to be loaded into .wrb files and handlers. Default: "libs/"
100
- # This file will contain your CSS, JS and any other libraries.
101
- def libdir name
102
- @libdir = File.expand_path(name)
103
- end
104
-
105
- # Change the uri that Libraries should be accessed from. Libraries present in the "libs/"
106
- # directory are served from this URI. This URI is relative to the base "/" uri for the VirtualHost,
107
- # for example, a LibUri of "libraries/" (the default) will be accessed by "your.site/libraries/lib_name"
108
- def liburi name=nil
109
- @liburi = name unless name.nil?
110
- @liburi
111
- end
112
-
113
- # Bind a library to a name. By default, when libraries are found in the css/ and js/ folders of your
114
- # lib directory, they are loaded under the lib name of "filename.type", with type being .css or .js.
115
- # By binding a library, you can give this a different name based on the file found by regular expression,
116
- # for example, binding /jquery/ to "jquery" will match any filenames containing 'jquery', meaning the full
117
- # name of 'jquery-ver.sion' is matched, and can be accessed simply by "jquery"
118
- # Params:
119
- # +pattern+:: The regular expression to check files against. This will match the first file it finds with
120
- # the expression to the library.
121
- # +type+:: The type of file. This should be a symbol of either :js or :css, or any other supported lib types
122
- # +name+:: The new name to reference this library by
123
- # +options+:: Any extra options to use when loading the library (to be used in the future)
124
- def bind_lib pattern, type, name, *options
125
- lib = { :pattern => pattern, :bindtype => type, :options => options}
126
- @libraries[name.to_sym] = lib
127
- end
128
-
129
- # Define a combination of libraries. Calling this method will bind all the libaries listed under one common
130
- # name that can be loaded into .wrb files and handlers using combo(). This is used to load a collection of
131
- # libraries simply and easily without repeating lib() methods.
132
- # Params:
133
- # +name+:: The desired name of the combo
134
- # +targets+:: A list of all the libraries to bind to this combo
135
- def combo name, *targets
136
- @combos[name.to_sym] = targets
137
- targets
138
- end
139
-
140
- # Internal
141
- def parse_libraries
142
- self << Waitress::LibraryHandler.new(@libraries, @libdir, @liburi, self)
143
- end
144
-
145
- # Internal (called on Server Start)
146
- def on_server_start srv
147
- parse_libraries
148
- end
149
-
150
- # Used to define the load path for the VHost. The Load Path defines what files can be
151
- # included from outside of the public web directory, such as database backend or
152
- # authentication. These files are not available to the public, but can be included by
153
- # the .wrb files.
154
- # Params:
155
- # +dir+: The directory to use for the loadpath. If a string is provided, it is added,
156
- # however, if an array is provided, it will override with the array.
157
- def includes dir
158
- if dir.is_a? String
159
- load_path << File.expand_path(dir)
160
- elsif dir.is_a? Array
161
- load_path = dir.map { |x| File.expand_path(x) }
162
- end
163
- end
164
-
165
- # Cancel the current request (don't serve the response)
166
- def cancel_request
167
- @cancelled = true
168
- end
169
-
170
- # Define a rewrite rule. A rewrite rule is used to rewrite a URL's path
171
- # before it is handled. Keep in mind that this does not function for a query string,
172
- # which should instead be handled with the on_request event.
173
- # Params;
174
- # +pattern+:: The pattern to match the URL against
175
- # +newpath+:: The new path to replace the matched pattern with. This can include
176
- # capture groups through the use of \\1 (where 1 is the capture group number)
177
- def rewrite pattern, newpath
178
- on_request do |request, vhost|
179
- request.path = request.path.gsub(pattern, newpath)
180
- end
181
- end
182
-
183
- # Internal (matches requests)
184
- def handle_request request, client
185
- @cancelled = false
186
-
187
- response = Waitress::Response.new
188
-
189
- $REQUEST = request
190
- $RESPONSE = response
191
- $VHOST = self
192
-
193
- @on_request.each { |x| x.call(request, self, client) }
194
-
195
- unless @cancelled
196
- match = nil
197
- if @resources && Waitress::DirHandler.resources_handler.respond?(request, self)
198
- match = Waitress::DirHandler.resources_handler
199
- end
200
-
201
- self.each do |handler|
202
- match = handler if handler.respond?(request, self) && (match.nil? || handler.priority > match.priority)
203
- end
204
-
205
- if match.nil?
206
- Waitress::Chef.error 404, request, response, client, self
207
- else
208
- match.serve! request, response, client, self
209
- end
210
- end
211
-
212
- @after_request.each { |x| x.call(request, response, self, client) }
213
- response.serve(client) unless (response.done? || client.closed?)
214
- end
215
-
216
- end
217
- end
1
+ module Waitress
2
+ # The VHost class is responsible for the actions of a Virtual Host, that is
3
+ # reacting to a certain subdomain and handling the requests that are sent to it.
4
+ # The requests are managed through the usage of +Waitress::Handler+ instances.
5
+ class Vhost < Array
6
+
7
+ attr_accessor :priority
8
+ attr_accessor :domain
9
+ attr_accessor :load_path
10
+
11
+ attr_accessor :combos
12
+ attr_accessor :libraries
13
+
14
+ # Create a new Virtual Host to manage traffic on a Subdomain (Host header)
15
+ # Params:
16
+ # +pattern+:: The regex pattern used to match this VHost to subdomain(s)
17
+ # +priority+:: The priority of the VHost. If multiple VHosts match the subdomain,
18
+ # the VHost with the highest priority will be chosen. Default: 50
19
+ def initialize pattern, priority=50
20
+ @domain = pattern
21
+ @priority = priority
22
+ @load_path = []
23
+ @libdir = "~/.waitress/www/libs"
24
+ @liburi = "libraries"
25
+
26
+ @libraries = {}
27
+ @combos = {}
28
+
29
+ @on_request = []
30
+ @after_request = []
31
+
32
+ enable_waitress_resources
33
+ end
34
+
35
+ # Register a listener that will be triggered once a request has been received
36
+ # by this VHost, but before it has been passed to a listener or served. Use this
37
+ # to modify a request before it is handled.
38
+ # The Block should take arguments:
39
+ # +request+:: The +Waitress::Request+ object
40
+ # +vhost+:: The VirtualHost instance
41
+ # +client+:: The Client Socket object
42
+ def on_request &block
43
+ @on_request << block
44
+ end
45
+
46
+ # Register a listener that will be triggered once a request has been received
47
+ # by this VHost, after it has been handled, but before it is served.
48
+ # The Block should take arguments:
49
+ # +request+:: The +Waitress::Request+ object
50
+ # +response+:: The +Waitress::Response+ object
51
+ # +vhost+:: The VirtualHost instance
52
+ # +client+:: The Client Socket object
53
+ def after_request &block
54
+ @after_request << block
55
+ end
56
+
57
+ # Call this to disable the Waitress Handler (Waitress' default CSS, JS, 404 and Index)
58
+ def disable_waitress_resources
59
+ @resources = false
60
+ end
61
+
62
+ # Call this to enable the Waitress Handler (Waitress' default CSS, JS, 404 and Index)
63
+ def enable_waitress_resources
64
+ @resources = true
65
+ end
66
+
67
+ # Returns true if the VHost has the Waitress Handler enabled (Waitress' default CSS, JS, 404 and Index)
68
+ def resources?
69
+ @resources
70
+ end
71
+
72
+ # Change the default 404 page for the VHost. This should be an absolute file path to your 404 page
73
+ # file that you wish to use
74
+ def set_404 link
75
+ @page_404 = link
76
+ end
77
+
78
+ # Get the absolute file path for the 404 page to use for this VHost. May be nil.
79
+ def get_404
80
+ @page_404
81
+ end
82
+
83
+ # Add a Document Root for this VHost. This document root will contain all of your
84
+ # public files that can be served by the vhost.
85
+ # Params:
86
+ # +dir+:: The directory for the Document Root
87
+ # +priority+:: The priority for the directory. If multiple Handlers respond to the target
88
+ # URI, the one with the highest priority will be chosen. Default: 50
89
+ def root dir, priority=50
90
+ self << Waitress::DirHandler.new(File.expand_path(dir), priority)
91
+ end
92
+
93
+ # Internal
94
+ def set_configure conf
95
+ @configuration = conf
96
+ end
97
+
98
+ # Set the directory in which Libraries are contained. Libraries are specially handled by
99
+ # waitress to be loaded into .wrb files and handlers. Default: "libs/"
100
+ # This file will contain your CSS, JS and any other libraries.
101
+ def libdir name
102
+ @libdir = File.expand_path(name)
103
+ end
104
+
105
+ # Change the uri that Libraries should be accessed from. Libraries present in the "libs/"
106
+ # directory are served from this URI. This URI is relative to the base "/" uri for the VirtualHost,
107
+ # for example, a LibUri of "libraries/" (the default) will be accessed by "your.site/libraries/lib_name"
108
+ def liburi name=nil
109
+ @liburi = name unless name.nil?
110
+ @liburi
111
+ end
112
+
113
+ # Bind a library to a name. By default, when libraries are found in the css/ and js/ folders of your
114
+ # lib directory, they are loaded under the lib name of "filename.type", with type being .css or .js.
115
+ # By binding a library, you can give this a different name based on the file found by regular expression,
116
+ # for example, binding /jquery/ to "jquery" will match any filenames containing 'jquery', meaning the full
117
+ # name of 'jquery-ver.sion' is matched, and can be accessed simply by "jquery"
118
+ # Params:
119
+ # +pattern+:: The regular expression to check files against. This will match the first file it finds with
120
+ # the expression to the library.
121
+ # +type+:: The type of file. This should be a symbol of either :js or :css, or any other supported lib types
122
+ # +name+:: The new name to reference this library by
123
+ # +options+:: Any extra options to use when loading the library (to be used in the future)
124
+ def bind_lib pattern, type, name, *options
125
+ lib = { :pattern => pattern, :bindtype => type, :options => options}
126
+ @libraries[name.to_sym] = lib
127
+ end
128
+
129
+ # Define a combination of libraries. Calling this method will bind all the libaries listed under one common
130
+ # name that can be loaded into .wrb files and handlers using combo(). This is used to load a collection of
131
+ # libraries simply and easily without repeating lib() methods.
132
+ # Params:
133
+ # +name+:: The desired name of the combo
134
+ # +targets+:: A list of all the libraries to bind to this combo
135
+ def combo name, *targets
136
+ @combos[name.to_sym] = targets
137
+ targets
138
+ end
139
+
140
+ # Internal
141
+ def parse_libraries
142
+ self << Waitress::LibraryHandler.new(@libraries, @libdir, @liburi, self)
143
+ end
144
+
145
+ # Internal (called on Server Start)
146
+ def on_server_start srv
147
+ parse_libraries
148
+ end
149
+
150
+ # Used to define the load path for the VHost. The Load Path defines what files can be
151
+ # included from outside of the public web directory, such as database backend or
152
+ # authentication. These files are not available to the public, but can be included by
153
+ # the .wrb files.
154
+ # Params:
155
+ # +dir+: The directory to use for the loadpath. If a string is provided, it is added,
156
+ # however, if an array is provided, it will override with the array.
157
+ def includes dir
158
+ if dir.is_a? String
159
+ load_path << File.expand_path(dir)
160
+ elsif dir.is_a? Array
161
+ load_path = dir.map { |x| File.expand_path(x) }
162
+ end
163
+ end
164
+
165
+ # Cancel the current request (don't serve the response)
166
+ def cancel_request
167
+ @cancelled = true
168
+ end
169
+
170
+ # Define a rewrite rule. A rewrite rule is used to rewrite a URL's path
171
+ # before it is handled. Keep in mind that this does not function for a query string,
172
+ # which should instead be handled with the on_request event.
173
+ # Params;
174
+ # +pattern+:: The pattern to match the URL against
175
+ # +newpath+:: The new path to replace the matched pattern with. This can include
176
+ # capture groups through the use of \\1 (where 1 is the capture group number)
177
+ def rewrite pattern, newpath
178
+ on_request do |request, vhost|
179
+ request.path = request.path.gsub(pattern, newpath)
180
+ end
181
+ end
182
+
183
+ # Internal (matches requests)
184
+ def handle_request request, client
185
+ @cancelled = false
186
+
187
+ response = Waitress::Response.new
188
+
189
+ $REQUEST = request
190
+ $RESPONSE = response
191
+ $VHOST = self
192
+
193
+ @on_request.each { |x| x.call(request, self, client) }
194
+
195
+ unless @cancelled
196
+ match = nil
197
+ if @resources && Waitress::DirHandler.resources_handler.respond?(request, self)
198
+ match = Waitress::DirHandler.resources_handler
199
+ end
200
+
201
+ self.each do |handler|
202
+ match = handler if handler.respond?(request, self) && (match.nil? || handler.priority > match.priority)
203
+ end
204
+
205
+ if match.nil?
206
+ Waitress::Chef.error 404, request, response, client, self
207
+ else
208
+ match.serve! request, response, client, self
209
+ end
210
+ end
211
+
212
+ @after_request.each { |x| x.call(request, response, self, client) }
213
+ response.serve(client) unless (response.done? || client.closed?)
214
+ end
215
+
216
+ end
217
+ end
data/lib/waitress.rb CHANGED
@@ -1,106 +1,99 @@
1
- require 'waitress/version'
2
- require 'waitress/util'
3
- require 'waitress/kernel'
4
- require 'waitress/configure'
5
- require 'waitress/parse/query'
6
-
7
- require 'waitress/server'
8
- require 'waitress/request'
9
- require 'waitress/response'
10
-
11
- require 'waitress/vhost'
12
- require 'waitress/handlers/handler'
13
- require 'waitress/handlers/dirhandler'
14
- require 'waitress/handlers/handler404'
15
- require 'waitress/handlers/libhandler'
16
- require 'waitress/chef'
17
- require 'waitress/evalbind'
18
-
19
- require 'waitress_http11'
20
-
21
- require 'go'
22
- require 'configfile'
23
- require 'fileutils'
24
-
25
- # The Base module for the Waitress Web Server, containing all the required
26
- # classes and utilities created by Waitress
27
- module Waitress
28
-
29
- SERVERS = []
30
-
31
- at_exit do
32
- SERVERS.each { |x| x.killall }
33
- exit
34
- end
35
-
36
- # Create a new Waitress Server, or, in case of the Filesystem, create a Configuration
37
- # for a set of Servers
38
- # Params:
39
- # +filesystem+:: True if waitress should be loaded from the Filesystem. Default: false
40
- # +rootdir+:: The root directory to load waitress from, defaults to ~/.waitress
41
- def self.serve! filesystem=false, rootdir=:default
42
- waitress = Waitress.new
43
- waitress.serve! filesystem, rootdir
44
- end
45
-
46
- # Create a configuration for a single Waitress Server instance. This should be called
47
- # from the config.rb file and nowhere else.
48
- # Params:
49
- # +args+:: The arguments to configure with. This should be a variable amount of arguments
50
- # representing what ports to run the server on. If no args are provided, port 80 will
51
- # be used as a default
52
- # +block+:: The block to call once the configuration has been created. Setup should be
53
- # done in here
54
- def self.configure! *args, &block
55
- Waitress::Configure.configure! *args, &block
56
- end
57
-
58
- # Create a new Launch Instance, used to serve a simple Waitress Server from either the
59
- # filesystem, or embedded.
60
- def self.new *args
61
- Waitress::Launcher.new *args
62
- end
63
-
64
- class Launcher
65
-
66
- # Create a new launcher. This is responsible for creating Waitress server instances
67
- # from either the Filesystem, or being embedded in an application
68
- def initialize waitress_root="~/.waitress"
69
- @waitress_root = File.expand_path waitress_root
70
- end
71
-
72
- # Serve a Waitress server from either the Filesystem or embedded in an application
73
- def serve! filesystem=false, rootdir=:default
74
- if filesystem
75
- serve_filesystem rootdir
76
- else
77
- serve
78
- end
79
- end
80
-
81
- :private
82
- def config
83
- ConfigFile.new File.join(@waitress_root, "config.yml"),
84
- {"server_root" => File.join(@waitress_root, "www")}, :yaml
85
- end
86
-
87
- def serve_filesystem rootdir
88
- if rootdir == :default
89
- FileUtils.mkdir_p @waitress_root unless File.exist? @waitress_root
90
- cfg = config
91
- cfg.load
92
- @root = File.expand_path cfg["server_root"]
93
- else
94
- @root = rootdir
95
- end
96
- # s = serve
97
- # Waitress::Configure.new s, @root
98
- # s
99
- Waitress::Configure.new @root
100
- end
101
-
102
- def serve
103
- Waitress::HttpServer.new
104
- end
105
- end
106
- end
1
+ require 'waitress/version'
2
+ require 'waitress/util'
3
+ require 'waitress/kernel'
4
+ require 'waitress/configure'
5
+ require 'waitress/parse/query'
6
+
7
+ require 'waitress/server'
8
+ require 'waitress/request'
9
+ require 'waitress/response'
10
+
11
+ require 'waitress/vhost'
12
+ require 'waitress/handlers/handler'
13
+ require 'waitress/handlers/dirhandler'
14
+ require 'waitress/handlers/handler404'
15
+ require 'waitress/handlers/libhandler'
16
+ require 'waitress/chef'
17
+ require 'waitress/evalbind'
18
+
19
+ require 'waitress_http11'
20
+
21
+ require 'go'
22
+ require 'configfile'
23
+ require 'fileutils'
24
+
25
+ # The Base module for the Waitress Web Server, containing all the required
26
+ # classes and utilities created by Waitress
27
+ module Waitress
28
+
29
+ # Create a new Waitress Server, or, in case of the Filesystem, create a Configuration
30
+ # for a set of Servers
31
+ # Params:
32
+ # +filesystem+:: True if waitress should be loaded from the Filesystem. Default: false
33
+ # +rootdir+:: The root directory to load waitress from, defaults to ~/.waitress
34
+ def self.serve! filesystem=false, rootdir=:default
35
+ waitress = Waitress.new
36
+ waitress.serve! filesystem, rootdir
37
+ end
38
+
39
+ # Create a configuration for a single Waitress Server instance. This should be called
40
+ # from the config.rb file and nowhere else.
41
+ # Params:
42
+ # +args+:: The arguments to configure with. This should be a variable amount of arguments
43
+ # representing what ports to run the server on. If no args are provided, port 80 will
44
+ # be used as a default
45
+ # +block+:: The block to call once the configuration has been created. Setup should be
46
+ # done in here
47
+ def self.configure! *args, &block
48
+ Waitress::Configure.configure! *args, &block
49
+ end
50
+
51
+ # Create a new Launch Instance, used to serve a simple Waitress Server from either the
52
+ # filesystem, or embedded.
53
+ def self.new *args
54
+ Waitress::Launcher.new *args
55
+ end
56
+
57
+ class Launcher
58
+
59
+ # Create a new launcher. This is responsible for creating Waitress server instances
60
+ # from either the Filesystem, or being embedded in an application
61
+ def initialize waitress_root="~/.waitress"
62
+ @waitress_root = File.expand_path waitress_root
63
+ end
64
+
65
+ # Serve a Waitress server from either the Filesystem or embedded in an application
66
+ def serve! filesystem=false, rootdir=:default
67
+ if filesystem
68
+ serve_filesystem rootdir
69
+ else
70
+ serve
71
+ end
72
+ end
73
+
74
+ :private
75
+ def config
76
+ ConfigFile.new File.join(@waitress_root, "config.yml"),
77
+ {"server_root" => File.join(@waitress_root, "www")}, :yaml
78
+ end
79
+
80
+ def serve_filesystem rootdir
81
+ if rootdir == :default
82
+ FileUtils.mkdir_p @waitress_root unless File.exist? @waitress_root
83
+ cfg = config
84
+ cfg.load
85
+ @root = File.expand_path cfg["server_root"]
86
+ else
87
+ @root = rootdir
88
+ end
89
+ # s = serve
90
+ # Waitress::Configure.new s, @root
91
+ # s
92
+ Waitress::Configure.new @root
93
+ end
94
+
95
+ def serve
96
+ Waitress::HttpServer.new
97
+ end
98
+ end
99
+ end
Binary file