thin 1.6.2 → 1.6.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e842069e783c48060e71f494c190904609d5a587
4
- data.tar.gz: dbc7a2d780bde4e6420f59432966bf359f6b1dd8
3
+ metadata.gz: a52ecc8925833038f1f9b6ac7b421032e9524d79
4
+ data.tar.gz: 5270eac2bbf836f0574704b908c7db468e05d977
5
5
  SHA512:
6
- metadata.gz: a95d911c6bfa01811a38e5f383cc7c8b021c04af04770fa7f21c4685e37ddb9425eada286a141ccff47df9e0b91321c338f68f9ae2c3956c17276ce66f43cb67
7
- data.tar.gz: 942aa9be0433894ccef664400e1b8aff0a34e03b9fcc449dc1b13f3c4dc1d87034203748694b65bddc616e0beee9624b8c5990c32f79ffa9373b8acd0803a9fa
6
+ metadata.gz: 992772f4b87b8086f5a99323cefd7ec748b89148d58f2758c9e911b84f1bc72f5c8181460145f92660ba0def62d2c8fcb4a9d4aca7aa32eae98805ea316ec654
7
+ data.tar.gz: 1617c532da78f8a0173e933dee24c03ac521cdbd41ef79e83fc2543a993dbccc1bd528638c0fac3668996cc1939c9e233f75f5fda78240460333cdabb23be2b1
data/CHANGELOG CHANGED
@@ -1,3 +1,10 @@
1
+ == 1.6.3 Protein Powder
2
+ * Add HTTP 422 status code [rajcybage]
3
+ * Add warning about EM reactor still running when stopping.
4
+ * Remove version number from "Server" HTTP header. [benbasson]
5
+ * Adding `--ssl-disable-verify` to allow disabling of client cert requests when SSL enabled [brucek]
6
+ * Ensure Tempfiles created by a large request are closed and deleted. [Tonkpils]
7
+
1
8
  == 1.6.2 Doc Brown
2
9
  * No longer replace response's body on HEAD request. Ensuring body.close will be called.
3
10
  * Remove `---ssl-verify` option as EventMachine doesn't verify the certificate.
@@ -54,10 +61,10 @@
54
61
  It is now the responsibility of the app (or a middleware) to set the Content-Length.
55
62
  * Log errors to STDERR [textgoeshere]
56
63
  * Shut down gracefully when receiving SIGTERM [ddollar]
57
-
64
+
58
65
  Processes are allowed a chance to shut down gracefully when receiving
