mongrel 0.3.13.1 → 0.3.13.2
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/Rakefile +3 -1
- data/doc/rdoc/classes/Mongrel.html +3 -2
- data/doc/rdoc/classes/Mongrel/CGIWrapper.html +49 -49
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000101.html +11 -14
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000102.html +34 -12
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000103.html +21 -5
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000104.html +14 -5
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000105.html +12 -5
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000106.html +5 -6
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000107.html +18 -0
- data/doc/rdoc/classes/Mongrel/{URIClassifier.src/M000090.html → CGIWrapper.src/M000108.html} +5 -5
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000109.html +19 -0
- data/doc/rdoc/classes/Mongrel/Camping.html +5 -5
- data/doc/rdoc/classes/Mongrel/Camping.src/{M000047.html → M000048.html} +0 -0
- data/doc/rdoc/classes/Mongrel/Camping/CampingHandler.html +10 -10
- data/doc/rdoc/classes/Mongrel/Camping/CampingHandler.src/M000049.html +5 -38
- data/doc/rdoc/classes/Mongrel/Camping/CampingHandler.src/M000050.html +51 -0
- data/doc/rdoc/classes/Mongrel/Command/Base.html +65 -65
- data/doc/rdoc/classes/Mongrel/Command/Base.src/M000026.html +11 -29
- data/doc/rdoc/classes/Mongrel/Command/Base.src/M000027.html +29 -5
- data/doc/rdoc/classes/Mongrel/Command/Base.src/M000028.html +5 -5
- data/doc/rdoc/classes/Mongrel/Command/Base.src/M000029.html +5 -5
- data/doc/rdoc/classes/Mongrel/Command/Base.src/M000030.html +5 -5
- data/doc/rdoc/classes/Mongrel/Command/Base.src/M000031.html +5 -9
- data/doc/rdoc/classes/Mongrel/Command/Base.src/M000032.html +9 -5
- data/doc/rdoc/classes/Mongrel/Command/Base.src/M000033.html +5 -5
- data/doc/rdoc/classes/Mongrel/Command/Base.src/M000034.html +5 -5
- data/doc/rdoc/classes/Mongrel/Command/Base.src/M000035.html +5 -11
- data/doc/rdoc/classes/Mongrel/Command/Base.src/M000036.html +11 -11
- data/doc/rdoc/classes/Mongrel/Command/Base.src/M000037.html +11 -5
- data/doc/rdoc/classes/Mongrel/Command/Base.src/M000038.html +18 -0
- data/doc/rdoc/classes/Mongrel/Command/Registry.html +15 -15
- data/doc/rdoc/classes/Mongrel/Command/Registry.src/M000039.html +7 -12
- data/doc/rdoc/classes/Mongrel/Command/Registry.src/M000040.html +12 -37
- data/doc/rdoc/classes/Mongrel/Command/Registry.src/M000041.html +50 -0
- data/doc/rdoc/classes/Mongrel/Configurator.html +120 -114
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000110.html +14 -7
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000111.html +18 -10
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000112.html +7 -5
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000113.html +7 -21
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000114.html +10 -6
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000115.html +5 -17
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000116.html +25 -20
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000117.html +6 -5
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000118.html +17 -11
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000119.html +20 -6
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000120.html +5 -5
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000121.html +11 -9
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000122.html +6 -12
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000123.html +5 -5
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000124.html +9 -22
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000125.html +12 -5
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000126.html +5 -20
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000127.html +22 -5
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000128.html +18 -0
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000129.html +33 -0
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000130.html +18 -0
- data/doc/rdoc/classes/Mongrel/Const.html +1 -1
- data/doc/rdoc/classes/Mongrel/DeflateFilter.html +10 -10
- data/doc/rdoc/classes/Mongrel/DeflateFilter.src/{M000096.html → M000099.html} +5 -5
- data/doc/rdoc/classes/Mongrel/DeflateFilter.src/{M000097.html → M000100.html} +14 -14
- data/doc/rdoc/classes/Mongrel/DirHandler.html +31 -31
- data/doc/rdoc/classes/Mongrel/DirHandler.src/M000058.html +8 -30
- data/doc/rdoc/classes/Mongrel/DirHandler.src/M000059.html +30 -29
- data/doc/rdoc/classes/Mongrel/DirHandler.src/M000060.html +29 -50
- data/doc/rdoc/classes/Mongrel/DirHandler.src/M000061.html +50 -26
- data/doc/rdoc/classes/Mongrel/DirHandler.src/M000062.html +26 -5
- data/doc/rdoc/classes/Mongrel/DirHandler.src/M000063.html +18 -0
- data/doc/rdoc/classes/Mongrel/Error404Handler.html +10 -10
- data/doc/rdoc/classes/Mongrel/Error404Handler.src/{M000128.html → M000131.html} +4 -4
- data/doc/rdoc/classes/Mongrel/Error404Handler.src/{M000129.html → M000132.html} +4 -4
- data/doc/rdoc/classes/Mongrel/HeaderOut.html +10 -10
- data/doc/rdoc/classes/Mongrel/HeaderOut.src/{M000070.html → M000072.html} +4 -4
- data/doc/rdoc/classes/Mongrel/HeaderOut.src/{M000071.html → M000073.html} +4 -4
- data/doc/rdoc/classes/Mongrel/HttpHandler.html +31 -10
- data/doc/rdoc/classes/Mongrel/HttpHandler.src/{M000076.html → M000078.html} +0 -0
- data/doc/rdoc/classes/Mongrel/HttpHandler.src/M000079.html +17 -0
- data/doc/rdoc/classes/Mongrel/HttpHandler.src/{M000077.html → M000080.html} +3 -3
- data/doc/rdoc/classes/Mongrel/HttpHandlerPlugin.html +25 -10
- data/doc/rdoc/classes/Mongrel/HttpHandlerPlugin.src/M000022.html +3 -3
- data/doc/rdoc/classes/Mongrel/HttpHandlerPlugin.src/M000023.html +4 -6
- data/doc/rdoc/classes/Mongrel/HttpHandlerPlugin.src/M000024.html +6 -4
- data/doc/rdoc/classes/Mongrel/HttpHandlerPlugin.src/M000025.html +17 -0
- data/doc/rdoc/classes/Mongrel/HttpParser.html +35 -35
- data/doc/rdoc/classes/Mongrel/HttpParser.src/M000051.html +5 -6
- data/doc/rdoc/classes/Mongrel/HttpParser.src/M000052.html +7 -7
- data/doc/rdoc/classes/Mongrel/HttpParser.src/M000053.html +7 -37
- data/doc/rdoc/classes/Mongrel/HttpParser.src/M000054.html +37 -5
- data/doc/rdoc/classes/Mongrel/HttpParser.src/M000055.html +5 -5
- data/doc/rdoc/classes/Mongrel/HttpParser.src/M000056.html +5 -6
- data/doc/rdoc/classes/Mongrel/HttpParser.src/{M000050.html → M000057.html} +6 -6
- data/doc/rdoc/classes/Mongrel/HttpRequest.html +30 -21
- data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000138.html +43 -19
- data/doc/rdoc/classes/Mongrel/HttpRequest.src/{M000136.html → M000139.html} +6 -6
- data/doc/rdoc/classes/Mongrel/HttpRequest.src/{M000137.html → M000140.html} +6 -6
- data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000141.html +32 -0
- data/doc/rdoc/classes/Mongrel/HttpResponse.html +61 -61
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000081.html +12 -9
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000082.html +7 -9
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000083.html +12 -9
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000084.html +9 -18
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000085.html +9 -8
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000086.html +9 -7
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000087.html +18 -7
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000088.html +8 -7
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000089.html +7 -5
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000090.html +20 -0
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000091.html +20 -0
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000092.html +18 -0
- data/doc/rdoc/classes/Mongrel/HttpServer.html +63 -41
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000064.html +12 -76
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000065.html +74 -13
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000066.html +18 -50
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000067.html +8 -21
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000068.html +38 -5
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000069.html +21 -9
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000070.html +18 -0
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000071.html +22 -0
- data/doc/rdoc/classes/Mongrel/Rails/RailsConfigurator.html +15 -15
- data/doc/rdoc/classes/Mongrel/Rails/RailsConfigurator.src/M000042.html +26 -12
- data/doc/rdoc/classes/Mongrel/Rails/RailsConfigurator.src/M000043.html +12 -13
- data/doc/rdoc/classes/Mongrel/Rails/RailsConfigurator.src/M000044.html +26 -0
- data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.html +15 -15
- data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/M000045.html +9 -38
- data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/M000046.html +38 -10
- data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/M000047.html +23 -0
- data/doc/rdoc/classes/Mongrel/RedirectHandler.html +10 -10
- data/doc/rdoc/classes/Mongrel/RedirectHandler.src/{M000133.html → M000136.html} +8 -8
- data/doc/rdoc/classes/Mongrel/RedirectHandler.src/{M000134.html → M000137.html} +13 -13
- data/doc/rdoc/classes/Mongrel/StatisticsFilter.html +16 -16
- data/doc/rdoc/classes/Mongrel/StatisticsFilter.src/{M000130.html → M000133.html} +10 -10
- data/doc/rdoc/classes/Mongrel/StatisticsFilter.src/{M000131.html → M000134.html} +10 -10
- data/doc/rdoc/classes/Mongrel/StatisticsFilter.src/{M000132.html → M000135.html} +4 -4
- data/doc/rdoc/classes/Mongrel/StatusHandler.html +20 -20
- data/doc/rdoc/classes/Mongrel/StatusHandler.src/M000074.html +5 -29
- data/doc/rdoc/classes/Mongrel/StatusHandler.src/M000075.html +11 -7
- data/doc/rdoc/classes/Mongrel/StatusHandler.src/M000076.html +42 -0
- data/doc/rdoc/classes/Mongrel/StatusHandler.src/M000077.html +20 -0
- data/doc/rdoc/classes/Mongrel/TimeoutError.html +117 -0
- data/doc/rdoc/classes/Mongrel/URIClassifier.html +30 -30
- data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000093.html +5 -38
- data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000094.html +5 -23
- data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000095.html +16 -60
- data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000096.html +51 -0
- data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000097.html +36 -0
- data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000098.html +83 -0
- data/doc/rdoc/classes/RequestLog/Access.html +5 -5
- data/doc/rdoc/classes/RequestLog/Access.src/{M000139.html → M000142.html} +0 -0
- data/doc/rdoc/classes/RequestLog/Files.html +5 -5
- data/doc/rdoc/classes/RequestLog/Files.src/{M000140.html → M000143.html} +0 -0
- data/doc/rdoc/classes/RequestLog/Objects.html +5 -5
- data/doc/rdoc/classes/RequestLog/Objects.src/{M000142.html → M000145.html} +0 -0
- data/doc/rdoc/classes/RequestLog/Params.html +5 -5
- data/doc/rdoc/classes/RequestLog/Params.src/{M000143.html → M000146.html} +0 -0
- data/doc/rdoc/classes/RequestLog/Threads.html +5 -5
- data/doc/rdoc/classes/RequestLog/Threads.src/{M000141.html → M000144.html} +0 -0
- data/doc/rdoc/created.rid +1 -1
- data/doc/rdoc/files/ext/http11/http11_c.html +1 -1
- data/doc/rdoc/files/lib/mongrel/camping_rb.html +2 -2
- data/doc/rdoc/files/lib/mongrel/cgi_rb.html +2 -2
- data/doc/rdoc/files/lib/mongrel/command_rb.html +2 -2
- data/doc/rdoc/files/lib/mongrel/debug_rb.html +2 -2
- data/doc/rdoc/files/lib/mongrel/handlers_rb.html +1 -1
- data/doc/rdoc/files/lib/mongrel/init_rb.html +2 -2
- data/doc/rdoc/files/lib/mongrel/rails_rb.html +2 -2
- data/doc/rdoc/files/lib/mongrel/stats_rb.html +2 -2
- data/doc/rdoc/files/lib/mongrel/tcphack_rb.html +2 -2
- data/doc/rdoc/files/lib/mongrel_rb.html +2 -2
- data/doc/rdoc/fr_class_index.html +1 -0
- data/doc/rdoc/fr_method_index.html +125 -122
- data/ext/http11/http11.c +2 -2
- data/ext/http11/http11_parser.c +1 -1
- data/ext/http11/http11_parser.h +1 -1
- data/lib/mongrel.rb +70 -53
- data/lib/mongrel/camping.rb +1 -1
- data/lib/mongrel/cgi.rb +1 -1
- data/lib/mongrel/command.rb +1 -1
- data/lib/mongrel/debug.rb +1 -1
- data/lib/mongrel/handlers.rb +10 -1
- data/lib/mongrel/init.rb +1 -1
- data/lib/mongrel/rails.rb +1 -1
- data/lib/mongrel/stats.rb +1 -1
- data/lib/mongrel/tcphack.rb +1 -1
- data/test/test_command.rb +1 -1
- data/test/test_conditional.rb +1 -1
- data/test/test_configurator.rb +1 -1
- data/test/test_debug.rb +1 -1
- data/test/test_handlers.rb +1 -1
- data/test/test_http11.rb +1 -1
- data/test/test_response.rb +1 -1
- data/test/test_stats.rb +1 -1
- data/test/test_uriclassifier.rb +1 -1
- data/test/test_ws.rb +1 -1
- data/tools/trickletest.rb +28 -20
- metadata +50 -46
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000098.html +0 -24
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000099.html +0 -47
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000100.html +0 -34
- data/doc/rdoc/classes/Mongrel/Camping/CampingHandler.src/M000048.html +0 -18
- data/doc/rdoc/classes/Mongrel/Command/Base.src/M000025.html +0 -24
- data/doc/rdoc/classes/Mongrel/Command/Registry.src/M000038.html +0 -20
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000107.html +0 -29
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000108.html +0 -31
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000109.html +0 -20
- data/doc/rdoc/classes/Mongrel/DirHandler.src/M000057.html +0 -21
- data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000135.html +0 -52
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000078.html +0 -25
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000079.html +0 -20
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000080.html +0 -25
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000063.html +0 -25
- data/doc/rdoc/classes/Mongrel/Rails/RailsConfigurator.src/M000041.html +0 -39
- data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/M000044.html +0 -22
- data/doc/rdoc/classes/Mongrel/StatusHandler.src/M000072.html +0 -18
- data/doc/rdoc/classes/Mongrel/StatusHandler.src/M000073.html +0 -24
- data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000091.html +0 -18
- data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000092.html +0 -39
data/ext/http11/http11.c
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* Mongrel Web Server - A Mostly Ruby
|
|
1
|
+
/* Mongrel Web Server - A Mostly Ruby HTTP server and Library
|
|
2
2
|
*
|
|
3
3
|
* Copyright (C) 2005 Zed A. Shaw zedshaw AT zedshaw dot com
|
|
4
4
|
*
|
|
@@ -554,7 +554,7 @@ void Init_http11()
|
|
|
554
554
|
DEF_GLOBAL(server_protocol, "SERVER_PROTOCOL");
|
|
555
555
|
DEF_GLOBAL(server_protocol_value, "HTTP/1.1");
|
|
556
556
|
DEF_GLOBAL(http_host, "HTTP_HOST");
|
|
557
|
-
DEF_GLOBAL(mongrel_version, "Mongrel 0.3.13.
|
|
557
|
+
DEF_GLOBAL(mongrel_version, "Mongrel 0.3.13.2");
|
|
558
558
|
DEF_GLOBAL(server_software, "SERVER_SOFTWARE");
|
|
559
559
|
DEF_GLOBAL(port_80, "80");
|
|
560
560
|
|
data/ext/http11/http11_parser.c
CHANGED
data/ext/http11/http11_parser.h
CHANGED
data/lib/mongrel.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Mongrel Web Server - A Mostly Ruby
|
|
1
|
+
# Mongrel Web Server - A Mostly Ruby HTTP server and Library
|
|
2
2
|
#
|
|
3
3
|
# Copyright (C) 2005 Zed A. Shaw zedshaw AT zedshaw dot com
|
|
4
4
|
#
|
|
@@ -28,8 +28,7 @@ require 'mongrel/tcphack'
|
|
|
28
28
|
require 'yaml'
|
|
29
29
|
require 'time'
|
|
30
30
|
require 'rubygems'
|
|
31
|
-
require 'etc'
|
|
32
|
-
|
|
31
|
+
require 'etc'
|
|
33
32
|
|
|
34
33
|
begin
|
|
35
34
|
require 'sendfile'
|
|
@@ -62,8 +61,10 @@ module Mongrel
|
|
|
62
61
|
|
|
63
62
|
|
|
64
63
|
# Used to stop the HttpServer via Thread.raise.
|
|
65
|
-
class StopServer < Exception
|
|
66
|
-
|
|
64
|
+
class StopServer < Exception; end
|
|
65
|
+
|
|
66
|
+
# Thrown at a thread when it is timed out.
|
|
67
|
+
class TimeoutError < Exception; end
|
|
67
68
|
|
|
68
69
|
|
|
69
70
|
# Every standard HTTP code mapped to the appropriate message. These are
|
|
@@ -131,7 +132,7 @@ module Mongrel
|
|
|
131
132
|
# The original URI requested by the client. Passed to URIClassifier to build PATH_INFO and SCRIPT_NAME.
|
|
132
133
|
REQUEST_URI='REQUEST_URI'.freeze
|
|
133
134
|
|
|
134
|
-
MONGREL_VERSION="0.3.13.
|
|
135
|
+
MONGREL_VERSION="0.3.13.2".freeze
|
|
135
136
|
|
|
136
137
|
# TODO: this use of a base for tempfiles needs to be looked at for security problems
|
|
137
138
|
MONGREL_TMP_BASE="mongrel".freeze
|
|
@@ -183,7 +184,12 @@ module Mongrel
|
|
|
183
184
|
#
|
|
184
185
|
# The HttpRequest.initialize method will convert any request that is larger than
|
|
185
186
|
# Const::MAX_BODY into a Tempfile and use that as the body. Otherwise it uses
|
|
186
|
-
# a StringIO object. To be safe, you should assume it works like a file.
|
|
187
|
+
# a StringIO object. To be safe, you should assume it works like a file.
|
|
188
|
+
#
|
|
189
|
+
# The HttpHandler.request_notify system is implemented by having HttpRequest call
|
|
190
|
+
# HttpHandler.request_begins, HttpHandler.request_progress, HttpHandler.process during
|
|
191
|
+
# the IO processing. This adds a small amount of overhead but lets you implement
|
|
192
|
+
# finer controlled handlers and filters.
|
|
187
193
|
class HttpRequest
|
|
188
194
|
attr_reader :body, :params
|
|
189
195
|
|
|
@@ -192,11 +198,12 @@ module Mongrel
|
|
|
192
198
|
# body data into the HttpRequest.body attribute.
|
|
193
199
|
#
|
|
194
200
|
# TODO: Implement tempfile removal when the request is done.
|
|
195
|
-
def initialize(params, initial_body, socket)
|
|
201
|
+
def initialize(params, initial_body, socket, notifier)
|
|
196
202
|
@params = params
|
|
197
203
|
@socket = socket
|
|
198
204
|
|
|
199
205
|
clen = params[Const::CONTENT_LENGTH].to_i - initial_body.length
|
|
206
|
+
total = clen
|
|
200
207
|
|
|
201
208
|
if clen > Const::MAX_BODY
|
|
202
209
|
@body = Tempfile.new(Const::MONGREL_TMP_BASE)
|
|
@@ -207,24 +214,27 @@ module Mongrel
|
|
|
207
214
|
|
|
208
215
|
begin
|
|
209
216
|
@body.write(initial_body)
|
|
217
|
+
notifier.request_begins(params) if notifier
|
|
210
218
|
|
|
211
219
|
# write the odd sized chunk first
|
|
212
220
|
clen -= @body.write(@socket.read(clen % Const::CHUNK_SIZE))
|
|
221
|
+
notifier.request_progress(params, clen, total) if notifier
|
|
213
222
|
|
|
214
223
|
# then stream out nothing but perfectly sized chunks
|
|
215
|
-
while clen > 0
|
|
224
|
+
while clen > 0 and !@socket.closed?
|
|
216
225
|
data = @socket.read(Const::CHUNK_SIZE)
|
|
217
226
|
# have to do it this way since @socket.eof? causes it to block
|
|
218
227
|
raise "Socket closed or read failure" if not data or data.length != Const::CHUNK_SIZE
|
|
219
228
|
clen -= @body.write(data)
|
|
220
229
|
# ASSUME: we are writing to a disk and these writes always write the requested amount
|
|
230
|
+
notifier.request_progress(params, clen, total) if notifier
|
|
221
231
|
end
|
|
222
232
|
|
|
223
233
|
# rewind to keep the world happy
|
|
224
234
|
@body.rewind
|
|
225
235
|
rescue Object
|
|
226
236
|
# any errors means we should delete the file, including if the file is dumped
|
|
227
|
-
|
|
237
|
+
@socket.close unless @socket.closed?
|
|
228
238
|
@body.delete if @body.class == Tempfile
|
|
229
239
|
@body = nil # signals that there was a problem
|
|
230
240
|
end
|
|
@@ -454,7 +464,7 @@ module Mongrel
|
|
|
454
464
|
|
|
455
465
|
end
|
|
456
466
|
|
|
457
|
-
# This is the main driver of Mongrel, while the
|
|
467
|
+
# This is the main driver of Mongrel, while the Mongrel::HttpParser and Mongrel::URIClassifier
|
|
458
468
|
# make up the majority of how the server functions. It's a very simple class that just
|
|
459
469
|
# has a thread accepting connections and a simple HttpServer.process_client function
|
|
460
470
|
# to do the heavy lifting with the IO and Ruby.
|
|
@@ -517,7 +527,7 @@ module Mongrel
|
|
|
517
527
|
begin
|
|
518
528
|
parser = HttpParser.new
|
|
519
529
|
params = {}
|
|
520
|
-
|
|
530
|
+
request = nil
|
|
521
531
|
data = client.readpartial(Const::CHUNK_SIZE)
|
|
522
532
|
nparsed = 0
|
|
523
533
|
|
|
@@ -535,15 +545,12 @@ module Mongrel
|
|
|
535
545
|
params[Const::PATH_INFO] = path_info
|
|
536
546
|
params[Const::SCRIPT_NAME] = script_name
|
|
537
547
|
params[Const::REMOTE_ADDR] = params[Const::HTTP_X_FORWARDED_FOR] || client.peeraddr.last
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
if handlers[0].request_notify
|
|
541
|
-
# this first handler wants to be notified when the process starts
|
|
542
|
-
handlers[0].request_begins(params)
|
|
543
|
-
end
|
|
548
|
+
notifier = handlers[0].request_notify ? handlers[0] : nil
|
|
544
549
|
|
|
545
550
|
# TODO: Find a faster/better way to carve out the range, preferably without copying.
|
|
546
|
-
|
|
551
|
+
data = data[nparsed ... data.length] || ""
|
|
552
|
+
|
|
553
|
+
request = HttpRequest.new(params, data, client, notifier)
|
|
547
554
|
|
|
548
555
|
# in the case of large file uploads the user could close the socket, so skip those requests
|
|
549
556
|
break if request.body == nil # nil signals from HttpRequest::initialize that the request was aborted
|
|
@@ -563,7 +570,6 @@ module Mongrel
|
|
|
563
570
|
end
|
|
564
571
|
else
|
|
565
572
|
# Didn't find it, return a stock 404 response.
|
|
566
|
-
# TODO: Implement customer 404 files (but really they should use a real web server).
|
|
567
573
|
client.write(Const::ERROR_404_RESPONSE)
|
|
568
574
|
end
|
|
569
575
|
|
|
@@ -580,27 +586,46 @@ module Mongrel
|
|
|
580
586
|
# ignored
|
|
581
587
|
rescue HttpParserError
|
|
582
588
|
STDERR.puts "#{Time.now}: BAD CLIENT (#{params[Const::HTTP_X_FORWARDED_FOR] || client.peeraddr.last}): #$!"
|
|
583
|
-
rescue
|
|
589
|
+
rescue Errno::EMFILE
|
|
590
|
+
reap_dead_workers('too many files')
|
|
591
|
+
rescue Object
|
|
584
592
|
STDERR.puts "#{Time.now}: ERROR: #$!"
|
|
585
|
-
STDERR.puts details.backtrace.join("\n")
|
|
586
593
|
ensure
|
|
587
594
|
client.close unless client.closed?
|
|
595
|
+
request.body.delete if request and request.body.class == Tempfile
|
|
588
596
|
end
|
|
589
597
|
end
|
|
590
598
|
|
|
591
599
|
# Used internally to kill off any worker threads that have taken too long
|
|
592
600
|
# to complete processing. Only called if there are too many processors
|
|
593
|
-
# currently servicing.
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
601
|
+
# currently servicing. It returns the count of workers still active
|
|
602
|
+
# after the reap is done. It only runs if there are workers to reap.
|
|
603
|
+
def reap_dead_workers(reason='unknown')
|
|
604
|
+
if @workers.list.length > 0
|
|
605
|
+
STDERR.puts "#{Time.now}: Reaping #{@workers.list.length} threads for slow workers because of '#{reason}'"
|
|
606
|
+
mark = Time.now
|
|
607
|
+
@workers.list.each do |w|
|
|
608
|
+
w[:started_on] = Time.now if not w[:started_on]
|
|
609
|
+
|
|
610
|
+
if mark - w[:started_on] > @death_time + @timeout
|
|
611
|
+
STDERR.puts "Thread #{w.inspect} is too old, killing."
|
|
612
|
+
w.raise(TimeoutError.new("Timed out thread."))
|
|
613
|
+
end
|
|
602
614
|
end
|
|
603
615
|
end
|
|
616
|
+
|
|
617
|
+
return @workers.list.length
|
|
618
|
+
end
|
|
619
|
+
|
|
620
|
+
# Performs a wait on all the currently running threads and kills any that take
|
|
621
|
+
# too long. Right now it just waits 60 seconds, but will expand this to
|
|
622
|
+
# allow setting. The @timeout setting does extend this waiting period by
|
|
623
|
+
# that much longer.
|
|
624
|
+
def graceful_shutdown
|
|
625
|
+
while reap_dead_workers("shutdown") > 0
|
|
626
|
+
STDERR.print "Waiting for #{@workers.list.length} requests to finish, could take #{@death_time + @timeout} seconds."
|
|
627
|
+
sleep @death_time / 10
|
|
628
|
+
end
|
|
604
629
|
end
|
|
605
630
|
|
|
606
631
|
|
|
@@ -618,14 +643,12 @@ module Mongrel
|
|
|
618
643
|
if worker_list.length >= @num_processors
|
|
619
644
|
STDERR.puts "Server overloaded with #{worker_list.length} processors (#@num_processors max). Dropping connection."
|
|
620
645
|
client.close
|
|
621
|
-
reap_dead_workers(
|
|
646
|
+
reap_dead_workers("max processors")
|
|
622
647
|
else
|
|
623
|
-
thread = Thread.new
|
|
624
|
-
process_client(client)
|
|
625
|
-
end
|
|
648
|
+
thread = Thread.new { process_client(client) }
|
|
626
649
|
|
|
650
|
+
thread.abort_on_exception = true
|
|
627
651
|
thread[:started_on] = Time.now
|
|
628
|
-
thread.priority=1
|
|
629
652
|
@workers.add(thread)
|
|
630
653
|
|
|
631
654
|
sleep @timeout/100 if @timeout > 0
|
|
@@ -634,22 +657,12 @@ module Mongrel
|
|
|
634
657
|
@socket.close if not @socket.closed?
|
|
635
658
|
break
|
|
636
659
|
rescue Errno::EMFILE
|
|
637
|
-
|
|
660
|
+
reap_dead_workers("too many open files")
|
|
638
661
|
sleep 0.5
|
|
639
662
|
end
|
|
640
663
|
end
|
|
641
664
|
|
|
642
|
-
|
|
643
|
-
# TODO: Allow for death time to be set if people ask for it.
|
|
644
|
-
@death_time = 10
|
|
645
|
-
shutdown_start = Time.now
|
|
646
|
-
|
|
647
|
-
while @workers.list.length > 0
|
|
648
|
-
waited_for = (Time.now - shutdown_start).ceil
|
|
649
|
-
STDERR.print "Shutdown waited #{waited_for} for #{@workers.list.length} requests, could take #{@death_time + @timeout} seconds.\r" if @workers.list.length > 0
|
|
650
|
-
sleep 1
|
|
651
|
-
reap_dead_workers(@workers.list)
|
|
652
|
-
end
|
|
665
|
+
graceful_shutdown
|
|
653
666
|
end
|
|
654
667
|
|
|
655
668
|
return @acceptor
|
|
@@ -746,8 +759,6 @@ module Mongrel
|
|
|
746
759
|
@needs_restart = false
|
|
747
760
|
@pid_file = defaults[:pid_file]
|
|
748
761
|
|
|
749
|
-
change_privilege(@defaults[:user], @defaults[:group])
|
|
750
|
-
|
|
751
762
|
if blk
|
|
752
763
|
cloaker(&blk).bind(self).call
|
|
753
764
|
end
|
|
@@ -812,6 +823,8 @@ module Mongrel
|
|
|
812
823
|
# * :port => Port to bind.
|
|
813
824
|
# * :num_processors => The maximum number of concurrent threads allowed. (950 default)
|
|
814
825
|
# * :timeout => 1/100th of a second timeout between requests. (10 is 1/10th, 0 is timeout)
|
|
826
|
+
# * :user => User to change to, must have :group as well.
|
|
827
|
+
# * :group => Group to change to, must have :user as well.
|
|
815
828
|
#
|
|
816
829
|
def listener(options={},&blk)
|
|
817
830
|
raise "Cannot call listener inside another listener block." if (@listener or @listener_name)
|
|
@@ -823,6 +836,10 @@ module Mongrel
|
|
|
823
836
|
@listener_name = "#{ops[:host]}:#{ops[:port]}"
|
|
824
837
|
@listeners[@listener_name] = @listener
|
|
825
838
|
|
|
839
|
+
if ops[:user] and ops[:group]
|
|
840
|
+
change_privilege(ops[:user], ops[:group])
|
|
841
|
+
end
|
|
842
|
+
|
|
826
843
|
# Does the actual cloaking operation to give the new implicit self.
|
|
827
844
|
if blk
|
|
828
845
|
cloaker(&blk).bind(self).call
|
|
@@ -972,7 +989,7 @@ module Mongrel
|
|
|
972
989
|
|
|
973
990
|
|
|
974
991
|
# This method should actually be called *outside* of the
|
|
975
|
-
# Configurator block so that you can control it. In
|
|
992
|
+
# Configurator block so that you can control it. In other words
|
|
976
993
|
# do it like: config.join.
|
|
977
994
|
def join
|
|
978
995
|
@listeners.values.each {|s| s.acceptor.join }
|
|
@@ -991,9 +1008,9 @@ module Mongrel
|
|
|
991
1008
|
# debug "/", what = [:rails]
|
|
992
1009
|
#
|
|
993
1010
|
# And it will only produce the log/mongrel_debug/rails.log file.
|
|
994
|
-
# Available options are: :object, :
|
|
1011
|
+
# Available options are: :object, :rails, :files, :threads, :params
|
|
995
1012
|
#
|
|
996
|
-
# NOTE: Use [:files] to get
|
|
1013
|
+
# NOTE: Use [:files] to get accesses dumped to stderr like with WEBrick.
|
|
997
1014
|
def debug(location, what = [:object, :rails, :files, :threads, :params])
|
|
998
1015
|
require 'mongrel/debug'
|
|
999
1016
|
handlers = {
|
data/lib/mongrel/camping.rb
CHANGED
data/lib/mongrel/cgi.rb
CHANGED
data/lib/mongrel/command.rb
CHANGED
data/lib/mongrel/debug.rb
CHANGED
data/lib/mongrel/handlers.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require 'mongrel/stats'
|
|
2
2
|
require 'zlib'
|
|
3
3
|
|
|
4
|
-
# Mongrel Web Server - A Mostly Ruby
|
|
4
|
+
# Mongrel Web Server - A Mostly Ruby HTTP server and Library
|
|
5
5
|
#
|
|
6
6
|
# Copyright (C) 2005 Zed A. Shaw zedshaw AT zedshaw dot com
|
|
7
7
|
#
|
|
@@ -41,6 +41,12 @@ module Mongrel
|
|
|
41
41
|
def request_begins(params)
|
|
42
42
|
end
|
|
43
43
|
|
|
44
|
+
# Called by Mongrel for each IO chunk that is received on the request socket
|
|
45
|
+
# from the client, allowing you to track the progress of the IO and monitor
|
|
46
|
+
# the input.
|
|
47
|
+
def request_progress(params, clen, total)
|
|
48
|
+
end
|
|
49
|
+
|
|
44
50
|
def process(request, response)
|
|
45
51
|
end
|
|
46
52
|
|
|
@@ -59,6 +65,9 @@ module Mongrel
|
|
|
59
65
|
def request_begins(params)
|
|
60
66
|
end
|
|
61
67
|
|
|
68
|
+
def request_progress(params, clen, total)
|
|
69
|
+
end
|
|
70
|
+
|
|
62
71
|
def initialize(options={})
|
|
63
72
|
@options = options
|
|
64
73
|
@header_only = false
|
data/lib/mongrel/init.rb
CHANGED
data/lib/mongrel/rails.rb
CHANGED
data/lib/mongrel/stats.rb
CHANGED
data/lib/mongrel/tcphack.rb
CHANGED
data/test/test_command.rb
CHANGED
data/test/test_conditional.rb
CHANGED
data/test/test_configurator.rb
CHANGED
data/test/test_debug.rb
CHANGED
data/test/test_handlers.rb
CHANGED
data/test/test_http11.rb
CHANGED
data/test/test_response.rb
CHANGED