mongrel 0.3.5 → 0.3.6
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.
- data/README +4 -3
- data/Rakefile +7 -5
- data/bin/mongrel_rails +5 -4
- data/bin/mongrel_rails_service +237 -0
- data/bin/mongrel_rails_svc +194 -0
- data/doc/rdoc/classes/Mongrel.html +1 -4
- data/doc/rdoc/classes/Mongrel/Const.html +13 -3
- data/doc/rdoc/classes/Mongrel/HeaderOut.html +10 -10
- data/doc/rdoc/classes/Mongrel/HeaderOut.src/{M000033.html → M000028.html} +4 -4
- data/doc/rdoc/classes/Mongrel/HeaderOut.src/{M000034.html → M000029.html} +7 -7
- data/doc/rdoc/classes/Mongrel/HttpRequest.html +5 -5
- data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000041.html +39 -0
- data/doc/rdoc/classes/Mongrel/HttpResponse.html +36 -36
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000034.html +21 -0
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/{M000041.html → M000035.html} +6 -6
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/{M000042.html → M000036.html} +5 -5
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/{M000043.html → M000037.html} +5 -5
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/{M000044.html → M000038.html} +6 -6
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/{M000045.html → M000039.html} +6 -6
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000040.html +7 -8
- data/doc/rdoc/classes/Mongrel/HttpServer.html +47 -28
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000022.html +33 -0
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000023.html +57 -0
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000024.html +46 -0
- data/doc/rdoc/classes/Mongrel/HttpServer.src/{M000031.html → M000025.html} +4 -4
- data/doc/rdoc/classes/Mongrel/HttpServer.src/{M000032.html → M000026.html} +4 -4
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000027.html +19 -0
- data/doc/rdoc/classes/Mongrel/{HttpHandler.html → StopServer.html} +4 -33
- data/doc/rdoc/classes/Mongrel/URIClassifier.html +22 -23
- data/doc/rdoc/classes/Mongrel/URIClassifier.src/{M000035.html → M000030.html} +0 -0
- data/doc/rdoc/classes/Mongrel/URIClassifier.src/{M000036.html → M000031.html} +0 -0
- data/doc/rdoc/classes/Mongrel/URIClassifier.src/{M000037.html → M000032.html} +0 -0
- data/doc/rdoc/classes/Mongrel/URIClassifier.src/{M000038.html → M000033.html} +0 -0
- data/doc/rdoc/created.rid +1 -1
- data/doc/rdoc/files/README.html +9 -7
- data/doc/rdoc/files/lib/mongrel_rb.html +3 -3
- data/doc/rdoc/fr_class_index.html +1 -4
- data/doc/rdoc/fr_method_index.html +20 -37
- data/examples/mongrel_simple_ctrl.rb +92 -0
- data/examples/mongrel_simple_service.rb +116 -0
- data/examples/simpletest.rb +3 -1
- data/ext/http11/http11_parser.c +176 -263
- data/lib/mongrel.rb +56 -343
- data/lib/mongrel/cgi.rb +147 -0
- data/lib/mongrel/handlers.rb +180 -0
- metadata +28 -46
- data/doc/rdoc/classes/Mongrel/CGIWrapper.html +0 -346
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000047.html +0 -24
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000048.html +0 -48
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000049.html +0 -34
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000050.html +0 -27
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000051.html +0 -26
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000052.html +0 -18
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000053.html +0 -18
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000054.html +0 -18
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000055.html +0 -19
- data/doc/rdoc/classes/Mongrel/DirHandler.html +0 -283
- data/doc/rdoc/classes/Mongrel/DirHandler.src/M000022.html +0 -20
- data/doc/rdoc/classes/Mongrel/DirHandler.src/M000023.html +0 -42
- data/doc/rdoc/classes/Mongrel/DirHandler.src/M000024.html +0 -40
- data/doc/rdoc/classes/Mongrel/DirHandler.src/M000025.html +0 -31
- data/doc/rdoc/classes/Mongrel/DirHandler.src/M000026.html +0 -38
- data/doc/rdoc/classes/Mongrel/DirHandler.src/M000027.html +0 -18
- data/doc/rdoc/classes/Mongrel/Error404Handler.html +0 -171
- data/doc/rdoc/classes/Mongrel/Error404Handler.src/M000056.html +0 -18
- data/doc/rdoc/classes/Mongrel/Error404Handler.src/M000057.html +0 -18
- data/doc/rdoc/classes/Mongrel/HttpHandler.src/M000039.html +0 -17
- data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000058.html +0 -31
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000046.html +0 -20
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000028.html +0 -38
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000029.html +0 -64
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000030.html +0 -23
data/README
CHANGED
|
@@ -11,9 +11,10 @@ scream without too many portability issues.
|
|
|
11
11
|
|
|
12
12
|
== Status
|
|
13
13
|
|
|
14
|
-
The 0.3.
|
|
15
|
-
sports the beginning of a command and plugin infrastructure.
|
|
16
|
-
|
|
14
|
+
The 0.3.6 release supports Ruby On Rails much better than previously, and also
|
|
15
|
+
sports the beginning of a command and plugin infrastructure. There is now a more
|
|
16
|
+
complete CGIWrapper that handles most of the CGI usage, but still doesn't do the
|
|
17
|
+
MIME decoding or file upload/send (it leaves that to CGI).
|
|
17
18
|
|
|
18
19
|
After you've installed (either with gem install mongrel or via source) you should
|
|
19
20
|
have the mongrel_rails command available in your PATH. Then you just do the following:
|
data/Rakefile
CHANGED
|
@@ -30,22 +30,24 @@ end
|
|
|
30
30
|
|
|
31
31
|
setup_extension("http11", "http11")
|
|
32
32
|
|
|
33
|
-
version="0.3.
|
|
33
|
+
version="0.3.6"
|
|
34
34
|
summary = "A small fast HTTP library and server that runs Rails, Camping, and Nitro apps."
|
|
35
35
|
test_file = "test/test_ws.rb"
|
|
36
36
|
author="Zed A. Shaw"
|
|
37
37
|
name="mongrel"
|
|
38
|
+
scripts=['mongrel_rails']
|
|
38
39
|
|
|
39
|
-
setup_gem(name, version, author, summary,
|
|
40
|
+
setup_gem(name, version, author, summary, scripts, test_file) do |spec|
|
|
40
41
|
spec.add_dependency('daemons', '>= 0.4.2')
|
|
41
42
|
end
|
|
42
43
|
|
|
43
44
|
desc "Build a binary gem for Win32"
|
|
44
|
-
task :win32_gem => [:clean, :compile, :test, :package_win32]
|
|
45
|
+
task :win32_gem => [:clean, :compile, :test, :rerdoc, :package_win32]
|
|
45
46
|
|
|
47
|
+
scripts_win32 = scripts + ['mongrel_rails_service','mongrel_rails_svc']
|
|
46
48
|
task :package_win32 do
|
|
47
|
-
setup_win32_gem(name, version, version, summary,
|
|
48
|
-
spec.add_dependency('
|
|
49
|
+
setup_win32_gem(name, version, version, summary, scripts_win32, test_file) do |spec|
|
|
50
|
+
spec.add_dependency('win32-service', '>= 0.5.0')
|
|
49
51
|
spec.files << 'ext/http11/http11.so'
|
|
50
52
|
spec.extensions = []
|
|
51
53
|
spec.platform = Gem::Platform::WIN32
|
data/bin/mongrel_rails
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
require 'rubygems'
|
|
2
2
|
require 'mongrel'
|
|
3
|
-
require 'daemons/daemonize'
|
|
4
3
|
require 'mongrel/command'
|
|
5
4
|
|
|
6
5
|
|
|
@@ -77,7 +76,9 @@ class StartCommand < Mongrel::Command::Command
|
|
|
77
76
|
|
|
78
77
|
def daemonize
|
|
79
78
|
# save this for later since daemonize will hose it
|
|
80
|
-
if @daemon
|
|
79
|
+
if @daemon and RUBY_PLATFORM !~ /mswin/
|
|
80
|
+
require 'daemons/daemonize'
|
|
81
|
+
|
|
81
82
|
puts "Started Mongrel server in #@environment mode at #@address:#@port"
|
|
82
83
|
Daemonize.daemonize(log_file=File.join(@cwd, @log_file))
|
|
83
84
|
|
|
@@ -120,12 +121,14 @@ class StartCommand < Mongrel::Command::Command
|
|
|
120
121
|
server = Mongrel::HttpServer.new(@address, @port, @num_procs.to_i, @timeout.to_i)
|
|
121
122
|
server.register("/", rails)
|
|
122
123
|
server.run
|
|
124
|
+
trap("INT") { server.stop }
|
|
123
125
|
|
|
124
126
|
begin
|
|
125
127
|
puts "Server ready."
|
|
126
128
|
server.acceptor.join
|
|
127
129
|
rescue Interrupt
|
|
128
130
|
puts "Interrupted."
|
|
131
|
+
raise
|
|
129
132
|
end
|
|
130
133
|
end
|
|
131
134
|
|
|
@@ -173,6 +176,4 @@ class StopCommand < Mongrel::Command::Command
|
|
|
173
176
|
end
|
|
174
177
|
|
|
175
178
|
|
|
176
|
-
|
|
177
|
-
|
|
178
179
|
Mongrel::Command::Registry.instance.run ARGV
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
###############################################
|
|
2
|
+
# mongrel_rails_service
|
|
3
|
+
#
|
|
4
|
+
# Control script for Rails powered by Mongrel
|
|
5
|
+
#
|
|
6
|
+
# WARNING: stop command still doesn't work with rails!
|
|
7
|
+
###############################################
|
|
8
|
+
require 'rubygems'
|
|
9
|
+
require 'mongrel'
|
|
10
|
+
require 'mongrel/command'
|
|
11
|
+
|
|
12
|
+
require 'win32/service'
|
|
13
|
+
include Win32
|
|
14
|
+
|
|
15
|
+
module GenericCommand
|
|
16
|
+
def configure
|
|
17
|
+
options [
|
|
18
|
+
['-n', '--name SVC_NAME', "Required name for the service to be registered/installed.", :@svc_name, nil],
|
|
19
|
+
]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def validate
|
|
23
|
+
valid? @svc_name != nil, "You must specify the service name to be uninstalled."
|
|
24
|
+
|
|
25
|
+
# We should validate service existance here, right Zed?
|
|
26
|
+
begin
|
|
27
|
+
valid? Service.exists?(@svc_name), "There is no service with that name, cannot proceed."
|
|
28
|
+
rescue
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
return @valid
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
class InstallCommand < Mongrel::Command::Command
|
|
36
|
+
|
|
37
|
+
# Default every option to nil so only the defined ones get passed to service
|
|
38
|
+
# (which will override ServiceCommand defaults).
|
|
39
|
+
def configure
|
|
40
|
+
options [
|
|
41
|
+
['-n', '--name SVC_NAME', "Required name for the service to be registered/installed.", :@svc_name, nil],
|
|
42
|
+
['-d', '--display SVC_DISPLAY', "Adjust the display name of the service.", :@svc_display, nil],
|
|
43
|
+
['-r', '--root PATH', "Set the root path where your rails app resides.", :@rails_root, Dir.pwd],
|
|
44
|
+
['-e', '--environment ENV', "Rails environment to run as", :@environment, 'production'],
|
|
45
|
+
['-b', '--binding ADDR', "Address to bind to", :@ip, nil],
|
|
46
|
+
['-p', '--port PORT', "Which port to bind to", :@port, 3000],
|
|
47
|
+
['-m', '--mime PATH', "A YAML file that lists additional MIME types", :@mime_map, nil],
|
|
48
|
+
['-P', '--num-procs INT', "Number of processor threads to use", :@num_procs, nil],
|
|
49
|
+
['-t', '--timeout SECONDS', "Timeout all requests after SECONDS time", :@timeout, nil],
|
|
50
|
+
]
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# When we validate the options, we need to make sure the --root is actually RAILS_ROOT
|
|
54
|
+
# of the rails application we wanted to serve, because later "as service" no error
|
|
55
|
+
# show to trace this.
|
|
56
|
+
def validate
|
|
57
|
+
@rails_root = File.expand_path(@rails_root)
|
|
58
|
+
|
|
59
|
+
# start with the premise of app really exist.
|
|
60
|
+
app_exist = true
|
|
61
|
+
paths = %w{app config db log public}
|
|
62
|
+
paths.each do |path|
|
|
63
|
+
if !File.directory?(@rails_root + '/' + path)
|
|
64
|
+
app_exist = false
|
|
65
|
+
break
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
valid? @svc_name != nil, "You must specify a valid service name to install."
|
|
70
|
+
valid? app_exist == true, "The root of rails app isn't valid, please verify."
|
|
71
|
+
valid_exists? @mime_map, "MIME mapping file does not exist: #@mime_map" if @mime_map
|
|
72
|
+
|
|
73
|
+
# We should validate service existance here, right Zed?
|
|
74
|
+
begin
|
|
75
|
+
valid? !Service.exists?(@svc_name), "The service already exist, please uninstall it first."
|
|
76
|
+
rescue
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Expand to get full path for mime-types file
|
|
80
|
+
@mime_map = File.Expand_path(@mime_map) if @mime_map
|
|
81
|
+
|
|
82
|
+
# default service display to service name
|
|
83
|
+
@svc_display = @svc_name if !@svc_display
|
|
84
|
+
|
|
85
|
+
return @valid
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def build_params
|
|
89
|
+
# build the parameters that will be used when register/install the service
|
|
90
|
+
@params = ""
|
|
91
|
+
|
|
92
|
+
# add "service" command
|
|
93
|
+
@params << "service "
|
|
94
|
+
|
|
95
|
+
# rails_root, must be quoted to support long_names
|
|
96
|
+
@params << "-r \"#{@rails_root}\" "
|
|
97
|
+
|
|
98
|
+
# environment
|
|
99
|
+
@params << "-e #{@environment} " if @environment
|
|
100
|
+
|
|
101
|
+
# binding
|
|
102
|
+
@params << "-b #{@ip} " if @ip
|
|
103
|
+
|
|
104
|
+
# port
|
|
105
|
+
@params << "-p #{@port.to_i} " if @port
|
|
106
|
+
|
|
107
|
+
# mime
|
|
108
|
+
@params << "-m #{@mime_map} " if @mime_map
|
|
109
|
+
|
|
110
|
+
# num_procs
|
|
111
|
+
@params << "-P #{@num_procs.to_i} " if @num_procs
|
|
112
|
+
|
|
113
|
+
# timeout
|
|
114
|
+
@params << "-t #{@timeout.to_i} " if @timeout
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def install_service
|
|
118
|
+
# use rbconfig to get the path to bin ruby.exe
|
|
119
|
+
require 'rbconfig'
|
|
120
|
+
|
|
121
|
+
# ruby.exe instead of rubyw.exe due a exception raised when stoping the service!
|
|
122
|
+
binary_path = ""
|
|
123
|
+
binary_path << '"' << Config::CONFIG['bindir'] << '/ruby.exe' << '" '
|
|
124
|
+
|
|
125
|
+
# add service_script
|
|
126
|
+
service_script = File.expand_path(File.dirname(__FILE__) + '/mongrel_rails_svc')
|
|
127
|
+
binary_path << '"' << service_script << '" '
|
|
128
|
+
|
|
129
|
+
# now add the parameters to it.
|
|
130
|
+
binary_path << @params
|
|
131
|
+
|
|
132
|
+
puts "Installing service with these options:"
|
|
133
|
+
puts "service name: " << @svc_name
|
|
134
|
+
puts "service display: " << @svc_display
|
|
135
|
+
|
|
136
|
+
puts "RAILS_ROOT: " << @rails_root
|
|
137
|
+
puts "RAILS_ENV: " << @environment if @environment
|
|
138
|
+
puts "binding: " << @ip if @ip
|
|
139
|
+
puts "port: " << @port.to_s if @port
|
|
140
|
+
|
|
141
|
+
puts "mime_map: " << @mime_map if @mime_map
|
|
142
|
+
puts "num_procs: " << @num_procs.to_s if @num_procs
|
|
143
|
+
puts "timeout: " << @timeout.to_s if @timeout
|
|
144
|
+
|
|
145
|
+
puts "ruby.exe: " << Config::CONFIG['bindir'] << '/ruby.exe'
|
|
146
|
+
puts "service script: " << service_script
|
|
147
|
+
puts
|
|
148
|
+
|
|
149
|
+
svc = Service.new
|
|
150
|
+
begin
|
|
151
|
+
svc.create_service{ |s|
|
|
152
|
+
s.service_name = @svc_name
|
|
153
|
+
s.display_name = @svc_display
|
|
154
|
+
s.binary_path_name = binary_path
|
|
155
|
+
s.dependencies = []
|
|
156
|
+
}
|
|
157
|
+
puts "#{@svc_display} service installed."
|
|
158
|
+
rescue ServiceError => err
|
|
159
|
+
puts "There was a problem installing the service:"
|
|
160
|
+
puts err
|
|
161
|
+
end
|
|
162
|
+
svc.close
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def run
|
|
166
|
+
build_params
|
|
167
|
+
install_service
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
class DeleteCommand < Mongrel::Command::Command
|
|
172
|
+
include GenericCommand
|
|
173
|
+
|
|
174
|
+
def run
|
|
175
|
+
display_name = Service.getdisplayname(@svc_name)
|
|
176
|
+
|
|
177
|
+
begin
|
|
178
|
+
Service.stop(@svc_name)
|
|
179
|
+
rescue
|
|
180
|
+
end
|
|
181
|
+
begin
|
|
182
|
+
Service.delete(@svc_name)
|
|
183
|
+
rescue
|
|
184
|
+
end
|
|
185
|
+
puts "#{display_name} service deleted."
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
class StartCommand < Mongrel::Command::Command
|
|
190
|
+
include GenericCommand
|
|
191
|
+
|
|
192
|
+
def run
|
|
193
|
+
display_name = Service.getdisplayname(@svc_name)
|
|
194
|
+
|
|
195
|
+
begin
|
|
196
|
+
Service.start(@svc_name)
|
|
197
|
+
started = false
|
|
198
|
+
while started == false
|
|
199
|
+
s = Service.status(@svc_name)
|
|
200
|
+
started = true if s.current_state == "running"
|
|
201
|
+
break if started == true
|
|
202
|
+
puts "One moment, " + s.current_state
|
|
203
|
+
sleep 1
|
|
204
|
+
end
|
|
205
|
+
puts "#{display_name} service started"
|
|
206
|
+
rescue ServiceError => err
|
|
207
|
+
puts "There was a problem starting the service:"
|
|
208
|
+
puts err
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
class StopCommand < Mongrel::Command::Command
|
|
214
|
+
include GenericCommand
|
|
215
|
+
|
|
216
|
+
def run
|
|
217
|
+
display_name = Service.getdisplayname(@svc_name)
|
|
218
|
+
|
|
219
|
+
begin
|
|
220
|
+
Service.stop(@svc_name)
|
|
221
|
+
stopped = false
|
|
222
|
+
while stopped == false
|
|
223
|
+
s = Service.status(@svc_name)
|
|
224
|
+
stopped = true if s.current_state == "stopped"
|
|
225
|
+
break if stopped == true
|
|
226
|
+
puts "One moment, " + s.current_state
|
|
227
|
+
sleep 1
|
|
228
|
+
end
|
|
229
|
+
puts "#{display_name} service stopped"
|
|
230
|
+
rescue ServiceError => err
|
|
231
|
+
puts "There was a problem stopping the service:"
|
|
232
|
+
puts err
|
|
233
|
+
end
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
Mongrel::Command::Registry.instance.run ARGV
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
###############################################
|
|
2
|
+
# mongrel_rails_svc
|
|
3
|
+
#
|
|
4
|
+
# This is where Win32::Daemon resides.
|
|
5
|
+
###############################################
|
|
6
|
+
require 'rubygems'
|
|
7
|
+
require 'mongrel'
|
|
8
|
+
|
|
9
|
+
require 'optparse'
|
|
10
|
+
|
|
11
|
+
require 'win32/service'
|
|
12
|
+
|
|
13
|
+
DEBUG_LOG_FILE = File.expand_path(File.dirname(__FILE__) + '/debug.log')
|
|
14
|
+
#STDERR.reopen(DEBUG_LOG_FILE)
|
|
15
|
+
|
|
16
|
+
# There are need for SimpleHandler
|
|
17
|
+
require 'yaml'
|
|
18
|
+
require 'zlib'
|
|
19
|
+
|
|
20
|
+
class RailsHandler < Mongrel::HttpHandler
|
|
21
|
+
|
|
22
|
+
def initialize(dir, mime_map = {})
|
|
23
|
+
@files = Mongrel::DirHandler.new(dir,false)
|
|
24
|
+
@guard = Mutex.new
|
|
25
|
+
|
|
26
|
+
# register the requested mime types
|
|
27
|
+
mime_map.each {|k,v| Mongrel::DirHandler::add_mime_type(k,v) }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def process(request, response)
|
|
31
|
+
# not static, need to talk to rails
|
|
32
|
+
return if response.socket.closed?
|
|
33
|
+
|
|
34
|
+
if @files.can_serve(request.params["PATH_INFO"])
|
|
35
|
+
@files.process(request,response)
|
|
36
|
+
else
|
|
37
|
+
cgi = Mongrel::CGIWrapper.new(request, response)
|
|
38
|
+
|
|
39
|
+
begin
|
|
40
|
+
@guard.synchronize do
|
|
41
|
+
# Rails is not thread safe so must be run entirely within synchronize
|
|
42
|
+
Dispatcher.dispatch(cgi, ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS, response.body)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# This finalizes the output using the proper HttpResponse way
|
|
46
|
+
cgi.out {""}
|
|
47
|
+
rescue Object => rails_error
|
|
48
|
+
STDERR.puts "calling Dispatcher.dispatch #{rails_error}"
|
|
49
|
+
STDERR.puts rails_error.backtrace.join("\n")
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
class SimpleHandler < Mongrel::HttpHandler
|
|
57
|
+
def process(request, response)
|
|
58
|
+
response.start do |head,out|
|
|
59
|
+
head["Content-Type"] = "text/html"
|
|
60
|
+
results = "<html><body>Your request:<br /><pre>#{request.params.to_yaml}</pre><a href=\"/files\">View the files.</a></body></html>"
|
|
61
|
+
if request.params["HTTP_ACCEPT_ENCODING"] == "gzip,deflate"
|
|
62
|
+
head["Content-Encoding"] = "deflate"
|
|
63
|
+
# send it back deflated
|
|
64
|
+
out << Zlib::Deflate.deflate(results)
|
|
65
|
+
else
|
|
66
|
+
# no gzip supported, send it back normal
|
|
67
|
+
out << results
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
class RailsDaemon < Win32::Daemon
|
|
74
|
+
def initialize(ip, port, rails_root, docroot, environment, mime_map, num_procs, timeout)
|
|
75
|
+
File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - daemon_initialize entered") }
|
|
76
|
+
|
|
77
|
+
@ip = ip
|
|
78
|
+
@port = port
|
|
79
|
+
@rails_root = rails_root
|
|
80
|
+
@docroot = docroot
|
|
81
|
+
@environment = environment
|
|
82
|
+
@mime_map = mime_map
|
|
83
|
+
@num_procs = num_procs
|
|
84
|
+
@timeout = timeout
|
|
85
|
+
|
|
86
|
+
File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - daemon_initialize left") }
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def load_mime_map
|
|
90
|
+
File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - load_mime_map entered") }
|
|
91
|
+
|
|
92
|
+
mime = {}
|
|
93
|
+
|
|
94
|
+
# configure any requested mime map
|
|
95
|
+
if @mime_map
|
|
96
|
+
puts "Loading additional MIME types from #@mime_map"
|
|
97
|
+
mime.merge!(YAML.load_file(@mime_map))
|
|
98
|
+
|
|
99
|
+
# check all the mime types to make sure they are the right format
|
|
100
|
+
mime.each {|k,v| puts "WARNING: MIME type #{k} must start with '.'" if k.index(".") != 0 }
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - load_mime_map left") }
|
|
104
|
+
|
|
105
|
+
return mime
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def configure_rails
|
|
109
|
+
File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - configure_rails entered") }
|
|
110
|
+
|
|
111
|
+
Dir.chdir(@rails_root)
|
|
112
|
+
|
|
113
|
+
ENV['RAILS_ENV'] = @environment
|
|
114
|
+
require File.join(@rails_root, 'config/environment')
|
|
115
|
+
|
|
116
|
+
# configure the rails handler
|
|
117
|
+
rails = RailsHandler.new(@docroot, load_mime_map)
|
|
118
|
+
|
|
119
|
+
File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - configure_rails left") }
|
|
120
|
+
|
|
121
|
+
return rails
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def service_init
|
|
125
|
+
File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - service_init entered") }
|
|
126
|
+
|
|
127
|
+
@rails = configure_rails
|
|
128
|
+
#@rails = SimpleHandler.new
|
|
129
|
+
|
|
130
|
+
# start up mongrel with the right configurations
|
|
131
|
+
@server = Mongrel::HttpServer.new(@ip, @port, @num_procs.to_i, @timeout.to_i)
|
|
132
|
+
@server.register("/", @rails)
|
|
133
|
+
|
|
134
|
+
File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - service_init left") }
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def service_main
|
|
138
|
+
File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - service_main entered") }
|
|
139
|
+
|
|
140
|
+
File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - server.run") }
|
|
141
|
+
@server.run
|
|
142
|
+
|
|
143
|
+
File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - while RUNNING") }
|
|
144
|
+
while state == RUNNING
|
|
145
|
+
sleep 1
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - service_main left") }
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def service_stop
|
|
152
|
+
File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - service_stop entered") }
|
|
153
|
+
|
|
154
|
+
#File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - server.stop") }
|
|
155
|
+
#@server.stop
|
|
156
|
+
|
|
157
|
+
File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - service_stop left") }
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
if ARGV[0] == 'service'
|
|
163
|
+
ARGV.shift
|
|
164
|
+
|
|
165
|
+
# default options
|
|
166
|
+
OPTIONS = {
|
|
167
|
+
:rails_root => Dir.pwd,
|
|
168
|
+
:environment => 'production',
|
|
169
|
+
:ip => '0.0.0.0',
|
|
170
|
+
:port => 3000,
|
|
171
|
+
:mime_map => nil,
|
|
172
|
+
:num_procs => 20,
|
|
173
|
+
:timeout => 120
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
ARGV.options do |opts|
|
|
177
|
+
opts.on('-r', '--root PATH', "Set the root path where your rails app resides.") { |OPTIONS[:rails_root]| }
|
|
178
|
+
opts.on('-e', '--environment ENV', "Rails environment to run as.") { |OPTIONS[:environment]| }
|
|
179
|
+
opts.on('-b', '--binding ADDR', "Address to bind to") { |OPTIONS[:ip]| }
|
|
180
|
+
opts.on('-p', '--port PORT', "Which port to bind to") { |OPTIONS[:port]| }
|
|
181
|
+
opts.on('-m', '--mime PATH', "A YAML file that lists additional MIME types") { |OPTIONS[:mime_map]| }
|
|
182
|
+
opts.on('-P', '--num-procs INT', "Number of processor threads to use") { |OPTIONS[:num_procs]| }
|
|
183
|
+
opts.on('-t', '--timeout SECONDS', "Timeout all requests after SECONDS time") { |OPTIONS[:timeout]| }
|
|
184
|
+
|
|
185
|
+
opts.parse!
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
OPTIONS[:docroot] = File.expand_path(OPTIONS[:rails_root] + '/public')
|
|
189
|
+
|
|
190
|
+
rails_svc = RailsDaemon.new(OPTIONS[:ip], OPTIONS[:port], OPTIONS[:rails_root], OPTIONS[:docroot], OPTIONS[:environment], OPTIONS[:mime_map], OPTIONS[:num_procs].to_i, OPTIONS[:timeout].to_i)
|
|
191
|
+
rails_svc.mainloop
|
|
192
|
+
|
|
193
|
+
end
|
|
194
|
+
|