59
66
  SIGTERM (http://en.wikipedia.org/wiki/SIGTERM).
60
-
67
+
61
68
  On Heroku, when shutting down a process, we send a SIGTERM followed 10
62
69
  seconds later with a SIGKILL, similar to the behavior of the init daemon
63
70
  on most Unix systems. This patch will allow Heroku apps to shut down
@@ -82,7 +89,7 @@
82
89
  the existing connection to another protocol, and specifically is NOT
83
90
  used to upgrade a separate connection. Therefore, the connection must
84
91
  remain open after this response in order to facilitate that.
85
-
92
+
86
93
  * Accept IE7 badly encoded URL (eg.: %uEEEE)
87
94
  * Fix gemspec to work w/ Bundler [smparkes]
88
95
  * Add SSL support [tmm1]
@@ -98,10 +105,10 @@
98
105
  --ssl-key-file PATH Path to private key
99
106
  --ssl-cert-file PATH Path to certificate
100
107
  --ssl-verify Enables SSL certificate verification
101
-
108
+
102
109
  * Expose peer SSL certificate in env (rack.peer_cert) [fd]
103
110
  * Adjusting unix socket permissions to be more open [mbj]
104
-
111
+
105
112
  == 1.2.7 No Hup
106
113
  * Support multiple Ruby version (fat binaries under windows)
107
114
  * Do not trap unsupported HUP signal on Windows
@@ -125,7 +132,7 @@
125
132
  == 1.2.2 I Find Your Lack of Sauce Disturbing release
126
133
  * Fix force kill under 1.9 [Alexey Chebotar]
127
134
  * Fix regression when --only option is used w/ --socket.
128
- * Add process name 'tag' functionality. Easier to distinguish thin daemons
135
+ * Add process name 'tag' functionality. Easier to distinguish thin daemons
129
136
  from eachother in process listing [ctcherry]
130
137
 
131
138
  == 1.2.1 Asynctilicious Ultra Supreme release
@@ -135,11 +142,11 @@
135
142
  * Allow String for response body
136
143
  * Require openssl before eventmachine to prevent crash in 1.9
137
144
 
138
- == 1.2.0 Asynctilicious Supreme release
145
+ == 1.2.0 Asynctilicious Supreme release
139
146
  * Add support for Windows mingw Ruby distro [Juan C. Rodriguez]
140
147
  * Add async response support, see example/async_*.ru [raggi]
141
148
 
142
- == 1.1.1 Super Disco Power Plus release
149
+ == 1.1.1 Super Disco Power Plus release
143
150
  * Fix bug when running with only options [hasimo]
144
151
 
145
152
  == 1.1.0 Super Disco Power release
@@ -236,20 +243,20 @@
236
243
  * Add tasks for Vlad the Deployer in example/vlad.rake [cnantais]
237
244
  * Add Ramaze Rackup config file in example dir [tmm1]
238
245
  Use like this from you Ramaze app dir:
239
-
246
+
240
247
  thin start -r /path/to/thin/example/ramaze.ru
241
-
248
+
242
249
  * Add the --rackup option to load a Rack config file instead of the Rails adapter.
243
250
  So you can use any framework with the thin script and start cluster and stuff like that.
244
251
  A Rack config file is one that is usable through the rackup command and looks like this:
245
-
252
+
246
253
  use Rack::CommonLogger
247
254
  run MyCrazyRackAdapter.new(:uterly, 'cool')
248
-
255
+
249
256
  Then use it with thin like this:
250
-
257
+
251
258
  thin start --rackup config.ru
252
-
259
+
253
260
  * thin config --chrdir ... -C thin/yml do not change current directory anymore, fixes #33.
254
261
  * Add a better sample god config file in example/thin.god that loads all info from config
255
262
  files in /etc/thin. Drop-in replacement for the thin runlevel service [Gump].
@@ -257,9 +264,9 @@
257
264
  configuration.
258
265
  * Add a script to run thin as a runlevel service that can start at startup, closes #31 [Gump]
259
266
  Setup the service like this:
260
-
267
+
261
268
  sudo thin install /etc/thin
262
-
269
+
263
270
  This will install the boot script under /etc/init.d/thin. Then copy your config files to
264
271
  /etc/thin. Works only under Linux.
265
272
  * Set process name to 'thin server (0.0.0.0:3000)' when running as a daemon, closes #32.
@@ -285,9 +292,9 @@
285
292
  * Add example config files for http://www.tildeslash.com/monit usage.
286
293
  Include the example file using "include /path/to/thin/monit/file" in your monitrc file.
287
294
  The group settings let you do this to manage your clusters:
288
-
295
+
289
296
  sudo monit -g blog restart all
290
-
297
+
291
298
  There are examples of thin listening on sockets and thin listening on unix sockets.
292
299
 
293
300
  == 0.6.1 Cheesecake release
@@ -298,20 +305,20 @@
298
305
  * Add support for connection through UNIX domain socket.
299
306
  Use the --socket (-S) option w/ the thin script to configure the socket filename.
300
307
  Nginx support binding to a UNIX socket like this:
301
-
308
+
302
309
  upstream backend {
303
310
  server unix:/tmp/thin.0.sock;
304
311
  server unix:/tmp/thin.1.sock;
305
312
  server unix:/tmp/thin.2.sock;
306
313
  }
307
-
314
+
308
315
  Start your servers like this:
309
-
316
+
310
317
  thin start -s3 -S/tmp/thin.sock
311
-
318
+
312
319
  * Remove Server#listen! method. Use Server#start instead.
313
320
  * Server can now yield a Rack::Builder to allow building an app in one call:
314
-
321
+
315
322
  Server.start '0.0.0.0', 3000 do
316
323
  use Rack::CommonLogger
317
324
  use Rack::ShowExceptions
@@ -320,13 +327,13 @@
320
327
  run Rack::Lobster.new
321
328
  end
322
329
  end
323
-
330
+
324
331
  * Add a very basic stats page through Stats adapter, load w/ --stats and browse to /stats.
325
332
  * Add --trace (-V) option to trace request/response and get backtrace w/out all Ruby debug stuff.
326
333
  * Add --config (-C) option to load options from a config file in thin script [Matt Todd].
327
334
  * Alter response headers to output directly to a string.
328
335
  * Improve specs stability.
329
- * Move request body to a Tempfile if too big (> 112 MB)
336
+ * Move request body to a Tempfile if too big (> 112 KB)
330
337
  * Remove useless check for max header size in Request (already done in the parser)
331
338
 
332
339
  == 0.5.4 Flying Mustard release
@@ -338,7 +345,7 @@
338
345
  Thanks to Kent Sibilev and Ezra for their help on that one.
339
346
  * Add 'Server' response header
340
347
  * Fix --user and --group option not changing daemon process privileges
341
-
348
+
342
349
  == 0.5.3 Purple Yogurt release
343
350
  * win32 pre-compiled gem now available
344
351
  * change rake task configuration to allow win32 gem build
@@ -358,7 +365,7 @@
358
365
  --log-file => --log
359
366
  --pid-file => --pid
360
367
  --env => --environment
361
-
368
+
362
369
  == 0.5.1 LOLCAT release
363
370
  * Add URL rewriting to Rails adapter so that page caching works and / fetches index.html if present.
364
371
  * Fix bug in multiline response header parsing.
@@ -373,9 +380,9 @@
373
380
 
374
381
  == 0.5.0
375
382
  * Full rewrite to use EventMachine, Rack and Mongrel parser
376
-
383
+
377
384
  == 0.4.1
378
385
  * Fix Rails environment option not being used in thin script.
379
-
386
+
380
387
  == 0.4.0
381
388
  * First alphaish release as a gem.
data/README.md CHANGED
@@ -18,8 +18,8 @@ bundled in an easy to use gem for your own pleasure.
18
18
  Code: http://github.com/macournoyer/thin
19
19
  IRC: #thin on freenode
20
20
 
21
- Installation
22
- ============
21
+ ## Installation
22
+
23
23
  For the latest stable version:
24
24
 
25
25
  `gem install thin`
@@ -32,9 +32,8 @@ cd thin
32
32
  rake install
33
33
  ```
34
34
 
35
+ ## Usage
35
36
 
36
- Usage
37
- =====
38
37
  A +thin+ script offers an easy way to start your Rack application:
39
38
 
40
39
  ```
@@ -45,14 +44,121 @@ thin start
45
44
  When using with Rails and Bundler, make sure to add `gem 'thin'`
46
45
  to your Gemfile.
47
46
 
48
- See example directory for samples and run 'thin -h' for usage.
47
+ See example directory for samples.
48
+
49
+ ### Command Line Examples
50
+
51
+ Use a rackup file and bind to localhost port 8080:
52
+
53
+ ```
54
+ thin -R config.ru -a 127.0.0.1 -p 8080 start
55
+ ```
56
+
57
+ Store the server process ID, log to a file and daemonize:
58
+
59
+ ```
60
+ thin -p 9292 -P tmp/pids/thin.pid -l logs/thin.log -d start
61
+ ```
62
+
63
+ Thin is quite flexible in that many options can be specified at the command line (see below for usage).
64
+
65
+ ### Configuration files
66
+
67
+ You can create configuration files in yaml format and feed them to thin using `thin -C config.yml`. Here is an example config file:
68
+
69
+ ```yaml
70
+ ---
71
+ user: www-data
72
+ group: www-data
73
+ pid: tmp/pids/thin.pid
74
+ timeout: 30
75
+ wait: 30
76
+ log: log/thin.log
77
+ max_conns: 1024
78
+ require: []
79
+ environment: production
80
+ max_persistent_conns: 512
81
+ servers: 1
82
+ threaded: true
83
+ no-epoll: true
84
+ daemonize: true
85
+ socket: tmp/sockets/thin.sock
86
+ chdir: /path/to/your/apps/root
87
+ tag: a-name-to-show-up-in-ps aux
88
+ ```
89
+
90
+ ### Command Line Options
91
+
92
+ This is the usage for the thin command which can be obtained by running `thin -h` at the command line.
93
+
94
+ ```sh
95
+ Usage: thin [options] start|stop|restart|config|install
96
+
97
+ Server options:
98
+ -a, --address HOST bind to HOST address (default: 0.0.0.0)
99
+ -p, --port PORT use PORT (default: 3000)
100
+ -S, --socket FILE bind to unix domain socket
101
+ -y, --swiftiply [KEY] Run using swiftiply
102
+ -A, --adapter NAME Rack adapter to use (default: autodetect)
103
+ (rack, rails, ramaze, merb, file)
104
+ -R, --rackup FILE Load a Rack config file instead of Rack adapter
105
+ -c, --chdir DIR Change to dir before starting
106
+ --stats PATH Mount the Stats adapter under PATH
107
+
108
+ SSL options:
109
+ --ssl Enables SSL
110
+ --ssl-key-file PATH Path to private key
111
+ --ssl-cert-file PATH Path to certificate
112
+ --ssl-disable-verify Disables (optional) client cert requests
113
+
114
+ Adapter options:
115
+ -e, --environment ENV Framework environment (default: development)
116
+ --prefix PATH Mount the app under PATH (start with /)
117
+
118
+ Daemon options:
119
+ -d, --daemonize Run daemonized in the background
120
+ -l, --log FILE File to redirect output (default: /home/robert/log/thin.log)
121
+ -P, --pid FILE File to store PID (default: tmp/pids/thin.pid)
122
+ -u, --user NAME User to run daemon as (use with -g)
123
+ -g, --group NAME Group to run daemon as (use with -u)
124
+ --tag NAME Additional text to display in process listing
125
+
126
+ Cluster options:
127
+ -s, --servers NUM Number of servers to start
128
+ -o, --only NUM Send command to only one server of the cluster
129
+ -C, --config FILE Load options from config file
130
+ --all [DIR] Send command to each config files in DIR
131
+ -O, --onebyone Restart the cluster one by one (only works with restart command)
132
+ -w, --wait NUM Maximum wait time for server to be started in seconds (use with -O)
133
+
134
+ Tuning options:
135
+ -b, --backend CLASS Backend to use, full classname
136
+ -t, --timeout SEC Request or command timeout in sec (default: 30)
137
+ -f, --force Force the execution of the command
138
+ --max-conns NUM Maximum number of open file descriptors (default: 1024)
139
+ Might require sudo to set higher than 1024
140
+ --max-persistent-conns NUM Maximum number of persistent connections
141
+ (default: 100)
142
+ --threaded Call the Rack application in threads [experimental]
143
+ --threadpool-size NUM Sets the size of the EventMachine threadpool.
144
+ (default: 20)
145
+ --no-epoll Disable the use of epoll
146
+
147
+ Common options:
148
+ -r, --require FILE require the library
149
+ -q, --quiet Silence all logging
150
+ -D, --debug Enable debug logging
151
+ -V, --trace Set tracing on (log raw request/response)
152
+ -h, --help Show this message
153
+ -v, --version Show version
154
+ ```
155
+
156
+ ## License
49
157
 
50
- License
51
- =======
52
158
  Ruby License, http://www.ruby-lang.org/en/LICENSE.txt.
53
159
 
54
- Credits
55
- =======
160
+ ## Credits
161
+
56
162
  The parser was stolen from Mongrel http://mongrel.rubyforge.org by Zed Shaw.
57
163
  Mongrel is copyright 2007 Zed A. Shaw and contributors. It is licensed under
58
164
  the Ruby license and the GPL2.
@@ -11,32 +11,27 @@ require 'cgi'
11
11
  #
12
12
  # Based on http://fuzed.rubyforge.org/ Rails adapter
13
13
  module Rack
14
- module Adapter
14
+ module Adapter
15
15
  class Rails
16
16
  FILE_METHODS = %w(GET HEAD).freeze
17
-
18
- def initialize(options={})
19
- @root = options[:root] || Dir.pwd
20
- @env = options[:environment] || 'development'
17
+
18
+ def initialize(options = {})
19
+ @root = options[:root] || Dir.pwd
20
+ @env = options[:environment] || 'development'
21
21
  @prefix = options[:prefix]
22
-
22
+
23
23
  load_application
24
-
25
- @rails_app = if self.class.rack_based?
26
- ActionController::Dispatcher.new
27
- else
28
- CgiApp.new
29
- end
30
-
31
- @file_app = Rack::File.new(::File.join(RAILS_ROOT, "public"))
24
+
25
+ @rails_app = self.class.rack_based? ? ActionController::Dispatcher.new : CgiApp.new
26
+ @file_app = Rack::File.new(::File.join(RAILS_ROOT, "public"))
32
27
  end
33
-
28
+
34
29
  def load_application
35
30
  ENV['RAILS_ENV'] = @env
36
31
 
37
32
  require "#{@root}/config/environment"
38
33
  require 'dispatcher'
39
-
34
+
40
35
  if @prefix
41
36
  if ActionController::Base.respond_to?(:relative_url_root=)
42
37
  ActionController::Base.relative_url_root = @prefix # Rails 2.1.1
@@ -45,17 +40,17 @@ module Rack
45
40
  end
46
41
  end
47
42
  end
48
-
43
+
49
44
  def file_exist?(path)
50
45
  full_path = ::File.join(@file_app.root, Utils.unescape(path))
51
46
  ::File.file?(full_path) && ::File.readable_real?(full_path)
52
47
  end
53
-
48
+
54
49
  def call(env)
55
50
  path = env['PATH_INFO'].chomp('/')
56
51
  method = env['REQUEST_METHOD']
57
52
  cached_path = (path.empty? ? 'index' : path) + ActionController::Base.page_cache_extension
58
-
53
+
59
54
  if FILE_METHODS.include?(method)
60
55
  if file_exist?(path) # Serve the file if it's there
61
56
  return @file_app.call(env)
@@ -64,11 +59,11 @@ module Rack
64
59
  return @file_app.call(env)
65
60
  end
66
61
  end
67
-
62
+
68
63
  # No static file, let Rails handle it
69
64
  @rails_app.call(env)
70
65
  end
71
-
66
+
72
67
  def self.rack_based?
73
68
  rails_version = ::Rails::VERSION
74
69
  return false if rails_version::MAJOR < 2
@@ -76,7 +71,7 @@ module Rack
76
71
  return false if rails_version::MAJOR == 2 && rails_version::MINOR == 2 && rails_version::TINY < 3
77
72
  true # >= 2.2.3
78
73
  end
79
-
74
+
80
75
  protected
81
76
  # For Rails pre Rack (2.3)
82
77
  class CgiApp
@@ -91,7 +86,7 @@ module Rack
91
86
  response.finish
92
87
  end
93
88
  end
94
-
89
+
95
90
  class CGIWrapper < ::CGI
96
91
  def initialize(request, response, *args)
97
92
  @request = request
@@ -101,36 +96,36 @@ module Rack
101
96
 
102
97
  super *args
103
98
  end
104
-
105
- def header(options = "text/html")
99
+
100
+ def header(options = 'text/html')
106
101
  if options.is_a?(String)
107
102
  @response['Content-Type'] = options unless @response['Content-Type']
108
103
  else
109
104
  @response['Content-Length'] = options.delete('Content-Length').to_s if options['Content-Length']
110
-
105
+
111
106
  @response['Content-Type'] = options.delete('type') || "text/html"
112
- @response['Content-Type'] += "; charset=" + options.delete('charset') if options['charset']
113
-
107
+ @response['Content-Type'] += '; charset=' + options.delete('charset') if options['charset']
108
+
114
109
  @response['Content-Language'] = options.delete('language') if options['language']
115
110
  @response['Expires'] = options.delete('expires') if options['expires']
116
111
 
117
112
  @response.status = options.delete('Status') if options['Status']
118
-
113
+
119
114
  # Convert 'cookie' header to 'Set-Cookie' headers.
120
- # Because Set-Cookie header can appear more the once in the response body,
115
+ # Because Set-Cookie header can appear more the once in the response body,
121
116
  # we store it in a line break seperated string that will be translated to
122
117
  # multiple Set-Cookie header by the handler.
123
118
  if cookie = options.delete('cookie')
124
119
  cookies = []
125
-
120
+
126
121
  case cookie
127
122
  when Array then cookie.each { |c| cookies << c.to_s }
128
123
  when Hash then cookie.each { |_, c| cookies << c.to_s }
129
124
  else cookies << cookie.to_s
130
125
  end
131
-
126
+
132
127
  @output_cookies.each { |c| cookies << c.to_s } if @output_cookies
133
-
128
+
134
129
  @response['Set-Cookie'] = [@response['Set-Cookie'], cookies].compact
135
130
  # See http://groups.google.com/group/rack-devel/browse_thread/thread/e8759b91a82c5a10/a8dbd4574fe97d69?#a8dbd4574fe97d69
136
131
  if Thin.ruby_18?
@@ -139,42 +134,42 @@ module Rack
139
134
  @response['Set-Cookie'] = @response['Set-Cookie'].join("\n")
140
135
  end
141
136
  end
142
-
143
- options.each { |k,v| @response[k] = v }
137
+
138
+ options.each { |k, v| @response[k] = v }
144
139
  end
145
-
146
- ""
140
+
141
+ ''
147
142
  end
148
-
143
+
149
144
  def params
150
145
  @params ||= @request.params
151
146
  end
152
-
147
+
153
148
  def cookies
154
149
  @request.cookies
155
150
  end
156
-
151
+
157
152
  def query_string
158
153
  @request.query_string
159
154
  end
160
-
155
+
161
156
  # Used to wrap the normal args variable used inside CGI.
162
157
  def args
163
158
  @args
164
159
  end
165
-
160
+
166
161
  # Used to wrap the normal env_table variable used inside CGI.
167
162
  def env_table
168
163
  @request.env
169
164
  end
170
-
165
+
171
166
  # Used to wrap the normal stdinput variable used inside CGI.
172
167
  def stdinput
173
168
  @input
174
169
  end
175
-
170
+
176
171
  def stdoutput
177
- STDERR.puts "stdoutput should not be used."
172
+ STDERR.puts 'stdoutput should not be used.'
178
173
  @response.body
179
174
  end
180
175
  end
@@ -116,6 +116,10 @@ module Thin
116
116
  def running?
117
117
  @running
118
118
  end
119
+
120
+ def started_reactor?
121
+ @started_reactor
122
+ end
119
123
 
120
124
  # Called by a connection when it's unbinded.
121
125
  def connection_finished(connection)
@@ -3,10 +3,10 @@ module Thin
3
3
  # Backend to act as a Swiftiply client (http://swiftiply.swiftcore.org).
4
4
  class SwiftiplyClient < Base
5
5
  attr_accessor :key
6
-
6
+
7
7
  attr_accessor :host, :port
8
-
9
- def initialize(host, port, options={})
8
+
9
+ def initialize(host, port, options = {})
10
10
  @host = host
11
11
  @port = port.to_i
12
12
  @key = options[:swiftiply].to_s
@@ -26,31 +26,31 @@ module Thin
26
26
  def to_s
27
27
  "#{@host}:#{@port} swiftiply"
28
28
  end
29
- end
29
+ end
30
30
  end
31
31
 
32
32
  class SwiftiplyConnection < Connection
33
33
  def connection_completed
34
34
  send_data swiftiply_handshake(@backend.key)
35
35
  end
36
-
36
+
37
37
  def persistent?
38
38
  true
39
39
  end
40
-
40
+
41
41
  def unbind
42
42
  super
43
43
  EventMachine.add_timer(rand(2)) { reconnect(@backend.host, @backend.port) } if @backend.running?
44
44
  end
45
-
45
+
46
46
  protected
47
47
  def swiftiply_handshake(key)
48
- 'swiftclient' << host_ip.collect { |x| sprintf('%02x', x.to_i)}.join << sprintf('%04x', @backend.port) << sprintf('%02x', key.length) << key
48
+ 'swiftclient' << host_ip.collect { |x| sprintf('%02x', x.to_i) }.join << sprintf('%04x', @backend.port) << sprintf('%02x', key.length) << key
49
49
  end
50
-
50
+
51
51
  # For some reason Swiftiply request the current host
52
52
  def host_ip
53
- Socket.gethostbyname(@backend.host)[3].unpack('CCCC') rescue [0,0,0,0]
53
+ Socket.gethostbyname(@backend.host)[3].unpack('CCCC') rescue [0, 0, 0, 0]
54
54
  end
55
55
  end
56
56
  end
@@ -55,7 +55,7 @@ module Thin
55
55
  # ssl support
56
56
  if @options[:ssl]
57
57
  server.ssl = true
58
- server.ssl_options = { :private_key_file => @options[:ssl_key_file], :cert_chain_file => @options[:ssl_cert_file], :verify_peer => true }
58
+ server.ssl_options = { :private_key_file => @options[:ssl_key_file], :cert_chain_file => @options[:ssl_cert_file], :verify_peer => !@options[:ssl_disable_verify] }
59
59
  end
60
60
 
61
61
  # Detach the process, after this line the current process returns
@@ -12,11 +12,11 @@ module Thin
12
12
  MAX_BODY = 1024 * (80 + 32)
13
13
  BODY_TMPFILE = 'thin-body'.freeze
14
14
  MAX_HEADER = 1024 * (80 + 32)
15
-
15
+
16
16
  INITIAL_BODY = ''
17
17
  # Force external_encoding of request's body to ASCII_8BIT
18
18
  INITIAL_BODY.encode!(Encoding::ASCII_8BIT) if INITIAL_BODY.respond_to?(:encode!)
19
-
19
+
20
20
  # Freeze some HTTP header names & values
21
21
  SERVER_SOFTWARE = 'SERVER_SOFTWARE'.freeze
22
22
  SERVER_NAME = 'SERVER_NAME'.freeze
@@ -30,7 +30,7 @@ module Thin
30
30
  KEEP_ALIVE_REGEXP = /\bkeep-alive\b/i.freeze
31
31
  CLOSE_REGEXP = /\bclose\b/i.freeze
32
32
  HEAD = 'HEAD'.freeze
33
-
33
+
34
34
  # Freeze some Rack header names
35
35
  RACK_INPUT = 'rack.input'.freeze
36
36
  RACK_VERSION = 'rack.version'.freeze
@@ -135,7 +135,7 @@ module Thin
135
135
  @env[ASYNC_CALLBACK] = callback
136
136
  @env[ASYNC_CLOSE] = EventMachine::DefaultDeferrable.new
137
137
  end
138
-
138
+
139
139
  def async_close
140
140
  @async_close ||= @env[ASYNC_CLOSE]
141
141
  end
@@ -146,7 +146,7 @@ module Thin
146
146
 
147
147
  # Close any resource used by the request
148
148
  def close
149
- @body.delete if @body.class == Tempfile
149
+ @body.close! if @body.class == Tempfile
150
150
  end
151
151
 
152
152
  private
@@ -35,7 +35,7 @@ module Thin
35
35
  def headers_output
36
36
  # Set default headers
37
37
  @headers[CONNECTION] = persistent? ? KEEP_ALIVE : CLOSE unless @headers.has_key?(CONNECTION)
38
- @headers[SERVER] = Thin::SERVER unless @headers.has_key?(SERVER)
38
+ @headers[SERVER] = Thin::NAME unless @headers.has_key?(SERVER)
39
39
 
40
40
  @headers.to_s
41
41
  end
@@ -79,6 +79,7 @@ module Thin
79
79
  opts.on( "--ssl", "Enables SSL") { @options[:ssl] = true }
80
80
  opts.on( "--ssl-key-file PATH", "Path to private key") { |path| @options[:ssl_key_file] = path }
81
81
  opts.on( "--ssl-cert-file PATH", "Path to certificate") { |path| @options[:ssl_cert_file] = path }
82
+ opts.on( "--ssl-disable-verify", "Disables (optional) client cert requests") { @options[:ssl_disable_verify] = true }
82
83
 
83
84
  opts.separator ""
84
85
  opts.separator "Adapter options:"
@@ -158,7 +158,7 @@ module Thin
158
158
 
159
159
  log_info "Maximum connections set to #{@backend.maximum_connections}"
160
160
  log_info "Listening on #{@backend}, CTRL+C to stop"
161
-
161
+
162
162
  @backend.start { setup_signals if @setup_signals }
163
163
  end
164
164
  alias :start! :start
@@ -185,7 +185,13 @@ module Thin
185
185
  # This doesn't wait for connection to finish their work and send data.
186
186
  # All current requests will be dropped.
187
187
  def stop!
188
- log_info "Stopping ..."
188
+ if @backend.started_reactor?
189
+ log_info "Stopping ..."
190
+ else
191
+ log_info "Stopping Thin ..."
192
+ log_info "Thin was started inside an existing EventMachine.run block."
193
+ log_info "Call `EventMachine.stop` to stop the reactor and quit the process."
194
+ end
189
195
 
190
196
  @backend.stop!
191
197
  end
@@ -32,7 +32,8 @@ module Thin
32
32
  412 => 'Precondition Failed',
33
33
  413 => 'Request Entity Too Large',
34
34
  414 => 'Request-URI Too Large',
35
- 415 => 'Unsupported Media Type',
35
+ 415 => 'Unsupported Media Type',
36
+ 422 => 'Unprocessable Entity',
36
37
  500 => 'Internal Server Error',
37
38
  501 => 'Not Implemented',
38
39
  502 => 'Bad Gateway',
@@ -6,11 +6,11 @@ module Thin
6
6
  module VERSION #:nodoc:
7
7
  MAJOR = 1
8
8
  MINOR = 6
9
- TINY = 2
9
+ TINY = 3
10
10
 
11
11
  STRING = [MAJOR, MINOR, TINY].join('.')
12
12
 
13
- CODENAME = "Doc Brown".freeze
13
+ CODENAME = "Protein Powder".freeze
14
14
 
15
15
  RACK = [1, 0].freeze # Rack protocol version
16
16
  end
metadata CHANGED
@@ -1,55 +1,61 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thin
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.2
4
+ version: 1.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marc-Andre Cournoyer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-04 00:00:00.000000000 Z
11
+ date: 2014-10-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.0.0
19
+ version: '1.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.0.0
26
+ version: '1.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: eventmachine
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.0.0
33
+ version: '1.0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 1.0.0
40
+ version: '1.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: daemons
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ - - ">="
46
49
  - !ruby/object:Gem::Version
47
50
  version: 1.0.9
48
51
  type: :runtime
49
52
  prerelease: false
50
53
  version_requirements: !ruby/object:Gem::Requirement
51
54
  requirements:
52
- - - '>='
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '1.0'
58
+ - - ">="
53
59
  - !ruby/object:Gem::Version
54
60
  version: 1.0.9
55
61
  description: A thin and fast web server
@@ -77,8 +83,16 @@ files:
77
83
  - example/thin_solaris_smf.erb
78
84
  - example/thin_solaris_smf.readme.txt
79
85
  - example/vlad.rake
86
+ - ext/thin_parser/common.rl
87
+ - ext/thin_parser/ext_help.h
88
+ - ext/thin_parser/extconf.rb
89
+ - ext/thin_parser/parser.c
90
+ - ext/thin_parser/parser.h
91
+ - ext/thin_parser/parser.rl
92
+ - ext/thin_parser/thin.c
80
93
  - lib/rack/adapter/loader.rb
81
94
  - lib/rack/adapter/rails.rb
95
+ - lib/thin.rb
82
96
  - lib/thin/backends/base.rb
83
97
  - lib/thin/backends/swiftiply_client.rb
84
98
  - lib/thin/backends/tcp_server.rb
@@ -100,17 +114,10 @@ files:
100
114
  - lib/thin/stats.rb
101
115
  - lib/thin/statuses.rb
102
116
  - lib/thin/version.rb
103
- - lib/thin.rb
104
- - ext/thin_parser/ext_help.h
105
- - ext/thin_parser/parser.h
106
- - ext/thin_parser/parser.c
107
- - ext/thin_parser/thin.c
108
- - ext/thin_parser/extconf.rb
109
- - ext/thin_parser/common.rl
110
- - ext/thin_parser/parser.rl
111
117
  homepage: http://code.macournoyer.com/thin/
112
118
  licenses:
113
- - Ruby
119
+ - GPLv2+
120
+ - Ruby 1.8
114
121
  metadata: {}
115
122
  post_install_message:
116
123
  rdoc_options: []
@@ -118,17 +125,17 @@ require_paths:
118
125
  - lib
119
126
  required_ruby_version: !ruby/object:Gem::Requirement
120
127
  requirements:
121
- - - '>='
128
+ - - ">="
122
129
  - !ruby/object:Gem::Version
123
130
  version: 1.8.5
124
131
  required_rubygems_version: !ruby/object:Gem::Requirement
125
132
  requirements:
126
- - - '>='
133
+ - - ">="
127
134
  - !ruby/object:Gem::Version
128
135
  version: '0'
129
136
  requirements: []
130
137
  rubyforge_project: thin
131
- rubygems_version: 2.0.0
138
+ rubygems_version: 2.2.2
132
139
  signing_key:
133
140
  specification_version: 4
134
141
  summary: A thin and fast web server