1 # This script emualtes script/server behavior but running webrick http server
\r
8 require 'win32/service'
\r
10 DEBUG_LOG_FILE = File.expand_path(File.dirname(__FILE__) + '/debug.log')
\r
12 class SimpleHandler < Mongrel::HttpHandler
\r
13 def process(request, response)
\r
14 response.start do |head,out|
\r
15 head["Content-Type"] = "text/html"
\r
16 results = "<html><body>Your request:<br /><pre>#{request.params.to_yaml}</pre><a href=\"/files\">View the files.</a></body></html>"
\r
17 if request.params["HTTP_ACCEPT_ENCODING"] == "gzip,deflate"
\r
18 head["Content-Encoding"] = "deflate"
\r
19 # send it back deflated
\r
20 out << Zlib::Deflate.deflate(results)
\r
22 # no gzip supported, send it back normal
\r
29 class MongrelDaemon < Win32::Daemon
\r
30 def initialize(options)
\r
35 File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - service_init entered") }
\r
37 File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("Mongrel running on #{@options[:ip]}:#{@options[:port]} with docroot #{@options[:server_root]}") }
\r
39 @simple = SimpleHandler.new
\r
40 @files = Mongrel::DirHandler.new(@options[:server_root])
\r
42 @http_server = Mongrel::HttpServer.new(@options[:ip], @options[:port])
\r
43 @http_server.register("/", @simple)
\r
44 @http_server.register("/files", @files)
\r
46 File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - service_init left") }
\r
50 File.open(DEBUG_LOG_FILE,"a+"){ |f|
\r
51 f.puts "stop signal received: " + Time.now.to_s
\r
52 f.puts "sending stop to mongrel threads: " + Time.now.to_s
\r
58 File.open(DEBUG_LOG_FILE,"a+"){ |f|
\r
59 f.puts "pause signal received: " + Time.now.to_s
\r
64 File.open(DEBUG_LOG_FILE,"a+"){ |f|
\r
65 f.puts "continue/resume signal received: " + Time.now.to_s
\r
70 File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - service_main entered") }
\r
73 File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - http_server.run") }
\r
76 # No runner thread was needed after all!
\r
77 #@runner = Thread.new do
\r
78 # @http_server.acceptor.join
\r
80 #File.open("d:\\test.log","a+") { |f| f.puts("#{Time.now} - runner.run") }
\r
83 # here is where magic happens!
\r
84 # if put blocking code here, the thread never left service_main, and the rb_func_call in service.c
\r
85 # never exit, even if the stop signal is received.
\r
87 # to probe my theory, just comment the while loop and remove the '1' from sleep function
\r
88 # service start ok, but fail to stop.
\r
90 # Even if no functional code is in service_main (because we have other working threads),
\r
91 # we must monitor the state of the service to exit when the STOP event is received.
\r
93 # Note: maybe not loop in 1 second intervals?
\r
94 while state == RUNNING
\r
98 rescue StandardError, Exception, interrupt => err
\r
99 File.open(DEBUG_LOG_FILE,"a+"){ |f| f.puts("#{Time.now} - Error: #{err}") }
\r
100 File.open(DEBUG_LOG_FILE,"a+"){ |f| f.puts("BACKTRACE: " + err.backtrace.join("\n")) }
\r
104 File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - service_main left") }
\r
112 :server_root => File.expand_path(File.dirname(__FILE__)),
\r
115 web_server = MongrelDaemon.new(OPTIONS)
\r
116 web_server.mainloop
\r