mongrel 0.3.13.3 → 0.3.13.4
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 +5 -4
- data/bin/mongrel_rails +162 -169
- data/doc/rdoc/classes/IO.src/M000001.html +5 -5
- data/doc/rdoc/classes/IO.src/M000002.html +5 -5
- data/doc/rdoc/classes/Kernel.html +10 -10
- data/doc/rdoc/classes/Kernel.src/M000010.html +19 -0
- data/doc/rdoc/classes/Kernel.src/M000011.html +23 -0
- data/doc/rdoc/classes/Mongrel.html +27 -10
- data/doc/rdoc/classes/Mongrel/CGIWrapper.html +67 -54
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/{M000101.html → M000112.html} +11 -10
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/{M000102.html → M000113.html} +31 -31
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/{M000103.html → M000114.html} +20 -20
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000115.html +32 -0
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/{M000105.html → M000116.html} +11 -11
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/{M000106.html → M000117.html} +4 -4
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/{M000107.html → M000118.html} +4 -4
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/{M000108.html → M000119.html} +4 -4
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/{M000109.html → M000120.html} +5 -5
- data/doc/rdoc/classes/Mongrel/Camping.html +5 -5
- data/doc/rdoc/classes/Mongrel/Camping.src/{M000048.html → M000039.html} +0 -0
- data/doc/rdoc/classes/Mongrel/Camping/CampingHandler.html +10 -10
- data/doc/rdoc/classes/Mongrel/Camping/CampingHandler.src/{M000049.html → M000040.html} +0 -0
- data/doc/rdoc/classes/Mongrel/Camping/CampingHandler.src/{M000050.html → M000041.html} +0 -0
- data/doc/rdoc/classes/Mongrel/Command/Base.html +65 -65
- data/doc/rdoc/classes/Mongrel/Command/Base.src/M000016.html +24 -0
- data/doc/rdoc/classes/Mongrel/Command/Base.src/M000017.html +42 -0
- data/doc/rdoc/classes/Mongrel/Command/Base.src/M000018.html +18 -0
- data/doc/rdoc/classes/Mongrel/Command/Base.src/{M000029.html → M000019.html} +0 -0
- data/doc/rdoc/classes/Mongrel/Command/Base.src/{M000030.html → M000020.html} +0 -0
- data/doc/rdoc/classes/Mongrel/Command/Base.src/{M000031.html → M000021.html} +0 -0
- data/doc/rdoc/classes/Mongrel/Command/Base.src/{M000032.html → M000022.html} +0 -0
- data/doc/rdoc/classes/Mongrel/Command/Base.src/{M000033.html → M000023.html} +0 -0
- data/doc/rdoc/classes/Mongrel/Command/Base.src/{M000034.html → M000024.html} +0 -0
- data/doc/rdoc/classes/Mongrel/Command/Base.src/{M000035.html → M000025.html} +0 -0
- data/doc/rdoc/classes/Mongrel/Command/Base.src/M000026.html +11 -11
- data/doc/rdoc/classes/Mongrel/Command/Base.src/M000027.html +11 -29
- data/doc/rdoc/classes/Mongrel/Command/Base.src/M000028.html +5 -5
- data/doc/rdoc/classes/Mongrel/Command/Registry.html +15 -15
- data/doc/rdoc/classes/Mongrel/Command/Registry.src/{M000039.html → M000029.html} +0 -0
- data/doc/rdoc/classes/Mongrel/Command/Registry.src/{M000040.html → M000030.html} +10 -6
- data/doc/rdoc/classes/Mongrel/Command/Registry.src/M000031.html +58 -0
- data/doc/rdoc/classes/Mongrel/Configurator.html +115 -115
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000091.html +27 -0
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000092.html +31 -0
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000093.html +21 -0
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000094.html +20 -0
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000095.html +23 -0
- data/doc/rdoc/classes/Mongrel/Configurator.src/{M000115.html → M000096.html} +4 -4
- data/doc/rdoc/classes/Mongrel/Configurator.src/{M000116.html → M000097.html} +24 -24
- data/doc/rdoc/classes/Mongrel/Configurator.src/{M000117.html → M000098.html} +5 -5
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000099.html +39 -0
- data/doc/rdoc/classes/Mongrel/Configurator.src/{M000119.html → M000100.html} +19 -19
- data/doc/rdoc/classes/Mongrel/Configurator.src/{M000120.html → M000101.html} +4 -4
- data/doc/rdoc/classes/Mongrel/Configurator.src/{M000121.html → M000102.html} +10 -10
- data/doc/rdoc/classes/Mongrel/Configurator.src/{M000122.html → M000103.html} +5 -5
- data/doc/rdoc/classes/Mongrel/Configurator.src/{M000123.html → M000104.html} +4 -4
- data/doc/rdoc/classes/Mongrel/Configurator.src/{M000124.html → M000105.html} +8 -8
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000106.html +22 -0
- data/doc/rdoc/classes/Mongrel/Configurator.src/{M000126.html → M000107.html} +4 -4
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000108.html +34 -0
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000109.html +18 -0
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000110.html +23 -14
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000111.html +5 -18
- data/doc/rdoc/classes/Mongrel/Const.html +11 -6
- data/doc/rdoc/classes/Mongrel/DeflateFilter.html +10 -10
- data/doc/rdoc/classes/Mongrel/DeflateFilter.src/{M000099.html → M000121.html} +5 -5
- data/doc/rdoc/classes/Mongrel/DeflateFilter.src/{M000100.html → M000122.html} +14 -14
- data/doc/rdoc/classes/Mongrel/DirHandler.html +31 -31
- data/doc/rdoc/classes/Mongrel/DirHandler.src/{M000058.html → M000049.html} +0 -0
- data/doc/rdoc/classes/Mongrel/DirHandler.src/{M000059.html → M000050.html} +0 -0
- data/doc/rdoc/classes/Mongrel/DirHandler.src/{M000060.html → M000051.html} +12 -16
- data/doc/rdoc/classes/Mongrel/DirHandler.src/M000052.html +63 -0
- data/doc/rdoc/classes/Mongrel/DirHandler.src/{M000062.html → M000053.html} +25 -25
- data/doc/rdoc/classes/Mongrel/DirHandler.src/{M000063.html → M000054.html} +4 -4
- data/doc/rdoc/classes/Mongrel/Error404Handler.html +10 -10
- data/doc/rdoc/classes/Mongrel/Error404Handler.src/{M000131.html → M000123.html} +0 -0
- data/doc/rdoc/classes/Mongrel/Error404Handler.src/{M000132.html → M000124.html} +0 -0
- data/doc/rdoc/classes/Mongrel/HeaderOut.html +10 -10
- data/doc/rdoc/classes/Mongrel/HeaderOut.src/{M000072.html → M000064.html} +4 -4
- data/doc/rdoc/classes/Mongrel/HeaderOut.src/{M000073.html → M000065.html} +4 -4
- data/doc/rdoc/classes/Mongrel/HttpHandler.html +15 -15
- data/doc/rdoc/classes/Mongrel/HttpHandler.src/{M000078.html → M000070.html} +0 -0
- data/doc/rdoc/classes/Mongrel/HttpHandler.src/{M000079.html → M000071.html} +0 -0
- data/doc/rdoc/classes/Mongrel/HttpHandler.src/{M000080.html → M000072.html} +0 -0
- data/doc/rdoc/classes/Mongrel/HttpHandlerPlugin.html +20 -20
- data/doc/rdoc/classes/Mongrel/HttpHandlerPlugin.src/{M000022.html → M000012.html} +0 -0
- data/doc/rdoc/classes/Mongrel/HttpHandlerPlugin.src/{M000023.html → M000013.html} +0 -0
- data/doc/rdoc/classes/Mongrel/HttpHandlerPlugin.src/{M000024.html → M000014.html} +0 -0
- data/doc/rdoc/classes/Mongrel/HttpHandlerPlugin.src/{M000025.html → M000015.html} +0 -0
- data/doc/rdoc/classes/Mongrel/HttpParams.html +131 -0
- data/doc/rdoc/classes/Mongrel/HttpParser.html +35 -35
- data/doc/rdoc/classes/Mongrel/HttpParser.src/{M000051.html → M000042.html} +1 -1
- data/doc/rdoc/classes/Mongrel/HttpParser.src/{M000052.html → M000043.html} +1 -1
- data/doc/rdoc/classes/Mongrel/HttpParser.src/{M000053.html → M000044.html} +1 -1
- data/doc/rdoc/classes/Mongrel/HttpParser.src/{M000054.html → M000045.html} +3 -3
- data/doc/rdoc/classes/Mongrel/HttpParser.src/{M000055.html → M000046.html} +1 -1
- data/doc/rdoc/classes/Mongrel/HttpParser.src/{M000056.html → M000047.html} +1 -1
- data/doc/rdoc/classes/Mongrel/HttpParser.src/{M000057.html → M000048.html} +1 -1
- data/doc/rdoc/classes/Mongrel/HttpRequest.html +63 -24
- data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000130.html +47 -0
- data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000131.html +37 -0
- data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000132.html +29 -0
- data/doc/rdoc/classes/Mongrel/HttpRequest.src/{M000139.html → M000133.html} +6 -6
- data/doc/rdoc/classes/Mongrel/HttpRequest.src/{M000140.html → M000134.html} +6 -6
- data/doc/rdoc/classes/Mongrel/HttpRequest.src/{M000141.html → M000135.html} +18 -18
- data/doc/rdoc/classes/Mongrel/HttpResponse.html +66 -72
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000073.html +25 -0
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000074.html +20 -0
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000075.html +26 -0
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000076.html +22 -0
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/{M000085.html → M000077.html} +8 -8
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/{M000086.html → M000078.html} +8 -8
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000079.html +31 -0
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/{M000088.html → M000080.html} +7 -7
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000081.html +7 -12
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000082.html +7 -7
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000083.html +7 -12
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000084.html +5 -9
- data/doc/rdoc/classes/Mongrel/HttpServer.html +58 -43
- data/doc/rdoc/classes/Mongrel/HttpServer.src/{M000064.html → M000055.html} +11 -11
- data/doc/rdoc/classes/Mongrel/HttpServer.src/{M000065.html → M000056.html} +76 -72
- data/doc/rdoc/classes/Mongrel/HttpServer.src/{M000066.html → M000057.html} +18 -17
- data/doc/rdoc/classes/Mongrel/HttpServer.src/{M000067.html → M000058.html} +7 -7
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000059.html +22 -0
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000060.html +62 -0
- data/doc/rdoc/classes/Mongrel/HttpServer.src/{M000069.html → M000061.html} +20 -20
- data/doc/rdoc/classes/Mongrel/HttpServer.src/{M000070.html → M000062.html} +4 -4
- data/doc/rdoc/classes/Mongrel/HttpServer.src/{M000071.html → M000063.html} +8 -8
- data/doc/rdoc/classes/Mongrel/Rails/RailsConfigurator.html +15 -15
- data/doc/rdoc/classes/Mongrel/Rails/RailsConfigurator.src/{M000042.html → M000032.html} +23 -25
- data/doc/rdoc/classes/Mongrel/Rails/RailsConfigurator.src/{M000043.html → M000033.html} +11 -11
- data/doc/rdoc/classes/Mongrel/Rails/RailsConfigurator.src/{M000044.html → M000034.html} +12 -12
- data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.html +30 -15
- data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/{M000045.html → M000035.html} +9 -8
- data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/M000036.html +54 -0
- data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/M000037.html +21 -0
- data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/M000038.html +25 -0
- data/doc/rdoc/classes/Mongrel/RedirectHandler.html +10 -10
- data/doc/rdoc/classes/Mongrel/RedirectHandler.src/{M000136.html → M000128.html} +8 -8
- data/doc/rdoc/classes/Mongrel/RedirectHandler.src/{M000137.html → M000129.html} +13 -13
- data/doc/rdoc/classes/Mongrel/StatisticsFilter.html +16 -16
- data/doc/rdoc/classes/Mongrel/StatisticsFilter.src/M000125.html +24 -0
- data/doc/rdoc/classes/Mongrel/StatisticsFilter.src/{M000134.html → M000126.html} +10 -10
- data/doc/rdoc/classes/Mongrel/StatisticsFilter.src/{M000135.html → M000127.html} +4 -4
- data/doc/rdoc/classes/{Stats.html → Mongrel/Stats.html} +44 -60
- data/doc/rdoc/classes/Mongrel/Stats.src/M000136.html +19 -0
- data/doc/rdoc/classes/Mongrel/Stats.src/M000137.html +23 -0
- data/doc/rdoc/classes/Mongrel/Stats.src/M000138.html +26 -0
- data/doc/rdoc/classes/Mongrel/Stats.src/M000139.html +18 -0
- data/doc/rdoc/classes/{Stats.src/M000009.html → Mongrel/Stats.src/M000140.html} +6 -6
- data/doc/rdoc/classes/Mongrel/Stats.src/M000141.html +18 -0
- data/doc/rdoc/classes/Mongrel/Stats.src/M000142.html +23 -0
- data/doc/rdoc/classes/Mongrel/Stats.src/M000143.html +20 -0
- data/doc/rdoc/classes/Mongrel/StatusHandler.html +20 -20
- data/doc/rdoc/classes/Mongrel/StatusHandler.src/{M000074.html → M000066.html} +4 -4
- data/doc/rdoc/classes/Mongrel/StatusHandler.src/{M000075.html → M000067.html} +10 -10
- data/doc/rdoc/classes/Mongrel/StatusHandler.src/{M000076.html → M000068.html} +28 -28
- data/doc/rdoc/classes/Mongrel/StatusHandler.src/{M000077.html → M000069.html} +6 -6
- data/doc/rdoc/classes/Mongrel/URIClassifier.html +30 -30
- data/doc/rdoc/classes/Mongrel/URIClassifier.src/{M000093.html → M000085.html} +4 -4
- data/doc/rdoc/classes/Mongrel/URIClassifier.src/{M000094.html → M000086.html} +4 -4
- data/doc/rdoc/classes/Mongrel/URIClassifier.src/{M000095.html → M000087.html} +0 -0
- data/doc/rdoc/classes/Mongrel/URIClassifier.src/{M000096.html → M000088.html} +1 -1
- data/doc/rdoc/classes/Mongrel/URIClassifier.src/{M000097.html → M000089.html} +0 -0
- data/doc/rdoc/classes/Mongrel/URIClassifier.src/{M000098.html → M000090.html} +1 -1
- data/doc/rdoc/classes/MongrelDbg.html +26 -26
- data/doc/rdoc/classes/MongrelDbg.src/M000005.html +24 -0
- data/doc/rdoc/classes/MongrelDbg.src/{M000016.html → M000006.html} +6 -6
- data/doc/rdoc/classes/MongrelDbg.src/{M000017.html → M000007.html} +8 -8
- data/doc/rdoc/classes/MongrelDbg.src/{M000018.html → M000008.html} +7 -7
- data/doc/rdoc/classes/MongrelDbg.src/{M000019.html → M000009.html} +4 -4
- data/doc/rdoc/classes/RequestLog/Access.html +5 -5
- data/doc/rdoc/classes/RequestLog/Access.src/{M000142.html → M000144.html} +5 -5
- data/doc/rdoc/classes/RequestLog/Files.html +5 -5
- data/doc/rdoc/classes/RequestLog/Files.src/{M000143.html → M000145.html} +5 -5
- data/doc/rdoc/classes/RequestLog/Objects.html +12 -6
- data/doc/rdoc/classes/RequestLog/Objects.src/M000147.html +51 -0
- data/doc/rdoc/classes/RequestLog/Params.html +5 -5
- data/doc/rdoc/classes/RequestLog/Params.src/{M000146.html → M000148.html} +5 -5
- data/doc/rdoc/classes/RequestLog/Threads.html +5 -5
- data/doc/rdoc/classes/RequestLog/Threads.src/{M000144.html → M000146.html} +20 -20
- data/doc/rdoc/classes/{ObjectTracker.html → Sync.html} +26 -45
- data/doc/rdoc/created.rid +1 -1
- data/doc/rdoc/files/COPYING.html +1 -1
- data/doc/rdoc/files/LICENSE.html +1 -1
- data/doc/rdoc/files/README.html +1 -1
- data/doc/rdoc/files/ext/http11/http11_c.html +1 -1
- data/doc/rdoc/files/lib/mongrel/camping_rb.html +1 -1
- data/doc/rdoc/files/lib/mongrel/cgi_rb.html +1 -1
- data/doc/rdoc/files/lib/mongrel/command_rb.html +1 -1
- data/doc/rdoc/files/lib/mongrel/configurator_rb.html +111 -0
- data/doc/rdoc/files/lib/mongrel/debug_rb.html +1 -1
- data/doc/rdoc/files/lib/mongrel/handlers_rb.html +1 -1
- data/doc/rdoc/files/lib/mongrel/init_rb.html +1 -1
- data/doc/rdoc/files/lib/mongrel/rails_rb.html +2 -1
- data/doc/rdoc/files/lib/mongrel/stats_rb.html +1 -1
- data/doc/rdoc/files/lib/mongrel/tcphack_rb.html +1 -1
- data/doc/rdoc/files/lib/mongrel_rb.html +2 -4
- data/doc/rdoc/fr_class_index.html +3 -2
- data/doc/rdoc/fr_file_index.html +1 -0
- data/doc/rdoc/fr_method_index.html +144 -142
- data/ext/http11/http11.c +69 -52
- data/ext/http11/http11_parser.c +366 -282
- data/ext/http11/http11_parser.h +2 -0
- data/ext/http11/http11_parser.rl +192 -0
- data/lib/mongrel.rb +127 -433
- data/lib/mongrel/cgi.rb +19 -6
- data/lib/mongrel/command.rb +15 -3
- data/lib/mongrel/configurator.rb +374 -0
- data/lib/mongrel/debug.rb +47 -56
- data/lib/mongrel/handlers.rb +16 -20
- data/lib/mongrel/rails.rb +36 -20
- data/lib/mongrel/stats.rb +60 -58
- data/test/test_conditional.rb +37 -30
- data/test/test_http11.rb +14 -14
- data/test/test_stats.rb +2 -2
- data/test/test_ws.rb +4 -2
- data/tools/rakehelp.rb +4 -4
- metadata +262 -260
- data/doc/rdoc/classes/Kernel.src/M000020.html +0 -19
- data/doc/rdoc/classes/Kernel.src/M000021.html +0 -23
- data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000104.html +0 -27
- data/doc/rdoc/classes/Mongrel/Command/Base.src/M000036.html +0 -24
- data/doc/rdoc/classes/Mongrel/Command/Base.src/M000037.html +0 -24
- data/doc/rdoc/classes/Mongrel/Command/Base.src/M000038.html +0 -18
- data/doc/rdoc/classes/Mongrel/Command/Registry.src/M000041.html +0 -50
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000112.html +0 -20
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000113.html +0 -20
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000114.html +0 -23
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000118.html +0 -30
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000125.html +0 -25
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000127.html +0 -35
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000128.html +0 -18
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000129.html +0 -33
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000130.html +0 -18
- data/doc/rdoc/classes/Mongrel/DirHandler.src/M000061.html +0 -63
- data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000138.html +0 -56
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000087.html +0 -31
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000089.html +0 -20
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000090.html +0 -20
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000091.html +0 -20
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000092.html +0 -18
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000068.html +0 -50
- data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/M000046.html +0 -51
- data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/M000047.html +0 -23
- data/doc/rdoc/classes/Mongrel/StatisticsFilter.src/M000133.html +0 -24
- data/doc/rdoc/classes/MongrelDbg.src/M000015.html +0 -19
- data/doc/rdoc/classes/ObjectTracker.src/M000013.html +0 -27
- data/doc/rdoc/classes/ObjectTracker.src/M000014.html +0 -44
- data/doc/rdoc/classes/RequestLog/Objects.src/M000145.html +0 -19
- data/doc/rdoc/classes/Stats.src/M000005.html +0 -19
- data/doc/rdoc/classes/Stats.src/M000006.html +0 -23
- data/doc/rdoc/classes/Stats.src/M000007.html +0 -26
- data/doc/rdoc/classes/Stats.src/M000008.html +0 -18
- data/doc/rdoc/classes/Stats.src/M000010.html +0 -18
- data/doc/rdoc/classes/Stats.src/M000011.html +0 -23
- data/doc/rdoc/classes/Stats.src/M000012.html +0 -20
- data/lib/http11.so +0 -0
data/lib/mongrel/debug.rb
CHANGED
|
@@ -8,15 +8,22 @@ require 'logger'
|
|
|
8
8
|
require 'set'
|
|
9
9
|
require 'socket'
|
|
10
10
|
|
|
11
|
+
|
|
12
|
+
|
|
11
13
|
$mongrel_debugging=true
|
|
12
14
|
|
|
13
15
|
module MongrelDbg
|
|
14
16
|
SETTINGS = { :tracing => {}}
|
|
15
17
|
LOGGING = { }
|
|
16
18
|
|
|
17
|
-
def MongrelDbg::configure(log_dir = "log
|
|
19
|
+
def MongrelDbg::configure(log_dir = File.join("log","mongrel_debug"))
|
|
18
20
|
Dir.mkdir(log_dir) if not File.exist?(log_dir)
|
|
19
21
|
@log_dir = log_dir
|
|
22
|
+
$objects_out=open(File.join("log","mongrel_debug","objects.log"),"w")
|
|
23
|
+
$objects_out.puts "run,classname,last,count,delta,lenmean,lensd,lenmax"
|
|
24
|
+
$objects_out.sync = true
|
|
25
|
+
$last_stat = nil
|
|
26
|
+
$run_count = 0
|
|
20
27
|
end
|
|
21
28
|
|
|
22
29
|
|
|
@@ -47,53 +54,6 @@ module MongrelDbg
|
|
|
47
54
|
end
|
|
48
55
|
|
|
49
56
|
|
|
50
|
-
module ObjectTracker
|
|
51
|
-
@active_objects = nil
|
|
52
|
-
|
|
53
|
-
def ObjectTracker.configure
|
|
54
|
-
@active_objects = Set.new
|
|
55
|
-
|
|
56
|
-
ObjectSpace.each_object do |obj|
|
|
57
|
-
begin
|
|
58
|
-
# believe it or not, some idiots actually alter the object_id method
|
|
59
|
-
@active_objects << obj.object_id
|
|
60
|
-
rescue Object
|
|
61
|
-
# skip this one, he's an idiot
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
def ObjectTracker.sample
|
|
67
|
-
ospace = Set.new
|
|
68
|
-
counts = {}
|
|
69
|
-
|
|
70
|
-
ObjectSpace.each_object do |obj|
|
|
71
|
-
begin
|
|
72
|
-
ospace << obj.object_id
|
|
73
|
-
counts[obj.class] ||= 0
|
|
74
|
-
counts[obj.class] += 1
|
|
75
|
-
rescue Object
|
|
76
|
-
# skip since object_id can magically get parameters
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
dead_objects = @active_objects - ospace
|
|
81
|
-
new_objects = ospace - @active_objects
|
|
82
|
-
live_objects = ospace & @active_objects
|
|
83
|
-
|
|
84
|
-
MongrelDbg::trace(:objects, "COUNTS: #{dead_objects.length},#{new_objects.length},#{live_objects.length}")
|
|
85
|
-
|
|
86
|
-
if MongrelDbg::tracing? :objects
|
|
87
|
-
top_20 = counts.sort{|a,b| b[1] <=> a[1]}[0..20]
|
|
88
|
-
MongrelDbg::trace(:objects,"TOP 20: #{top_20.inspect}")
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
@active_objects = live_objects + new_objects
|
|
92
|
-
|
|
93
|
-
[@active_objects, top_20]
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
end
|
|
97
57
|
|
|
98
58
|
$open_files = {}
|
|
99
59
|
|
|
@@ -157,20 +117,51 @@ module RequestLog
|
|
|
157
117
|
|
|
158
118
|
end
|
|
159
119
|
|
|
120
|
+
# stolen from Robert Klemme
|
|
160
121
|
class Objects < GemPlugin::Plugin "/handlers"
|
|
161
122
|
include Mongrel::HttpHandlerPlugin
|
|
162
|
-
|
|
163
|
-
def process(request,
|
|
164
|
-
|
|
165
|
-
|
|
123
|
+
|
|
124
|
+
def process(request,response)
|
|
125
|
+
begin
|
|
126
|
+
stats = Hash.new(0)
|
|
127
|
+
lengths = {}
|
|
128
|
+
ObjectSpace.each_object do |o|
|
|
129
|
+
begin
|
|
130
|
+
if o.respond_to? :length
|
|
131
|
+
len = o.length
|
|
132
|
+
lengths[o.class] ||= Mongrel::Stats.new(o.class)
|
|
133
|
+
lengths[o.class].sample(len)
|
|
134
|
+
end
|
|
135
|
+
rescue Object
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
stats[o.class] += 1
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
stats.sort {|(k1,v1),(k2,v2)| v2 <=> v1}.each do |k,v|
|
|
142
|
+
if $last_stat
|
|
143
|
+
delta = v - $last_stat[k]
|
|
144
|
+
if v > 10 and delta != 0
|
|
145
|
+
if lengths[k]
|
|
146
|
+
$objects_out.printf "%d,%s,%d,%d,%d,%f,%f,%f\n", $run_count, k, $last_stat[k], v, delta,lengths[k].mean,lengths[k].sd,lengths[k].max
|
|
147
|
+
else
|
|
148
|
+
$objects_out.printf "%d,%s,%d,%d,%d,,,\n", $run_count, k, $last_stat[k], v, delta
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
$run_count += 1
|
|
155
|
+
$last_stat = stats
|
|
156
|
+
rescue Object
|
|
157
|
+
STDERR.puts "object.log ERROR: #$!"
|
|
158
|
+
end
|
|
166
159
|
end
|
|
167
|
-
|
|
168
160
|
end
|
|
169
|
-
|
|
170
161
|
|
|
171
162
|
class Params < GemPlugin::Plugin "/handlers"
|
|
172
163
|
include Mongrel::HttpHandlerPlugin
|
|
173
|
-
|
|
164
|
+
|
|
174
165
|
def process(request, response)
|
|
175
166
|
MongrelDbg::trace(:rails, "#{Time.now} REQUEST #{request.params['PATH_INFO']}")
|
|
176
167
|
MongrelDbg::trace(:rails, request.params.to_yaml)
|
|
@@ -180,7 +171,7 @@ module RequestLog
|
|
|
180
171
|
|
|
181
172
|
class Threads < GemPlugin::Plugin "/handlers"
|
|
182
173
|
include Mongrel::HttpHandlerPlugin
|
|
183
|
-
|
|
174
|
+
|
|
184
175
|
def process(request, response)
|
|
185
176
|
MongrelDbg::trace(:threads, "#{Time.now} REQUEST #{request.params['PATH_INFO']}")
|
|
186
177
|
ObjectSpace.each_object do |obj|
|
data/lib/mongrel/handlers.rb
CHANGED
|
@@ -173,14 +173,10 @@ module Mongrel
|
|
|
173
173
|
head[Const::CONTENT_TYPE] = "text/html"
|
|
174
174
|
out << "<html><head><title>Directory Listing</title></head><body>"
|
|
175
175
|
Dir.entries(dir).each do |child|
|
|
176
|
-
child = HttpRequest.unescape(child)
|
|
177
176
|
next if child == "."
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
else
|
|
182
|
-
out << "<a href=\"#{base}/#{child}/\">#{child}</a><br/>"
|
|
183
|
-
end
|
|
177
|
+
out << "<a href=\"#{base}/#{ HttpRequest.escape(child)}\">"
|
|
178
|
+
out << (child == ".." ? "Up to parent.." : child)
|
|
179
|
+
out << "</a><br/>"
|
|
184
180
|
end
|
|
185
181
|
out << "</body></html>"
|
|
186
182
|
end
|
|
@@ -203,18 +199,18 @@ module Mongrel
|
|
|
203
199
|
# Calculated the same as apache, not sure how well the works on win32
|
|
204
200
|
etag = Const::ETAG_FORMAT % [mtime.to_i, stat.size, stat.ino]
|
|
205
201
|
|
|
206
|
-
|
|
202
|
+
modified_since = request.params[Const::HTTP_IF_MODIFIED_SINCE]
|
|
207
203
|
none_match = request.params[Const::HTTP_IF_NONE_MATCH]
|
|
208
204
|
|
|
209
205
|
# test to see if this is a conditional request, and test if
|
|
210
206
|
# the response would be identical to the last response
|
|
211
207
|
same_response = case
|
|
212
|
-
when
|
|
213
|
-
when
|
|
214
|
-
when
|
|
215
|
-
when none_match
|
|
216
|
-
when none_match
|
|
217
|
-
else
|
|
208
|
+
when modified_since && !last_response_time = Time.httpdate(modified_since) rescue nil : false
|
|
209
|
+
when modified_since && last_response_time > Time.now : false
|
|
210
|
+
when modified_since && mtime > last_response_time : false
|
|
211
|
+
when none_match && none_match == '*' : false
|
|
212
|
+
when none_match && !none_match.strip.split(/\s*,\s*/).include?(etag) : false
|
|
213
|
+
else modified_since || none_match # validation successful if we get this far and at least one of the header exists
|
|
218
214
|
end
|
|
219
215
|
|
|
220
216
|
header = response.header
|
|
@@ -238,7 +234,7 @@ module Mongrel
|
|
|
238
234
|
response.send_header
|
|
239
235
|
|
|
240
236
|
if not header_only
|
|
241
|
-
response.send_file(req_path)
|
|
237
|
+
response.send_file(req_path, stat.size < Const::CHUNK_SIZE * 2)
|
|
242
238
|
end
|
|
243
239
|
end
|
|
244
240
|
end
|
|
@@ -328,11 +324,11 @@ module Mongrel
|
|
|
328
324
|
def initialize(ops={})
|
|
329
325
|
@sample_rate = ops[:sample_rate] || 300
|
|
330
326
|
|
|
331
|
-
@processors = Stats.new("processors")
|
|
332
|
-
@reqsize = Stats.new("request Kb")
|
|
333
|
-
@headcount = Stats.new("req param count")
|
|
334
|
-
@respsize = Stats.new("response Kb")
|
|
335
|
-
@interreq = Stats.new("inter-request time")
|
|
327
|
+
@processors = Mongrel::Stats.new("processors")
|
|
328
|
+
@reqsize = Mongrel::Stats.new("request Kb")
|
|
329
|
+
@headcount = Mongrel::Stats.new("req param count")
|
|
330
|
+
@respsize = Mongrel::Stats.new("response Kb")
|
|
331
|
+
@interreq = Mongrel::Stats.new("inter-request time")
|
|
336
332
|
end
|
|
337
333
|
|
|
338
334
|
|
data/lib/mongrel/rails.rb
CHANGED
|
@@ -6,6 +6,12 @@
|
|
|
6
6
|
|
|
7
7
|
require 'mongrel'
|
|
8
8
|
require 'cgi'
|
|
9
|
+
require 'sync'
|
|
10
|
+
|
|
11
|
+
class Sync
|
|
12
|
+
# modified to open the waiting list for reporting purposes
|
|
13
|
+
attr_accessor :sync_waiting
|
|
14
|
+
end
|
|
9
15
|
|
|
10
16
|
module Mongrel
|
|
11
17
|
module Rails
|
|
@@ -36,7 +42,8 @@ module Mongrel
|
|
|
36
42
|
|
|
37
43
|
def initialize(dir, mime_map = {})
|
|
38
44
|
@files = Mongrel::DirHandler.new(dir,false)
|
|
39
|
-
@guard =
|
|
45
|
+
@guard = Sync.new
|
|
46
|
+
@tick = Time.now
|
|
40
47
|
|
|
41
48
|
# register the requested mime types
|
|
42
49
|
mime_map.each {|k,v| Mongrel::DirHandler::add_mime_type(k,v) }
|
|
@@ -49,7 +56,9 @@ module Mongrel
|
|
|
49
56
|
# * If it exists at PATH_INFO+".html" exists then serve that.
|
|
50
57
|
# * Finally, construct a Mongrel::CGIWrapper and run Dispatcher.dispatch to have Rails go.
|
|
51
58
|
def process(request, response)
|
|
52
|
-
|
|
59
|
+
if response.socket.closed?
|
|
60
|
+
return
|
|
61
|
+
end
|
|
53
62
|
|
|
54
63
|
path_info = request.params[Mongrel::Const::PATH_INFO]
|
|
55
64
|
page_cached = path_info + ".html"
|
|
@@ -59,41 +68,50 @@ module Mongrel
|
|
|
59
68
|
# File exists as-is so serve it up
|
|
60
69
|
@files.process(request,response)
|
|
61
70
|
elsif get_or_head and @files.can_serve(page_cached)
|
|
62
|
-
# possible cached page, serve it up
|
|
71
|
+
# possible cached page, serve it up
|
|
63
72
|
request.params[Mongrel::Const::PATH_INFO] = page_cached
|
|
64
73
|
@files.process(request,response)
|
|
65
74
|
else
|
|
66
75
|
begin
|
|
67
76
|
cgi = Mongrel::CGIWrapper.new(request, response)
|
|
68
77
|
cgi.handler = self
|
|
78
|
+
# we don't want the output to be really final until we're out of the lock
|
|
79
|
+
cgi.default_really_final = false
|
|
69
80
|
|
|
70
|
-
|
|
71
|
-
@guard.lock unless ActionController::Base.allow_concurrency
|
|
81
|
+
log_threads_waiting_for(request.params["PATH_INFO"]) if $mongrel_debug_client
|
|
72
82
|
|
|
73
|
-
|
|
83
|
+
@guard.synchronize(:EX) {
|
|
84
|
+
Dispatcher.dispatch(cgi, ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS, response.body)
|
|
85
|
+
}
|
|
74
86
|
|
|
75
87
|
# This finalizes the output using the proper HttpResponse way
|
|
76
|
-
cgi.out {""}
|
|
88
|
+
cgi.out("text/html",true) {""}
|
|
77
89
|
rescue Errno::EPIPE
|
|
78
|
-
|
|
90
|
+
response.socket.close
|
|
79
91
|
rescue Object => rails_error
|
|
80
|
-
STDERR.puts "Error calling Dispatcher.dispatch #{rails_error.inspect}"
|
|
92
|
+
STDERR.puts "#{Time.now}: Error calling Dispatcher.dispatch #{rails_error.inspect}"
|
|
81
93
|
STDERR.puts rails_error.backtrace.join("\n")
|
|
82
|
-
ensure
|
|
83
|
-
@guard.unlock unless ActionController::Base.allow_concurrency
|
|
84
94
|
end
|
|
85
95
|
end
|
|
86
96
|
end
|
|
87
97
|
|
|
98
|
+
def log_threads_waiting_for(event)
|
|
99
|
+
if Time.now - @tick > 10
|
|
100
|
+
STDERR.puts "#{Time.now}: #{@guard.sync_waiting.length} threads sync_waiting for #{event}, #{self.listener.workers.list.length} still active in mongrel."
|
|
101
|
+
@tick = Time.now
|
|
102
|
+
end
|
|
103
|
+
end
|
|
88
104
|
|
|
89
105
|
# Does the internal reload for Rails. It might work for most cases, but
|
|
90
106
|
# sometimes you get exceptions. In that case just do a real restart.
|
|
91
107
|
def reload!
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
108
|
+
begin
|
|
109
|
+
@guard.synchronize(:EX) {
|
|
110
|
+
$".replace $orig_dollar_quote
|
|
111
|
+
GC.start
|
|
112
|
+
Dispatcher.reset_application!
|
|
113
|
+
ActionController::Routing::Routes.reload
|
|
114
|
+
}
|
|
97
115
|
end
|
|
98
116
|
end
|
|
99
117
|
end
|
|
@@ -137,7 +155,6 @@ module Mongrel
|
|
|
137
155
|
ops[:docroot] ||= "public"
|
|
138
156
|
ops[:mime] ||= {}
|
|
139
157
|
|
|
140
|
-
|
|
141
158
|
$orig_dollar_quote = $".clone
|
|
142
159
|
ENV['RAILS_ENV'] = ops[:environment]
|
|
143
160
|
env_location = "#{ops[:cwd]}/config/environment"
|
|
@@ -145,9 +162,8 @@ module Mongrel
|
|
|
145
162
|
require 'dispatcher'
|
|
146
163
|
require 'mongrel/rails'
|
|
147
164
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
end
|
|
165
|
+
ActionController::AbstractRequest.relative_url_root = ops[:prefix] if ops[:prefix]
|
|
166
|
+
|
|
151
167
|
@rails_handler = RailsHandler.new(ops[:docroot], ops[:mime])
|
|
152
168
|
end
|
|
153
169
|
|
data/lib/mongrel/stats.rb
CHANGED
|
@@ -12,76 +12,78 @@
|
|
|
12
12
|
#
|
|
13
13
|
# It does all of this very fast and doesn't take up any memory since the samples
|
|
14
14
|
# are not stored but instead all the values are calculated on the fly.
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
module Mongrel
|
|
16
|
+
class Stats
|
|
17
|
+
attr_reader :sum, :sumsq, :n, :min, :max
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
def initialize(name)
|
|
20
|
+
@name = name
|
|
21
|
+
reset
|
|
22
|
+
end
|
|
22
23
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
24
|
+
# Resets the internal counters so you can start sampling again.
|
|
25
|
+
def reset
|
|
26
|
+
@sum = 0.0
|
|
27
|
+
@sumsq = 0.0
|
|
28
|
+
@last_time = Time.new
|
|
29
|
+
@n = 0.0
|
|
30
|
+
@min = 0.0
|
|
31
|
+
@max = 0.0
|
|
32
|
+
end
|
|
32
33
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
34
|
+
# Adds a sampling to the calculations.
|
|
35
|
+
def sample(s)
|
|
36
|
+
@sum += s
|
|
37
|
+
@sumsq += s * s
|
|
38
|
+
if @n == 0
|
|
39
|
+
@min = @max = s
|
|
40
|
+
else
|
|
41
|
+
@min = s if @min > s
|
|
42
|
+
@max = s if @max < s
|
|
43
|
+
end
|
|
44
|
+
@n+=1
|
|
42
45
|
end
|
|
43
|
-
@n+=1
|
|
44
|
-
end
|
|
45
46
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
# Dump this Stats object with an optional additional message.
|
|
48
|
+
def dump(msg = "", out=STDERR)
|
|
49
|
+
out.puts "#{msg}: #{self.to_s}"
|
|
50
|
+
end
|
|
50
51
|
|
|
51
|
-
|
|
52
|
-
|
|
52
|
+
# Returns a common display (used by dump)
|
|
53
|
+
def to_s
|
|
53
54
|
"[#{@name}]: SUM=%0.4f, SUMSQ=%0.4f, N=%0.4f, MEAN=%0.4f, SD=%0.4f, MIN=%0.4f, MAX=%0.4f" % [@sum, @sumsq, @n, mean, sd, @min, @max]
|
|
54
|
-
|
|
55
|
+
end
|
|
55
56
|
|
|
56
57
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
# Calculates and returns the mean for the data passed so far.
|
|
59
|
+
def mean
|
|
60
|
+
@sum / @n
|
|
61
|
+
end
|
|
61
62
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
63
|
+
# Calculates the standard deviation of the data so far.
|
|
64
|
+
def sd
|
|
65
|
+
# (sqrt( ((s).sumsq - ( (s).sum * (s).sum / (s).n)) / ((s).n-1) ))
|
|
66
|
+
begin
|
|
67
|
+
return Math.sqrt( (@sumsq - ( @sum * @sum / @n)) / (@n-1) )
|
|
68
|
+
rescue Errno::EDOM
|
|
69
|
+
return 0.0
|
|
70
|
+
end
|
|
69
71
|
end
|
|
70
|
-
end
|
|
71
72
|
|
|
72
73
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
74
|
+
# Adds a time delta between now and the last time you called this. This
|
|
75
|
+
# will give you the average time between two activities.
|
|
76
|
+
#
|
|
77
|
+
# An example is:
|
|
78
|
+
#
|
|
79
|
+
# t = Stats.new("do_stuff")
|
|
80
|
+
# 10000.times { do_stuff(); t.tick }
|
|
81
|
+
# t.dump("time")
|
|
82
|
+
#
|
|
83
|
+
def tick
|
|
84
|
+
now = Time.now
|
|
85
|
+
sample(now - @last_time)
|
|
86
|
+
@last_time = now
|
|
87
|
+
end
|
|
86
88
|
end
|
|
87
89
|
end
|