scgi 0.8.0 → 0.9.0

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.
Files changed (4) hide show
  1. data/LICENSE +1 -1
  2. data/README +16 -4
  3. data/lib/scgi.rb +46 -35
  4. metadata +6 -6
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2007 Jeremy Evans
1
+ Copyright (c) 2007-2008 Jeremy Evans
2
2
  Copyright (c) 2004 Zed A. Shaw
3
3
 
4
4
  Permission is hereby granted, free of charge, to any person obtaining
data/README CHANGED
@@ -31,7 +31,6 @@ Subversion access is available at svn://code.jeremyevans.net/ruby-scgi/.
31
31
  * Simple to configure with your web server.
32
32
  * Completely free code licensed under Rails's own license.
33
33
  * No external dependencies other than Ruby
34
- * The core implementation is easily extensible for other Ruby web frameworks.
35
34
 
36
35
  == Comparison With FastCGI
37
36
 
@@ -75,13 +74,13 @@ ruby-scgi on a totally different machine with this.
75
74
 
76
75
  ruby-scgi is now just a library and doesn't come with a tool to run Rails. The
77
76
  previous command line tool (scgi_ctrl) has been greatly enhanced and is now
78
- available as a standalone gem called style.
77
+ available as a standalone gem called ruby-style.
79
78
 
80
79
  == Example configurations
81
80
 
82
81
  Note that ruby-scgi is only tested on Lighttpd. Also, note that Lighttpd
83
82
  1.4.16 has a bug which breaks redirects using server.error-handler-404, so
84
- either use mod_magnet, use 1.4.17, or apply the patch in ticket 1270 on
83
+ either use mod_magnet, use 1.4.18, or apply the patch in ticket 1270 on
85
84
  Lighttpd's Trac.
86
85
 
87
86
  Lighttpd:
@@ -141,9 +140,22 @@ Apache:
141
140
  </Directory>
142
141
  </VirtualHost>
143
142
 
143
+ == Changes from version 0.8.0
144
+
145
+ * You can pass a socket to SCGI::Processor.new via settings[:socket]
146
+ * You can have a socket created for you in new if you pass
147
+ settings[:host] and settings[:port]
148
+ * You can pass an existing logger to new via settings[:log]
149
+ * Passing a socket to listen is now optional, if you passed a socket or
150
+ had one created in new
151
+ * Improved RDoc for new
152
+ * Most SCGI::Processor methods are now private
153
+ * SCGI::Processor is easier to subclass because it will use preexisting
154
+ instance variables
155
+
144
156
  == Changes from version 0.7.0
145
157
 
146
- * Command line tool is now in a seperate gem called style
158
+ * Command line tool is now in a seperate gem called ruby-style
147
159
  * You now must pass a socket to SCGI::Processor#listen
148
160
  * SCGI::Processor's @log and @maxconns now have defaults
149
161
  * SCGI::Processor's @host and @port are no longer used
data/lib/scgi.rb CHANGED
@@ -81,22 +81,33 @@ module SCGI
81
81
  # It might be useful for shared hosting people to have domain sockets, but
82
82
  # they aren't supported in Apache, and in lighttpd they're unreliable.
83
83
  # Also, domain sockets don't work so well on Windows.
84
+ #
85
+ # Available settings:
86
+ # :socket => Use this socket
87
+ # :host => Create a socket bound to this IP (if :port is also used)
88
+ # :port => Create a socket bound to this IP (if :host is also used)
89
+ # :log => Use this logger instead of creating one
90
+ # :logfile => Use this logfile instead of log/scgi.log
91
+ # :maxconns => Allow this many max connections, more than this are redirected
92
+ # to /busy.html (default: 2**30 - 1)
84
93
  class Processor < Monitor
85
94
  def initialize(settings = {})
86
- @total_conns = 0
87
- @shutdown = false
88
- @dead = false
89
- @threads = Queue.new
90
- @log = LogFactory.instance.create(settings[:logfile] || 'log/scgi.log')
91
- @maxconns = settings[:maxconns] || 2**30-1
95
+ @socket ||= settings[:socket] || (TCPServer.new(settings[:host], settings[:port]) if settings[:host] && settings[:port])
96
+ @total_conns ||= 0
97
+ @shutdown ||= false
98
+ @dead ||= false
99
+ @threads ||= Queue.new
100
+ @log ||= settings[:log] || LogFactory.instance.create(settings[:logfile] || 'log/scgi.log')
101
+ @maxconns ||= settings[:maxconns] || 2**30-1
92
102
  super()
