Class: PHPRPC::MongrelServer

Inherits:
Mongrel::HttpHandler
  • Object
show all
Defined in:
lib/phprpc/mongrel_server.rb

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ MongrelServer

Returns a new instance of MongrelServer.



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/phprpc/mongrel_server.rb', line 38

def initialize(options = {})
  @options = {
    :host                 => '0.0.0.0',
    :port                 => 3000,
    :num_processors       => 1024,
    :throttle             => 0,
    :timeout              => 60,
    :debug                => false,
    :daemonize            => false,
    :cwd                  => Dir.pwd,
    :log_file             => 'log/mongrel.log',
    :pid_file             => 'log/mongrel.pid',
    :session_mode         => :file,
    :path                 => '/',
    :expire_after         => 1800,
  }.update(options)
  @opts = OptionParser.new
  @opts.banner = "Usage: #{@opts.program_name} mongrel [options]"
  @opts.separator ""
  @opts.separator "Server options:"
  @opts.on('-a', '--address IP', String, "Address to bind to (default: #{@options[:host]})") { |ip| @options[:host] = ip }
  @opts.on('-p', '--port PORT', Integer, "Which port to bind to (default: #{@options[:port]})") { |port| @options[:port] = port }
  @opts.on('-c', '--chdir PATH', String, "Change to dir before starting", "(will be expanded) (default: #{@options[:cwd]})") { |path| @options[:cwd] = File.expand_path(path) }
  @opts.on('-u', '--user USER', String, "User to run as") { |user| @options[:user] = user }
  @opts.on('-g', '--group GROUP', String, "Group to run as") { |group| @options[:group] = group }
  unless RUBY_PLATFORM =~ /mswin|mingw/ # Daemonizing not supported on Windows
    @opts.separator ""
    @opts.separator "Daemon options:"
    @opts.on('-d', '--daemonize', "Run daemonized in the background") { @options[:daemonize] = true }
    @opts.on('-l', '--log FILE', String, "Where to write log messages", "(default: #{@options[:log_file]})") { |file| @options[:log_file] = file }
    @opts.on("-P", "--pid FILE", String, "File to store PID", "(default: #{@options[:pid_file]})") { |file| @options[:pid_file] = file }
  end
  @opts.separator ""
  @opts.separator "Tuning options:"
  @opts.on('-n', '--num-processors INT', Integer, "Number of processors active", "before clients denied (default: #{@options[:num_processors]})") { |num| @options[:num_processors] = num }
  @opts.on('-t', '--throttle TIME', Integer, "Time to pause (in hundredths of a second)", "between accepting clients (default: #{@options[:throttle]})") { |time| @options[:throttle] = time }
  @opts.on('-o', '--timeout TIME', Integer, "Time to wait (in seconds) before killing", "a stalled thread (default: #{@options[:timeout]})") { |time| @options[:timeout] = time }
  @opts.separator ""
  @opts.separator "Session options:"
  @opts.on('-s', '--session-mode MODE', [:file, :memcache, :pool], "Select Session mode (file, memcache, pool)", "(default: #{@options[:session_mode].to_s})") { |mode| @options[:session_mode] = mode }
  @opts.on('-e','--expire-after TIME', Integer, "Session expire after (default: #{@options[:expire_after]})") { |time| @options[:expire_after] = time }
  @opts.on('-m','--memcache_server SERVER', String, "Memcache server used by session in", "memcache mode (default: localhost:11211)") { |server| @options[:memcache_server] = server }
  @opts.on('--prefix PATH', String, "Mount the PHPRPC Server under PATH", "(start with /)") { |path| @options[:path] = path }
  @opts.separator ""
  @opts.separator "Common options:"
  @opts.on_tail('-D', '--debug', "Set debbuging on (default: disabled)") { @options[:debug] = true }
  @opts.on_tail('-?', '-h', '--help', "Show this help message.") { puts @opts; exit }
  @opts.on_tail('-v', '--version', "Show version") { puts "Mongrel web server v#{Mongrel::Const::MONGREL_VERSION}"; exit }
  begin
    @opts.parse!(ARGV)
  rescue OptionParser::ParseError
    puts @opts
    exit
  end
  @app = PHPRPC::BaseServer.new
  @app.debug = @options[:debug]
end

Instance Method Details

#add(methodname, obj = nil, aliasname = nil, &block) ⇒ Object



96
97
98
# File 'lib/phprpc/mongrel_server.rb', line 96

def add(methodname, obj = nil, aliasname = nil, &block)
  @app.add(methodname, obj, aliasname, &block)
end

#charsetObject



100
101
102
# File 'lib/phprpc/mongrel_server.rb', line 100

def charset
  @app.charset
end

#charset=(val) ⇒ Object



104
105
106
# File 'lib/phprpc/mongrel_server.rb', line 104

def charset=(val)
  @app.charset = val
end

#debugObject



108
109
110
# File 'lib/phprpc/mongrel_server.rb', line 108

def debug
  @app.debug
end

#debug=(val) ⇒ Object



112
113
114
# File 'lib/phprpc/mongrel_server.rb', line 112

def debug=(val)
  @app.debug = val
end

#process(request, response) ⇒ Object



147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/phprpc/mongrel_server.rb', line 147

def process(request, response)
  env = {}.replace(request.params)
  env["rack.input"] = request.body || StringIO.new("")
  env['rack.multithread'] = true # this variable only used for rack pool session on debug mode
  env["rack.url_scheme"] = "http"
  env["QUERY_STRING"] ||= ""
  status, headers, body = @app.call(env)
  begin
    response.status = status.to_i
    headers.each { |k, v|
      response.header[k] = v
    }
    response.body << body
    response.finished
  ensure
    body.close  if body.respond_to? :close
  end
end

#startObject



116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/phprpc/mongrel_server.rb', line 116

def start
  if [:memcache, :pool].include?(@options[:session_mode]) then
    old_app = @app
    begin
      require 'rack'
      if @options[:session_mode] == :memcache then
        @app = Rack::Session::Memcache.new(@app, @options)
      else
        @app = Rack::Session::Pool.new(@app, @options)
      end
    rescue Exception
      @app = old_app
    end
  end
  @options[:handler] = self
  Mongrel::Configurator.new(@options) {
    daemonize if @defaults[:daemonize]
    log "Mongrel web server v#{Mongrel::Const::MONGREL_VERSION}"
    log "Listening on #{@defaults[:host]}:#{@defaults[:port]}"
    log "CTRL+C to stop" if @defaults[:daemonize]
    write_pid_file
    setup_signals
    listener {
      uri @defaults[:path]
      debug(@defaults[:path], [:access, :threads]) if @defaults[:debug]
    }
    run
    join
  }
end