thin 1.2.4 → 1.2.5
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/CHANGELOG +5 -0
- data/Rakefile +7 -4
- data/example/thin.god +1 -1
- data/ext/thin_parser/common.rl +1 -1
- data/ext/thin_parser/parser.c +1026 -293
- data/ext/thin_parser/thin.c +3 -0
- data/lib/rack/adapter/rails.rb +2 -3
- data/lib/thin/controllers/cluster.rb +57 -6
- data/lib/thin/request.rb +6 -2
- data/lib/thin/runner.rb +5 -2
- data/lib/thin/version.rb +2 -2
- data/spec/controllers/cluster_spec.rb +32 -0
- data/spec/request/parser_spec.rb +29 -1
- data/spec/request/processing_spec.rb +4 -0
- data/spec/spec_helper.rb +1 -1
- data/tasks/gem.rake +5 -13
- data/tasks/spec.rake +39 -45
- metadata +6 -33
data/ext/thin_parser/thin.c
CHANGED
@@ -207,6 +207,9 @@ static void header_done(void *data, const char *at, size_t length)
|
|
207
207
|
if (rb_hash_aref(req, global_query_string) == Qnil) {
|
208
208
|
rb_hash_aset(req, global_query_string, global_empty);
|
209
209
|
}
|
210
|
+
if (rb_hash_aref(req, global_path_info) == Qnil) {
|
211
|
+
rb_hash_aset(req, global_path_info, global_empty);
|
212
|
+
}
|
210
213
|
|
211
214
|
/* set some constants */
|
212
215
|
rb_hash_aset(req, global_server_protocol, global_server_protocol_value);
|
data/lib/rack/adapter/rails.rb
CHANGED
@@ -32,9 +32,8 @@ module Rack
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def rack_based?
|
35
|
-
|
36
|
-
|
37
|
-
ActionController::Dispatcher.instance_methods.include?("call"))
|
35
|
+
rails_version = ::Rails::VERSION
|
36
|
+
rails_version::MAJOR >= 2 && rails_version::MINOR >= 2 && rails_version::TINY >= 3
|
38
37
|
end
|
39
38
|
|
40
39
|
def load_application
|
@@ -1,4 +1,9 @@
|
|
1
|
+
require 'socket'
|
2
|
+
|
1
3
|
module Thin
|
4
|
+
# An exception class to handle the event that server didn't start on time
|
5
|
+
class RestartTimeout < RuntimeError; end
|
6
|
+
|
2
7
|
module Controllers
|
3
8
|
# Control a set of servers.
|
4
9
|
# * Generate start and stop commands and run them.
|
@@ -7,7 +12,10 @@ module Thin
|
|
7
12
|
class Cluster < Controller
|
8
13
|
# Cluster only options that should not be passed in the command sent
|
9
14
|
# to the indiviual servers.
|
10
|
-
CLUSTER_OPTIONS = [:servers, :only]
|
15
|
+
CLUSTER_OPTIONS = [:servers, :only, :onebyone, :wait]
|
16
|
+
|
17
|
+
# Maximum wait time for the server to be restarted
|
18
|
+
DEFAULT_WAIT_TIME = 30 # seconds
|
11
19
|
|
12
20
|
# Create a new cluster of servers launched using +options+.
|
13
21
|
def initialize(options)
|
@@ -15,7 +23,7 @@ module Thin
|
|
15
23
|
# Cluster can only contain daemonized servers
|
16
24
|
@options.merge!(:daemonize => true)
|
17
25
|
end
|
18
|
-
|
26
|
+
|
19
27
|
def first_port; @options[:port] end
|
20
28
|
def address; @options[:address] end
|
21
29
|
def socket; @options[:socket] end
|
@@ -23,7 +31,9 @@ module Thin
|
|
23
31
|
def log_file; @options[:log] end
|
24
32
|
def size; @options[:servers] end
|
25
33
|
def only; @options[:only] end
|
26
|
-
|
34
|
+
def onebyone; @options[:onebyone] end
|
35
|
+
def wait; @options[:wait] end
|
36
|
+
|
27
37
|
def swiftiply?
|
28
38
|
@options.has_key?(:swiftiply)
|
29
39
|
end
|
@@ -54,9 +64,50 @@ module Thin
|
|
54
64
|
|
55
65
|
# Stop and start the servers.
|
56
66
|
def restart
|
57
|
-
|
58
|
-
|
59
|
-
|
67
|
+
unless onebyone
|
68
|
+
# Let's do a normal restart by defaults
|
69
|
+
stop
|
70
|
+
sleep 0.1 # Let's breath a bit shall we ?
|
71
|
+
start
|
72
|
+
else
|
73
|
+
with_each_server do |n|
|
74
|
+
stop_server(n)
|
75
|
+
sleep 0.1 # Let's breath a bit shall we ?
|
76
|
+
start_server(n)
|
77
|
+
wait_until_server_started(n)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_socket(number)
|
83
|
+
if socket
|
84
|
+
UNIXSocket.new(socket_for(number))
|
85
|
+
else
|
86
|
+
TCPSocket.new(address, number)
|
87
|
+
end
|
88
|
+
rescue
|
89
|
+
nil
|
90
|
+
end
|
91
|
+
|
92
|
+
# Make sure the server is running before moving on to the next one.
|
93
|
+
def wait_until_server_started(number)
|
94
|
+
log "Waiting for server to start ..."
|
95
|
+
STDOUT.flush # Need this to make sure user got the message
|
96
|
+
|
97
|
+
tries = 0
|
98
|
+
loop do
|
99
|
+
if test_socket = test_socket(number)
|
100
|
+
test_socket.close
|
101
|
+
break
|
102
|
+
elsif tries < wait
|
103
|
+
sleep 1
|
104
|
+
tries += 1
|
105
|
+
else
|
106
|
+
raise RestartTimeout, "The server didn't start in time. Please look at server's log file " +
|
107
|
+
"for more information, or set the value of 'wait' in your config " +
|
108
|
+
"file to be higher (defaults: 30)."
|
109
|
+
end
|
110
|
+
end
|
60
111
|
end
|
61
112
|
|
62
113
|
def server_id(number)
|
data/lib/thin/request.rb
CHANGED
@@ -13,7 +13,11 @@ module Thin
|
|
13
13
|
MAX_BODY = 1024 * (80 + 32)
|
14
14
|
BODY_TMPFILE = 'thin-body'.freeze
|
15
15
|
MAX_HEADER = 1024 * (80 + 32)
|
16
|
-
|
16
|
+
|
17
|
+
INITIAL_BODY = ''
|
18
|
+
# Force external_encoding of request's body to ASCII_8BIT
|
19
|
+
INITIAL_BODY.encode!(Encoding::ASCII_8BIT) if INITIAL_BODY.respond_to?(:encode)
|
20
|
+
|
17
21
|
# Freeze some HTTP header names & values
|
18
22
|
SERVER_SOFTWARE = 'SERVER_SOFTWARE'.freeze
|
19
23
|
SERVER_NAME = 'SERVER_NAME'.freeze
|
@@ -49,7 +53,7 @@ module Thin
|
|
49
53
|
@parser = Thin::HttpParser.new
|
50
54
|
@data = ''
|
51
55
|
@nparsed = 0
|
52
|
-
@body = StringIO.new
|
56
|
+
@body = StringIO.new(INITIAL_BODY.dup)
|
53
57
|
@env = {
|
54
58
|
SERVER_SOFTWARE => SERVER,
|
55
59
|
SERVER_NAME => LOCALHOST,
|
data/lib/thin/runner.rb
CHANGED
@@ -41,7 +41,8 @@ module Thin
|
|
41
41
|
:pid => 'tmp/pids/thin.pid',
|
42
42
|
:max_conns => Server::DEFAULT_MAXIMUM_CONNECTIONS,
|
43
43
|
:max_persistent_conns => Server::DEFAULT_MAXIMUM_PERSISTENT_CONNECTIONS,
|
44
|
-
:require => []
|
44
|
+
:require => [],
|
45
|
+
:wait => Controllers::Cluster::DEFAULT_WAIT_TIME
|
45
46
|
}
|
46
47
|
|
47
48
|
parse!
|
@@ -96,6 +97,8 @@ module Thin
|
|
96
97
|
opts.on("-o", "--only NUM", "Send command to only one server of the cluster") { |only| @options[:only] = only.to_i }
|
97
98
|
opts.on("-C", "--config FILE", "Load options from config file") { |file| @options[:config] = file }
|
98
99
|
opts.on( "--all [DIR]", "Send command to each config files in DIR") { |dir| @options[:all] = dir } if Thin.linux?
|
100
|
+
opts.on("-O", "--onebyone", "Restart the cluster one by one (only works with restart command)") { @options[:onebyone] = true }
|
101
|
+
opts.on("-w", "--wait NUM", "Maximum wait time for server to be started in seconds (use with -O)") { |time| @options[:wait] = time.to_i }
|
99
102
|
end
|
100
103
|
|
101
104
|
opts.separator ""
|
@@ -105,7 +108,7 @@ module Thin
|
|
105
108
|
opts.on("-t", "--timeout SEC", "Request or command timeout in sec " +
|
106
109
|
"(default: #{@options[:timeout]})") { |sec| @options[:timeout] = sec.to_i }
|
107
110
|
opts.on("-f", "--force", "Force the execution of the command") { @options[:force] = true }
|
108
|
-
opts.on( "--max-conns NUM", "Maximum number of
|
111
|
+
opts.on( "--max-conns NUM", "Maximum number of open file descriptors " +
|
109
112
|
"(default: #{@options[:max_conns]})",
|
110
113
|
"Might require sudo to set higher then 1024") { |num| @options[:max_conns] = num.to_i } unless Thin.win?
|
111
114
|
opts.on( "--max-persistent-conns NUM",
|
data/lib/thin/version.rb
CHANGED
@@ -6,11 +6,11 @@ module Thin
|
|
6
6
|
module VERSION #:nodoc:
|
7
7
|
MAJOR = 1
|
8
8
|
MINOR = 2
|
9
|
-
TINY =
|
9
|
+
TINY = 5
|
10
10
|
|
11
11
|
STRING = [MAJOR, MINOR, TINY].join('.')
|
12
12
|
|
13
|
-
CODENAME = "
|
13
|
+
CODENAME = "This Is Not A Web Server".freeze
|
14
14
|
|
15
15
|
RACK = [1, 0].freeze # Rack protocol version
|
16
16
|
end
|
@@ -232,4 +232,36 @@ describe Cluster, "with Swiftiply" do
|
|
232
232
|
def options_for_swiftiply(number)
|
233
233
|
{ :address => '0.0.0.0', :port => 3000, :daemonize => true, :log => "thin.#{number}.log", :timeout => 10, :pid => "thin.#{number}.pid", :chdir => "/rails_app", :swiftiply => true }
|
234
234
|
end
|
235
|
+
end
|
236
|
+
|
237
|
+
describe Cluster, "rolling restart" do
|
238
|
+
before do
|
239
|
+
@cluster = Cluster.new(:chdir => '/rails_app',
|
240
|
+
:address => '0.0.0.0',
|
241
|
+
:port => 3000,
|
242
|
+
:servers => 2,
|
243
|
+
:timeout => 10,
|
244
|
+
:log => 'thin.log',
|
245
|
+
:pid => 'thin.pid',
|
246
|
+
:onebyone => true,
|
247
|
+
:wait => 30
|
248
|
+
)
|
249
|
+
end
|
250
|
+
|
251
|
+
it "should restart servers one by one" do
|
252
|
+
Command.should_receive(:run).with(:stop, options_for_port(3000))
|
253
|
+
Command.should_receive(:run).with(:start, options_for_port(3000))
|
254
|
+
@cluster.should_receive(:wait_until_server_started).with(3000)
|
255
|
+
|
256
|
+
Command.should_receive(:run).with(:stop, options_for_port(3001))
|
257
|
+
Command.should_receive(:run).with(:start, options_for_port(3001))
|
258
|
+
@cluster.should_receive(:wait_until_server_started).with(3001)
|
259
|
+
|
260
|
+
@cluster.restart
|
261
|
+
end
|
262
|
+
|
263
|
+
private
|
264
|
+
def options_for_port(port)
|
265
|
+
{ :daemonize => true, :log => "thin.#{port}.log", :timeout => 10, :address => "0.0.0.0", :port => port, :pid => "thin.#{port}.pid", :chdir => "/rails_app" }
|
266
|
+
end
|
235
267
|
end
|
data/spec/request/parser_spec.rb
CHANGED
@@ -209,7 +209,35 @@ EOS
|
|
209
209
|
parser = HttpParser.new
|
210
210
|
req = {}
|
211
211
|
nread = parser.execute(req, req_str, 0)
|
212
|
-
req.should
|
212
|
+
req.should have_key('HTTP_HOS_T')
|
213
213
|
}
|
214
214
|
end
|
215
|
+
|
216
|
+
it "should parse PATH_INFO with semicolon" do
|
217
|
+
qs = "QUERY_STRING"
|
218
|
+
pi = "PATH_INFO"
|
219
|
+
{
|
220
|
+
"/1;a=b?c=d&e=f" => { qs => "c=d&e=f", pi => "/1;a=b" },
|
221
|
+
"/1?c=d&e=f" => { qs => "c=d&e=f", pi => "/1" },
|
222
|
+
"/1;a=b" => { qs => "", pi => "/1;a=b" },
|
223
|
+
"/1;a=b?" => { qs => "", pi => "/1;a=b" },
|
224
|
+
"/1?a=b;c=d&e=f" => { qs => "a=b;c=d&e=f", pi => "/1" },
|
225
|
+
"*" => { qs => "", pi => "" },
|
226
|
+
}.each do |uri, expect|
|
227
|
+
parser = HttpParser.new
|
228
|
+
env = {}
|
229
|
+
nread = parser.execute(env, "GET #{uri} HTTP/1.1\r\nHost: www.example.com\r\n\r\n", 0)
|
230
|
+
|
231
|
+
env[pi].should == expect[pi]
|
232
|
+
env[qs].should == expect[qs]
|
233
|
+
env["REQUEST_URI"].should == uri
|
234
|
+
|
235
|
+
next if uri == "*"
|
236
|
+
|
237
|
+
# Validate w/ Ruby's URI.parse
|
238
|
+
uri = URI.parse("http://example.com#{uri}")
|
239
|
+
env[qs].should == uri.query.to_s
|
240
|
+
env[pi].should == uri.path
|
241
|
+
end
|
242
|
+
end
|
215
243
|
end
|
@@ -42,4 +42,8 @@ describe Request, 'processing' do
|
|
42
42
|
big_headers = "X-Test: X\r\n" * (1024 * (80 + 32))
|
43
43
|
proc { R("GET / HTTP/1.1\r\n#{big_headers}\r\n") }.should raise_error(InvalidRequest)
|
44
44
|
end
|
45
|
+
|
46
|
+
it "should set body external encoding to ASCII_8BIT" do
|
47
|
+
Request.new.body.external_encoding.should == Encoding::ASCII_8BIT
|
48
|
+
end
|
45
49
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -4,7 +4,6 @@ require 'spec'
|
|
4
4
|
require 'benchmark'
|
5
5
|
require 'timeout'
|
6
6
|
require 'fileutils'
|
7
|
-
require 'benchmark_unit'
|
8
7
|
require 'net/http'
|
9
8
|
require 'socket'
|
10
9
|
|
@@ -23,6 +22,7 @@ end
|
|
23
22
|
module Matchers
|
24
23
|
class BeFasterThen
|
25
24
|
def initialize(max_time)
|
25
|
+
require 'benchmark_unit'
|
26
26
|
@max_time = max_time
|
27
27
|
end
|
28
28
|
|
data/tasks/gem.rake
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
require 'rake/gempackagetask'
|
2
2
|
require 'yaml'
|
3
3
|
|
4
|
-
WIN_SUFFIX = ENV['WIN_SUFFIX'] || 'x86-mswin32'
|
5
|
-
|
6
4
|
task :clean => :clobber_package
|
7
5
|
|
8
6
|
Thin::GemSpec = Gem::Specification.new do |s|
|
@@ -59,16 +57,10 @@ end
|
|
59
57
|
task :gem => :tag_warn
|
60
58
|
|
61
59
|
namespace :gem do
|
62
|
-
desc
|
63
|
-
task :
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
desc 'Upload gems (ruby & win32) to rubyforge.org'
|
68
|
-
task :upload => :gem do
|
69
|
-
sh 'rubyforge login'
|
70
|
-
sh "rubyforge add_release thin thin #{Thin::VERSION::STRING} pkg/#{Thin::GemSpec.full_name}.gem"
|
71
|
-
sh "rubyforge add_file thin thin #{Thin::VERSION::STRING} pkg/#{Thin::GemSpec.full_name}.gem"
|
72
|
-
sh "rubyforge add_file thin thin #{Thin::VERSION::STRING} pkg/#{Thin::GemSpec.full_name}-#{WIN_SUFFIX}.gem"
|
60
|
+
desc 'Upload gems to gemcutter.org'
|
61
|
+
task :push => :gem do
|
62
|
+
Dir["pkg/#{Thin::GemSpec.full_name}*.gem"].each do |file|
|
63
|
+
puts "gem push #{file}"
|
64
|
+
end
|
73
65
|
end
|
74
66
|
end
|
data/tasks/spec.rake
CHANGED
@@ -1,49 +1,43 @@
|
|
1
1
|
CLEAN.include %w(coverage tmp log)
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
def spec_task(name, specs)
|
25
|
-
Spec::Rake::SpecTask.new(name) do |t|
|
26
|
-
t.libs << 'lib'
|
27
|
-
t.spec_opts = %w(-fs -c)
|
28
|
-
t.spec_files = specs
|
29
|
-
end
|
3
|
+
require 'spec/rake/spectask'
|
4
|
+
|
5
|
+
PERF_SPECS = FileList['spec/perf/*_spec.rb']
|
6
|
+
WIN_SPECS = %w(
|
7
|
+
spec/backends/unix_server_spec.rb
|
8
|
+
spec/controllers/service_spec.rb
|
9
|
+
spec/daemonizing_spec.rb
|
10
|
+
spec/server/unix_socket_spec.rb
|
11
|
+
spec/server/swiftiply_spec.rb
|
12
|
+
)
|
13
|
+
# HACK Event machine causes some problems when running multiple
|
14
|
+
# tests in the same VM so we split the specs in 2 before I find
|
15
|
+
# a better solution...
|
16
|
+
SPECS2 = %w(spec/server/threaded_spec.rb spec/server/tcp_spec.rb)
|
17
|
+
SPECS = FileList['spec/**/*_spec.rb'] - PERF_SPECS - SPECS2
|
18
|
+
|
19
|
+
def spec_task(name, specs)
|
20
|
+
Spec::Rake::SpecTask.new(name) do |t|
|
21
|
+
t.libs << 'lib'
|
22
|
+
t.spec_opts = %w(-fs -c)
|
23
|
+
t.spec_files = specs
|
30
24
|
end
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
25
|
+
end
|
26
|
+
|
27
|
+
desc "Run all examples"
|
28
|
+
spec_task :spec, SPECS
|
29
|
+
spec_task :spec2, SPECS2
|
30
|
+
task :spec => [:compile, :spec2]
|
31
|
+
|
32
|
+
desc "Run all performance examples"
|
33
|
+
spec_task 'spec:perf', PERF_SPECS
|
34
|
+
|
35
|
+
task :check_benchmark_unit_gem do
|
36
|
+
begin
|
37
|
+
require 'benchmark_unit'
|
38
|
+
rescue LoadError
|
39
|
+
abort "To run specs, install benchmark_unit gem"
|
46
40
|
end
|
47
|
-
|
48
|
-
|
49
|
-
|
41
|
+
end
|
42
|
+
|
43
|
+
task 'spec:perf' => :check_benchmark_unit_gem
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: thin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marc-Andre Cournoyer
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-12-13 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -72,19 +72,14 @@ files:
|
|
72
72
|
- example/thin_solaris_smf.erb
|
73
73
|
- example/thin_solaris_smf.readme.txt
|
74
74
|
- example/vlad.rake
|
75
|
-
- lib/rack
|
76
|
-
- lib/rack/adapter
|
77
75
|
- lib/rack/adapter/loader.rb
|
78
76
|
- lib/rack/adapter/rails.rb
|
79
|
-
- lib/thin
|
80
|
-
- lib/thin/backends
|
81
77
|
- lib/thin/backends/base.rb
|
82
78
|
- lib/thin/backends/swiftiply_client.rb
|
83
79
|
- lib/thin/backends/tcp_server.rb
|
84
80
|
- lib/thin/backends/unix_server.rb
|
85
81
|
- lib/thin/command.rb
|
86
82
|
- lib/thin/connection.rb
|
87
|
-
- lib/thin/controllers
|
88
83
|
- lib/thin/controllers/cluster.rb
|
89
84
|
- lib/thin/controllers/controller.rb
|
90
85
|
- lib/thin/controllers/service.rb
|
@@ -101,53 +96,36 @@ files:
|
|
101
96
|
- lib/thin/statuses.rb
|
102
97
|
- lib/thin/version.rb
|
103
98
|
- lib/thin.rb
|
104
|
-
- spec/backends
|
105
99
|
- spec/backends/swiftiply_client_spec.rb
|
106
100
|
- spec/backends/tcp_server_spec.rb
|
107
101
|
- spec/backends/unix_server_spec.rb
|
108
102
|
- spec/command_spec.rb
|
109
|
-
- spec/configs
|
110
103
|
- spec/configs/cluster.yml
|
111
104
|
- spec/configs/single.yml
|
112
105
|
- spec/connection_spec.rb
|
113
|
-
- spec/controllers
|
114
106
|
- spec/controllers/cluster_spec.rb
|
115
107
|
- spec/controllers/controller_spec.rb
|
116
108
|
- spec/controllers/service_spec.rb
|
117
109
|
- spec/daemonizing_spec.rb
|
118
110
|
- spec/headers_spec.rb
|
119
111
|
- spec/logging_spec.rb
|
120
|
-
- spec/perf
|
121
112
|
- spec/perf/request_perf_spec.rb
|
122
113
|
- spec/perf/response_perf_spec.rb
|
123
114
|
- spec/perf/server_perf_spec.rb
|
124
|
-
- spec/rack
|
125
115
|
- spec/rack/loader_spec.rb
|
126
116
|
- spec/rack/rails_adapter_spec.rb
|
127
|
-
- spec/rails_app
|
128
|
-
- spec/rails_app/app
|
129
|
-
- spec/rails_app/app/controllers
|
130
117
|
- spec/rails_app/app/controllers/application.rb
|
131
118
|
- spec/rails_app/app/controllers/simple_controller.rb
|
132
|
-
- spec/rails_app/app/helpers
|
133
119
|
- spec/rails_app/app/helpers/application_helper.rb
|
134
|
-
- spec/rails_app/app/views
|
135
|
-
- spec/rails_app/app/views/simple
|
136
120
|
- spec/rails_app/app/views/simple/index.html.erb
|
137
|
-
- spec/rails_app/config
|
138
121
|
- spec/rails_app/config/boot.rb
|
139
122
|
- spec/rails_app/config/environment.rb
|
140
|
-
- spec/rails_app/config/environments
|
141
123
|
- spec/rails_app/config/environments/development.rb
|
142
124
|
- spec/rails_app/config/environments/production.rb
|
143
125
|
- spec/rails_app/config/environments/test.rb
|
144
|
-
- spec/rails_app/config/initializers
|
145
126
|
- spec/rails_app/config/initializers/inflections.rb
|
146
127
|
- spec/rails_app/config/initializers/mime_types.rb
|
147
128
|
- spec/rails_app/config/routes.rb
|
148
|
-
- spec/rails_app/log
|
149
|
-
- spec/rails_app/log/mongrel_debug
|
150
|
-
- spec/rails_app/public
|
151
129
|
- spec/rails_app/public/404.html
|
152
130
|
- spec/rails_app/public/422.html
|
153
131
|
- spec/rails_app/public/500.html
|
@@ -155,40 +133,33 @@ files:
|
|
155
133
|
- spec/rails_app/public/dispatch.fcgi
|
156
134
|
- spec/rails_app/public/dispatch.rb
|
157
135
|
- spec/rails_app/public/favicon.ico
|
158
|
-
- spec/rails_app/public/images
|
159
136
|
- spec/rails_app/public/images/rails.png
|
160
137
|
- spec/rails_app/public/index.html
|
161
|
-
- spec/rails_app/public/javascripts
|
162
138
|
- spec/rails_app/public/javascripts/application.js
|
163
139
|
- spec/rails_app/public/javascripts/controls.js
|
164
140
|
- spec/rails_app/public/javascripts/dragdrop.js
|
165
141
|
- spec/rails_app/public/javascripts/effects.js
|
166
142
|
- spec/rails_app/public/javascripts/prototype.js
|
167
143
|
- spec/rails_app/public/robots.txt
|
168
|
-
- spec/rails_app/script
|
169
144
|
- spec/rails_app/script/about
|
170
145
|
- spec/rails_app/script/console
|
171
146
|
- spec/rails_app/script/destroy
|
172
147
|
- spec/rails_app/script/generate
|
173
|
-
- spec/rails_app/script/performance
|
174
148
|
- spec/rails_app/script/performance/benchmarker
|
175
149
|
- spec/rails_app/script/performance/profiler
|
176
150
|
- spec/rails_app/script/performance/request
|
177
151
|
- spec/rails_app/script/plugin
|
178
|
-
- spec/rails_app/script/process
|
179
152
|
- spec/rails_app/script/process/inspector
|
180
153
|
- spec/rails_app/script/process/reaper
|
181
154
|
- spec/rails_app/script/process/spawner
|
182
155
|
- spec/rails_app/script/runner
|
183
156
|
- spec/rails_app/script/server
|
184
|
-
- spec/request
|
185
157
|
- spec/request/mongrel_spec.rb
|
186
158
|
- spec/request/parser_spec.rb
|
187
159
|
- spec/request/persistent_spec.rb
|
188
160
|
- spec/request/processing_spec.rb
|
189
161
|
- spec/response_spec.rb
|
190
162
|
- spec/runner_spec.rb
|
191
|
-
- spec/server
|
192
163
|
- spec/server/builder_spec.rb
|
193
164
|
- spec/server/pipelining_spec.rb
|
194
165
|
- spec/server/robustness_spec.rb
|
@@ -217,6 +188,8 @@ files:
|
|
217
188
|
- ext/thin_parser/parser.rl
|
218
189
|
has_rdoc: true
|
219
190
|
homepage: http://code.macournoyer.com/thin/
|
191
|
+
licenses: []
|
192
|
+
|
220
193
|
post_install_message:
|
221
194
|
rdoc_options: []
|
222
195
|
|
@@ -237,9 +210,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
237
210
|
requirements: []
|
238
211
|
|
239
212
|
rubyforge_project: thin
|
240
|
-
rubygems_version: 1.3.
|
213
|
+
rubygems_version: 1.3.5
|
241
214
|
signing_key:
|
242
|
-
specification_version:
|
215
|
+
specification_version: 3
|
243
216
|
summary: A thin and fast web server
|
244
217
|
test_files: []
|
245
218
|
|