93
103
  setup_signals
94
104
  end
95
105
 
96
- # Starts the SCGI::Processor having it listen on the given socket. This
106
+ # Starts the SCGI::Processor having it listen on the given socket, if one
107
+ # is provided, or the one established in new, if not. This
97
108
  # function does not return until a shutdown.
98
- def listen(socket)
99
- @socket = socket
109
+ def listen(socket = nil)
110
+ @socket ||= socket
100
111
 
101
112
  # we also need a small collector thread that does nothing
102
113
  # but pull threads off the thread queue and joins them
@@ -122,6 +133,32 @@ module SCGI
122
133
  @log.info("Exited accept loop. Shutdown complete.")
123
134
  end
124
135
 
136
+ # When called it will set the @shutdown flag indicating to the
137
+ # SCGI::Processor.listen function that all new connections should
138
+ # be set to /busy.html, and all current connections should be
139
+ # "valved" off. Once all the current connections are gone the
140
+ # SCGI::Processor.listen function will exit.
141
+ #
142
+ # Use the force=true parameter to force an immediate shutdown.
143
+ # This is done by closing the listening socket, so it's rather
144
+ # violent.
145
+ def shutdown(force = false)
146
+ synchronize do
147
+ @shutdown = true
148
+
149
+ if @threads.length == 0
150
+ @log.info("Immediate shutdown since nobody is connected.")
151
+ @socket.close
152
+ elsif force
153
+ @log.info("Forcing shutdown. You may see exceptions.")
154
+ @socket.close
155
+ else
156
+ @log.info("Shutdown requested. Beginning graceful shutdown with #{@threads.length} connected.")
157
+ end
158
+ end
159
+ end
160
+
161
+ private
125
162
  def collect_thread(thread)
126
163
  begin
127
164
  thread.join
@@ -148,7 +185,6 @@ module SCGI
148
185
  # and deals with the graceful shutdown. The important part
149
186
  # of graceful shutdown is that new requests get redirected to
150
187
  # the /busy.html file.
151
- #
152
188
  def handle_client(socket)
153
189
  # ruby's GC seems to do weird things if we don't assign the thread to a local variable
154
190
  @threads << Thread.new do
@@ -231,30 +267,5 @@ module SCGI
231
267
  :shutdown => @shutdown, :dead => @dead, :total_conns => @total_conns
232
268
  }.inspect
233
269
  end
234
-
235
- # When called it will set the @shutdown flag indicating to the
236
- # SCGI::Processor.listen function that all new connections should
237
- # be set to /busy.html, and all current connections should be
238
- # "valved" off. Once all the current connections are gone the
239
- # SCGI::Processor.listen function will exit.
240
- #
241
- # Use the force=true parameter to force an immediate shutdown.
242
- # This is done by closing the listening socket, so it's rather
243
- # violent.
244
- def shutdown(force = false)
245
- synchronize do
246
- @shutdown = true
247
-
248
- if @threads.length == 0
249
- @log.info("Immediate shutdown since nobody is connected.")
250
- @socket.close
251
- elsif force
252
- @log.info("Forcing shutdown. You may see exceptions.")
253
- @socket.close
254
- else
255
- @log.info("Shutdown requested. Beginning graceful shutdown with #{@threads.length} connected.")
256
- end
257
- end
258
- end
259
270
  end
260
271
  end
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.0
2
+ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: scgi
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.8.0
7
- date: 2007-09-06 00:00:00 -07:00
6
+ version: 0.9.0
7
+ date: 2008-01-23 00:00:00 -08:00
8
8
  summary: Simple support for using SCGI in ruby apps, such as Rails
9
9
  require_paths:
10
10
  - lib
11
11
  email: code@jeremyevans.net
12
12
  homepage:
13
- rubyforge_project:
13
+ rubyforge_project: scgi
14
14
  description:
15
15
  autorequire:
16
16
  default_executable:
@@ -37,8 +37,8 @@ test_files: []
37
37
  rdoc_options:
38
38
  - --inline-source
39
39
  - --line-numbers
40
- extra_rdoc_files: []
41
-
40
+ extra_rdoc_files:
41
+ - README
42
42
  executables: []
43
43
 
44
44
  extensions: []